我有一个当前订阅的非阻塞套接字:
ev.events = EPOLLIN | EPOLLPRI | EPOLLERR | EPOLLHUP | EPOLLRDHUP| EPOLLET;
它接收到几个 EPOLLIN,我以非阻塞方式读取它们直到 EAGAIN,然后我接收到 HUP 和 RDHUP,有时还有几个字节要读取。
另一边就是:
send(socket,960_bytes_buffer)
close(socket);
我已经尝试在 epollin 和关闭时间的事件循环中直接使用 msg_peek 进行 recv,并添加接收到的数据,它并不总是收到 960,有时只有大约 480 字节。
使套接字成为非阻塞的或在发送和关闭之间的客户端中放置一个 sleep(1) 可以正常工作。
在我看来,与 epoll 相关的问题相比,它更像是非阻塞套接字的问题。像“nc -l -p port”这样简单的东西接收适当数量的字节。
最佳答案
看看The ultimate SO_LINGER page, or: why is my tcp not reliable这很好地解释了正在发生的事情以及如何解决它。
关于linux - 当另一端写入和关闭时,在 epoll 控制的非阻塞套接字上丢失字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1560354/