TCP套接字不断返回EAGAIN

时间:2014-06-02 13:15:18

标签: tcp recv

在我的测试中,我发现当我从发送方发送1000-5000字节的字节数据包时,它们会在接收器上组装/捆绑,大小为8000-14000字节。我检查了wireshark捕获以确认这一点。

我有两个问题: 1)谁将这些数据包捆绑在一起,接收者接收这些数据包,我使用select()来检测数据并调用recvmsg api?。

2)当接收器长度增加时,我实现了部分接收,因此'recvmsg'也会返回部分数据。在这种情况下,一段时间后,recvmsg调用返回EAGAIN,其中包含0个字节。 与对等体的连接仍在运行,因为对等体仍在发送数据包,为什么recvmsg会使用EAGAIN调用returing错误?

请帮忙!

1 个答案:

答案 0 :(得分:0)

  

我发现当我从发件人发送1000-5000字节的字节数据包时,它们会在接收器上组装/捆绑,大小为8000-14000字节

     

1)谁将这些数据包捆绑在一起,接收器收到这些数据包,我使用select()来检测数据并调用recvmsg api?。

如果这些是大小为9000字节的以太网数据包,那么您必须使用jumbo frames

TCP是一个流,没有消息的概念。多个send()来电中发送的数据可能会在一次recv()来电中收到,反之亦然。

  

2)当接收器长度增加时,我实现了部分接收,因此'recvmsg'也会返回部分数据。在这种情况下,一段时间后,recvmsg调用返回EAGAIN,其中包含0个字节。与对等体的连接仍在运行,因为对等体仍在发送数据包,为什么recvmsg会使用EAGAIN调用returing错误?

这意味着您正在使用非阻塞套接字,并且套接字接收缓冲区中没有更多可用数据。在这种情况下,您应该使用select/poll/epoll在一个或多个套接字上等待,直到有更多数据可供读取。