【发布时间】:2014-06-02 13:15:18
【问题描述】:
在我的测试中,我发现当我从发送方发送 1000-5000 字节的数据包时,它们会在接收方组装/捆绑,大小为 8000-14000 字节。我检查了wireshark捕获来确认这一点。
我有两个问题: 1) 谁将这些数据包捆绑在一起,接收者接收这些数据包,我使用 select() 来检测数据并调用 recvmsg api?。
2) 当接收方的数据包长度增加时,我实现了部分接收,因此“recvmsg”也返回部分数据。在这种情况下,一段时间后,recvmsg 调用返回 EAGAIN 0 字节。 与peer的连接还在,因为peer还在发送数据包,为什么recvmsg call returing error with EAGAIN ?.
请帮忙!
【问题讨论】:
-
您必须处于非阻塞模式。解决办法:d不可以,或者使用select()。
-
我已经使用 select() 来获取数据通知。我的接收器能够接收数据一段时间,但是随着大字节的到来,recvmsg 调用返回 o 字节。
-
如果 select() 指示通道是可读的,则永远不应该这样做。你的描述没有意义。如果 recv() 返回 -1 并将 errno 设置为 EAGAIN 它不会同时给你零字节。它不能返回零和 -1。如果您获得 EAGAIN,则仅表示没有可阅读的内容,您必须重新选择。
-
谢谢..但我很确定在高负载期间会发生此问题。是的,它返回 0 个字节,但套接字缓冲区仍有数据。我使用 ioctl 来跟踪 recv 缓冲区中的数据并调用它返回 EAGAIN 的 recvmsg .. 如果 recv 缓冲区中的消息大小超过某个限制然后这个问题出现//
-
只有当 recv 缓冲区中的数据增加一些限制时,我才会得到 EAGAIN,我猜它在 32767 左右。正如我所说,我使用 ioctl 来计算 recv 缓冲区大小,然后使用返回 EAGAIN 的“recvmsg”帮助。这发生在高负载..对于小数据包流工作正常/