我正在尝试使用winsock2
lib 将文件从客户端发送到服务器。
将文件转换为 char 数组后,我使用send()
命令发送这个数组。
问题:数据分开发送。
例如:我的文件大小:144429。它不会立即发送,数据被分成许多部分,例如:第一次发送:1460
第二次发送:21544
第三次发送:57136
ETC..
直到发送整个数据。
所以我的问题是:是什么导致它分部分发送而不是一次发送????
解决方案我发现工作但没有任何意义:如果我要添加
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;
}