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

Ark*_*nez 0 sockets linux epoll nonblocking

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

 ev.events = EPOLLIN | EPOLLPRI | EPOLLERR | EPOLLHUP | EPOLLRDHUP| EPOLLET;
Run Code Online (Sandbox Code Playgroud)

它收到一些EPOLLIN,我读到非阻塞直到EAGAIN,然后我收到HUP和RDHUP,有时候还有几个字节要读.

另一方面是:

send(socket,960_bytes_buffer)
close(socket);
Run Code Online (Sandbox Code Playgroud)

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

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

它看起来更像是一个非阻塞套接字的问题而不是与epoll相关的问题.简单的"nc -l -p port"接收适当的字节数.

cme*_*erw 6

看看最终的SO_LINGER页面,或者:为什么我的tcp不可靠,它很好地解释了发生了什么以及如何解决它.