クライアントからサーバーにファイルを送信するための単純なサーバー/クライアント プログラムを作成しています。私はwinsock2を使用しています。毎回データを送信する容量を 5000 に制限しています。
クライアント側 (送信):
int iResult = 0;
int totalBytesSent = 0;
while (length > 0){
iResult = send( _connectSocket, data, MAX_TRANSIT_SIZE, 0 ); // MAX_TRANSIT_SIZE is 5000
if (iResult == SOCKET_ERROR) {
printf("send failed with error: %d\n", WSAGetLastError());
return closeSocket();
}
totalBytesSent += iResult;
length -= iResult;
//cout << "Data sent (" << iResult << " Bytes)" << endl;
}
cout << "Total Bytes Sent: (" << totalBytesSent << ")" << endl;
return 0;
サーバー側 (recv):
// Receive and send data
char recvbuf[MAX_DATA_SIZE];
int iResult = 0;
int totalBytesRead = 0;
// Receive until the peer shuts down the connection
do {
totalBytesRead += iResult;
iResult = recv(_clientSocket, recvbuf, MAX_DATA_SIZE, 0);
if (iResult > 0) {
//printf("RECEIVED DATA\n");
//printf("Bytes received: %d\n", iResult);
} else if (iResult == 0)
printf("Connection closing...\n");
else {
printf("recv failed: %d\n", WSAGetLastError());
closesocket(_clientSocket);
WSACleanup();
return 1;
}
} while (iResult > 0);
cout << "Total Bytes Received: (" << totalBytesRead << ")" << endl;
問題:
クライアントとサーバーを実行してファイルを送信した後、送受信された正しいデータサイズ(もちろんファイルサイズはバイト単位)が表示されますが、出力ファイルは異なり、テキストエディター(メモ帳++)で開くと)出力ファイルに含まれるデータが少なく(ただし、ファイル->プロパティは同じファイルサイズを示しています)、一部のデータが重複していることを明確に確認できます。
私の質問:
revc() はどのように機能しますか? 多くの呼び出しでデータを受信している場合、それはバッファに蓄積されますか? (私の場合:recvbuf)またはバッファを書き換えますか?私が理解している限り、それは蓄積されるので、私のコードは正しいですか??
ありがとう。