我在使用 Windows 的 Winsock2 通过网络接收数据时遇到问题。我正在尝试使用简单的客户端和服务器系统来实现文件传输程序。使用我们当前的代码,最后进来的数据包不会附加到文件中,因为它不是缓冲区的大小。因此,文件传输并不完全,会引发错误并中断。它并不总是最后一个数据包,有时它更早。
这是服务器代码的片段:
int iResult;
ifstream sendFile(path, ifstream::binary);
char* buf;
if (sendFile.is_open()) {
printf("File Opened!\n");
// Sends the file
while (sendFile.good()) {
buf = new char[1024];
sendFile.read(buf, 1024);
iResult = send(AcceptSocket, buf, (int)strlen(buf)-4, 0 );
if (iResult == SOCKET_ERROR) {
wprintf(L"send failed with error: %d\n", WSAGetLastError());
closesocket(AcceptSocket);
WSACleanup();
return 1;
}
//printf("Bytes Sent: %d\n", iResult);
}
sendFile.close();
}
这是客户端代码的片段:
int iResult;
int recvbuflen = DEFAULT_BUFLEN;
char recvbuf[DEFAULT_BUFLEN] = "";
do {
iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0);
if ( iResult > 0){
printf("%s",recvbuf);
myfile.write(recvbuf, iResult);
}
else if ( iResult == 0 ) {
wprintf(L"Connection closed\n");
} else {
wprintf(L"recv failed with error: %d\n", WSAGetLastError());
}
} while( iResult > 0 );
myfile.close();
尝试传输作为字典的文件时,它可能会随机中断。例如,一个运行在 S 的早期中断并在末尾附加了奇怪的字符,这并不罕见:
...
sayable
sayer
sayers
sayest
sayid
sayids
saying
sayings
╠╠╠╠╠╠╠╠recv failed with error: 10054
我能做些什么来处理这些错误和奇怪的字符?