我有一个客户端/服务器程序(Windows,winsock2),它通过TCP进行通信。 客户端一次以8K连接并向服务器发送数据(使用send)。 服务器只读取数据(使用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);
答案 0 :(得分:2)
你的假设是有缺陷的。
成功返回 send()
意味着内核已接受数据发送 - 它仍然可以位于您的发送队列中。
如果您想知道数据是否已到达另一端,则必须是应用程序级别的确认。
(另见this question)
答案 1 :(得分:0)
您是在循环中调用send
和recv
吗?他们不保证他们发送或接收您提供的所有数据或缓冲区。
TCP Connection Seems to Receive Incomplete Data
另外你应该发布一些代码,否则我们只能猜测。