Linux:Recv随机返回零

时间:2016-04-15 20:56:48

标签: linux tcp recv epoll

我为linux编写了一个带epoll的简单TCP网络库。

在我的一个测试中,我想测试库的吞吐量。 我发送2000000个500字节的消息。

在收到800,000或更多信息后,绑定套接字在recv上随机返回零。

其他时候,收到所有邮件。会导致这种情况发生的原因是什么?

recv调用位于sparrow.c文件的第393行。 我可以验证data_in->len > data_in->cur

    int result = recv(sock->fd, data_in->data + data_in->cur, data_in->len - data_in->cur, 0);

    //On error or connection closed.
    //TODO We need to handle closed connections differently, possibly automatically reconnecting.
    if(result <= 0) {
      //TODO Make Dprintf
      printf("Receive error or we received a signal that the connection closed.\nWe are closing the connection.\n");
      spev->error = 1;
      sparrow_socket_close(sp,sock);
      return 0;
    }

您可以在此处查看图书馆:

  1. https://github.com/xekoukou/sparrow
  2. https://github.com/xekoukou/sparrow/blob/master/thr_client.c
  3. https://github.com/xekoukou/sparrow/blob/master/thr_server.c
  4. 编辑:

    1. 我发现了代码的问题。首先,有一小部分代码没有检查EAGAIN错误。我的代码只是关闭了连接,因为它认为它是一个非恢复错误。
    2. @EJP有效地回答了这个问题。仅当连接关闭或者我们有一个零大小的缓冲区时,Recv才返回零。
    3. 另一个有趣的问题是如何在800000迭代的循环中有效地调试。

1 个答案:

答案 0 :(得分:1)

recv()在流结束时返回零,这在对等体关闭连接时发生。没有什么“随意”的。