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;
}
您可以在此处查看图书馆:
- https://github.com/xekoukou/sparrow
- https://github.com/xekoukou/sparrow/blob/master/thr_client.c
- https://github.com/xekoukou/sparrow/blob/master/thr_server.c
编辑:
- 我发现了代码的问题。首先,有一小部分代码没有检查 EAGAIN 错误。我的代码只是关闭了连接,因为它认为这是一个不可恢复的错误。
- @EJP 有效地回答了这个问题。 Recv returns 仅当连接关闭或我们有一个零大小的缓冲区时才为零。
- 另一个有趣的问题是在第 800000 次迭代的循环中发生某些事情时如何进行有效调试。
recv()
returns 流末尾为零,这又会在对等方关闭连接时发生。没什么'random'。
我用 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;
}
您可以在此处查看图书馆:
- https://github.com/xekoukou/sparrow
- https://github.com/xekoukou/sparrow/blob/master/thr_client.c
- https://github.com/xekoukou/sparrow/blob/master/thr_server.c
编辑:
- 我发现了代码的问题。首先,有一小部分代码没有检查 EAGAIN 错误。我的代码只是关闭了连接,因为它认为这是一个不可恢复的错误。
- @EJP 有效地回答了这个问题。 Recv returns 仅当连接关闭或我们有一个零大小的缓冲区时才为零。
- 另一个有趣的问题是在第 800000 次迭代的循环中发生某些事情时如何进行有效调试。
recv()
returns 流末尾为零,这又会在对等方关闭连接时发生。没什么'random'。