【发布时间】:2013-02-16 23:11:10
【问题描述】:
我正在编写一个简单的服务器/客户端程序来将文件从客户端发送到服务器。 我正在使用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)还是重写缓冲区? 据我所知,它确实会累积,所以我的代码是正确的??
谢谢。
【问题讨论】: