我有一个当前订阅的非阻塞套接字:
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”接收适当的字节数。
答案 0 :(得分:6)
查看The ultimate SO_LINGER page, or: why is my tcp not reliable,它可以很好地解释发生了什么以及如何解决问题。