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

标签 linux sockets nonblocking epoll

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

 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/

相关文章:

java - 如何从 "java -version"解析 java 的版本号并将其分配给远程主机上的变量?

linux - 如何使用 URL 重写在我的站点中反射(reflect)另一个站点?

c - 获取地址 IP 并使用套接字连接到它

Java:BufferedReader 的 readLine 方法的效率和可能的替代方法

node.js - 如果 nodejs 使用非阻塞 IO,那么 fs.readFileSync 是如何实现的?

linux - 在 nagios 命令之前运行 ssh 转发命令

java - 如何保持Socket连接?

python - 从子进程 stdout 可靠地非阻塞读取

c++ - var++ 和 var-- 不是线程安全的?

python - 使用mmap找出缓存未命中