当前位置: 首页 > 知识库问答 >
问题:

recv()返回零,但看不到任何TCP断开

贺俊材
2023-03-14
while( true )
{                  
    buffer = onGetBuffer( maxBytesToRecv );

    const int flags = MSG_WAITALL;

    errno = 0;
    const ssize_t bytesReceived = ::recv( descriptor() , buffer , maxBytesToRecv , flags );

    if ( bytesReceived > 0 ){
        processData( receivedTime , bytesReceived );   
    }
    else if ( bytesReceived < 0 ){
        const int eno = errno;
        if ( EINTR != eno ){
            // Log error code
        }
    }
    else{
        // Peer disconnected
        // ** Code is reaching here **
    }                   
}
sendto(16, "DATA"..., 88, MSG_NOSIGNAL, NULL, 0) = 88
sendto(16, "DATA"..., 88, MSG_NOSIGNAL, NULL, 0) = 88
sendto(16, "DATA"..., 5584, MSG_NOSIGNAL, NULL, 0) = 5584
sendto(16, "DATA"..., 5654, MSG_NOSIGNAL, NULL, 0) = 5654
sendto(16, "DATA"..., 5651, MSG_NOSIGNAL, NULL, 0) = 5651
sendto(16, "DATA"..., 5593, MSG_NOSIGNAL, NULL, 0) = 5593
sendto(16, "DATA"..., 5635, MSG_NOSIGNAL, NULL, 0) = 5635
sendto(16, "DATA"..., 5563, MSG_NOSIGNAL, NULL, 0) = 5563
sendto(16, "DATA"..., 5608, MSG_NOSIGNAL, NULL, 0) = 5608
sendto(16, "DATA"..., 5662, MSG_NOSIGNAL, NULL, 0 <unfinished ...>
sendto(16, "DATA"..., 5583, MSG_NOSIGNAL, NULL, 0) = 5583
sendto(16, "DATA"..., 5579, MSG_NOSIGNAL, NULL, 0) = 5579
sendto(16, "DATA"..., 3373, MSG_NOSIGNAL, NULL, 0) = 3373
sendto(16, "DATA"..., 201, MSG_NOSIGNAL, NULL, 0) = 201
recvfrom(16, "DATA"..., 7126, MSG_WAITALL, NULL, NULL) = 7126
recvfrom(16, "DATA"..., 6187, MSG_WAITALL, NULL, NULL) = 6187
recvfrom(16, "DATA"..., 7079, MSG_WAITALL, NULL, NULL) = 7079
recvfrom(16, "", 0, MSG_WAITALL, NULL, NULL) = 0

如果没有断开连接,为什么recv()返回零?或者我还能查什么?

共有1个答案

汤飞
2023-03-14

您最后的recv调用为0字节。

从Linux上的recv手册页:

如果从流套接字接收的请求字节数为0,也可以返回值0。

 类似资料:
  • 我正在使用TCP/IP套接字,我已经读过函数。因此,每当对等体断开连接时,recv按照文档返回0,但在windows上它不返回零,而是返回-1,并且中的值是我无法理解它为什么这样做。同样的代码在Linux中运行得非常好。

  • 问题内容: 我正在尝试将.csv文件中的大量数据转储到SQL Server 2012数据库中。我没有进行数千次INSERT的工作,而是在进行调查。 编辑: 这是一个自动化的过程,而不是一次性的。我也没有此数据库的权限。 当我尝试将数据复制到数据库中时,不会返回任何错误,但实际上也不会复制任何内容-它只会返回。我已将其缩减为无法正常工作的最小情况。 首先,创建一个包含两列的简单表: 然后,使用来从中

  • 问题内容: 我试图获得过去7天注册的用户数量以显示在图表上,如果mysql返回0而不是没有行,那将是很好的。目前,它只返回每天都有一行值的行 问题答案: 尝试:

  • 问题内容: 我在现有帖子中找不到解决方案(尽管我一直在寻找)。在下拉菜单中进行选择后,我试图从代码中的URL抓取数据。最后,我想单击“保存”按钮并下载excel文件。这是可以正常运行的代码,但最终无法单击“保存”按钮。 单击菜单中的“进度监视”项,然后单击“物理和财务项目摘要”项。然后,为每个下拉项进行选择。 该代码成功运行,但是,没有单击保存按钮。令人惊讶的是,一旦我在spyder编辑器中运行了

  • 我在HBASE有一张桌子。我和菲尼克斯一起创造的 然后我用spark填充它(我使用hortonworks shc-core连接器): 多谢帮忙。

  • 我使用tcpdump从客户端捕获数据包,每个数据包都是分段到最大1448字节的数据,但是head只有5字节,为什么我可以成功读取head,但是下面的data recv()操作又会返回ee?当数据已经到达recv缓冲区时,recv是否可能返回EAGAIN?在我看来,我可以读取前5个字节,所以必须有更多的数据在recv缓冲区读取。 可能与TCP/IP协议栈中的组装过程有关。代码如下所示,每个pdu r