当另一方写入和关闭时,在epoll控制的非阻塞套接字上丢失字节

时间:2009-10-13 13:44:13

标签: linux sockets nonblocking epoll

我有一个当前订阅的非阻塞套接字:

 ev.events = EPOLLIN | EPOLLPRI | EPOLLERR | EPOLLHUP | EPOLLRDHUP| EPOLLET;

它接收了几个EPOLLIN,我读到非阻塞直到EAGAIN然后我收到HUP& RDHUP,有时需要多几个字节才能读取。

另一方面就是:

send(socket,960_bytes_buffer)
close(socket);

我已经尝试使用msg_peek直接在epollin和关闭时间的事件循环中进行recv,并添加收到的数据,它总是不会收到960,有时只有大约480字节。

在发送和关闭之间使套接字无阻塞或在客户端中进入休眠(1)工作正常。

在我看来,非阻塞套接字的问题比epoll相关。简单的“nc -l -p port”接收适当的字节数。

1 个答案:

答案 0 :(得分:6)

查看The ultimate SO_LINGER page, or: why is my tcp not reliable,它可以很好地解释发生了什么以及如何解决问题。