【问题标题】:TCP send/recv error reportingTCP 发送/接收错误报告
【发布时间】: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


    【解决方案1】:

    你的假设是有缺陷的。

    send() 成功返回仅意味着数据已被您的内核接受发送 - 它可能仍在您的发送队列中。

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

    (另见this question

    【讨论】:

    • 不会是递归的。接收方应用程序对接收到的数据发送 ACK 时,如何确保 ACK 数据包的所有字节都已送达。
    • 确实如此,在一般情况下是一个无法解决的问题。这意味着您的发送方应用程序只知道接收方已经看到至少它收到的 ACK 的内容 - 它必须重新传输任何其他内容。然后,您的发件人必须准备好检测并丢弃不必要地重新传输的数据。
    【解决方案2】:

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

    TCP Connection Seems to Receive Incomplete Data

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

    【讨论】:

    • 是的 send/recv 在循环中被调用。但我假设如果 send() 成功,该数据应该到达目标 TCP。 (随后通过 1 个或多个 recv() 申请将在短时间内发布代码。
    猜你喜欢
    • 2015-11-04
    • 1970-01-01
    • 2022-07-22
    • 1970-01-01
    • 2011-09-13
    • 2010-11-14
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多