代码之家  ›  专栏  ›  技术社区  ›  Rohan

TCP发送/接收错误报告

  •  1
  • Rohan  · 技术社区  · 16 年前

    我有一个客户端/服务器程序(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 回复  |  直到 16 年前
        1
  •  2
  •   Community Mohan Dere    9 年前

    你的假设有缺陷。

    send() 成功返回意味着数据已经被内核接受发送——它可能仍然位于发送队列中。

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

    (也见) this question )

        2
  •  0
  •   Community Mohan Dere    9 年前

    你在打电话吗 send recv 在循环中?它们不能保证发送或接收您提供的所有数据或缓冲区。

    TCP Connection Seems to Receive Incomplete Data

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