【发布时间】:2009-12-11 06:21:50
【问题描述】:
我有一个通过 TCP 通信的客户端/服务器程序(Windows、winsock2)。 客户端一次以 8K 连接并向服务器发送数据(使用发送)。 服务器只是读取数据(使用 recv)。
没有对套接字进行特殊设置。
问题: 当通信过程中发生网络错误(如网线拔出)时,此时接收方无法获得成功发送的数据。 为了简化, 客户端在发送的 10 次调用中发送了 80K 数据。 (所有发送都成功)。由于某些网络问题,第 11 次发送失败。此后不再发送数据。
问题是在接收器处,并非所有 80K 数据都被接收到。它总是小于 80K。
我希望作为发送者成功发送 80K,TCP 将保证将大量数据传递到目标 TCP(数据可能尚未被应用程序接收,但它在目标 TCP 缓冲区中)。
我错过了什么吗?
谢谢
编辑:
示例代码
服务器/接收器
/* create socket */
/* listen */
/* accept connection */
char recvbuf[8192];
do {
iResult = recv(ClientSocket, recvbuf, sizeof(recvbuf), 0);
if (iResult > 0) {
total += iResult;
printf("Total bytes received: %d\n", total);
}
else if (iResult == 0) {
printf("Connection is closing...\n");
break;
}
else {
printf("recv failed: %d\n", WSAGetLastError());
break;
}
} while (iResult > 0);
客户/发件人:
/* create socket */
/* connect to server */
char sendbuf[8192];
do {
// Send an initial buffer
iResult = send( ConnectSocket, sendbuf, sizeof(sendbuf), 0 );
if (iResult == SOCKET_ERROR) {
printf("send failed: %d\n", WSAGetLastError());
break;
}
total += iResult;
printf("Total bytes Sent: %ld\n", total);
} while(iResult > 0);
//wait before cleaning up
getc(stdin);
【问题讨论】:
标签: sockets error-handling tcp winsock