Linux: 随机接收 returns 零

Linux: Recv randomly returns zero

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

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

收到 800000 条或更多消息后,绑定套接字在 recv 上随机 returns 归零。

其他时候,所有消息都收到了。什么会导致这种情况发生?

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

编辑:

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

recv() returns 流末尾为零,这又会在对等方关闭连接时发生。没什么'random'。