winsock2
libを使用してクライアントからサーバーにファイルを送信しようとしています。
ファイルをchar配列に変換した後、コマンドを使用してこの配列を送信していsend()
ます。
問題:別々に送信されたデータ。
例: サイズ: 144429 のファイルがあります。一度に送信するのではなく、データは次のように多くの部分に分割されます: 最初の送信: 1460
2 回目の送信: 21544
3 回目の送信: 57136
等..
データ全体が送信されるまで。
私の質問は次のとおりです。一度ではなく、部分的に送信する原因は何ですか????
解決策は機能していますが、意味がありません:追加している場合
cout << "bla bla bla";
send() 関数の前に、それは機能し、144429 全体を一度に送信します。(ただし、cout に指定した文字列が短い場合は、変更せず、分割して送信します)
コード:
クライアント側
int Client::sendData(char *sendbuf, int length)
{
int iResult;
// if I remove those next few lines (until and including the cout line)
// the send will split.
char tmp[1];
// sent 1 dummy byte
iResult = send( _connectSocket, tmp, 1, 0 );
if (iResult == SOCKET_ERROR) {
printf("send failed with error: %d\n", WSAGetLastError());
return closeSocket();
}
cout << "SENDING DATA..." << endl;
// THIS IS THE RELEVANT AND ACTUAL DATA I WANT TO SEND
// send the data
iResult = send( _connectSocket, sendbuf, length, 0 );
if (iResult == SOCKET_ERROR) {
printf("send failed with error: %d\n", WSAGetLastError());
return closeSocket();
}
cout << "Data sent (" << iResult << " Bytes)" << endl;
return 0;
}
サーバ側:
char recvbuf[DEFAULT_BUFLEN];
int recvbuflen = DEFAULT_BUFLEN;
int iResult = 0;
int totalBytesRead = 0;
// Receive until the peer shuts down the connection
do {
totalBytesRead += iResult;
iResult = recv(_clientSocket, recvbuf, recvbuflen, 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);
// store data into file
FileTransfer::binaryToFile(recvbuf, "doch.docx", totalBytesRead-1);
return 0;
}