在我的测试中,我发现当我从发送方发送1000-5000字节的字节数据包时,它们会在接收器上组装/捆绑,大小为8000-14000字节。我检查了wireshark捕获以确认这一点。
我有两个问题: 1)谁将这些数据包捆绑在一起,接收者接收这些数据包,我使用select()来检测数据并调用recvmsg api?。
2)当接收器长度增加时,我实现了部分接收,因此'recvmsg'也会返回部分数据。在这种情况下,一段时间后,recvmsg调用返回EAGAIN,其中包含0个字节。 与对等体的连接仍在运行,因为对等体仍在发送数据包,为什么recvmsg会使用EAGAIN调用returing错误?
请帮忙!
答案 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
在一个或多个套接字上等待,直到有更多数据可供读取。