TCP发送/接收错误报告

时间:2009-12-11 06:21:51

标签: sockets error-handling tcp winsock

我有一个客户端/服务器程序(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);

2 个答案:

答案 0 :(得分:2)

你的假设是有缺陷的。

成功返回

send()意味着内核已接受数据发送 - 它仍然可以位于您的发送队列中。

如果您想知道数据是否已到达另一端,则必须是应用程序级别的确认。

(另见this question

答案 1 :(得分:0)

您是在循环中调用sendrecv吗?他们不保证他们发送或接收您提供的所有数据或缓冲区。

TCP Connection Seems to Receive Incomplete Data

另外你应该发布一些代码,否则我们只能猜测。