TCP套接字连续返回EAGAIN

TCP套接字连续返回EAGAIN,tcp,recv,Tcp,Recv,在我的测试中,我发现当我从发送方发送1000-5000字节的数据包时,它们会在接收方组装/捆绑,大小为8000-14000字节。我检查了线鲨的捕获以确认这一点 我有两个问题: 1) 谁将这些数据包捆绑在中间,接收方接收这些数据包,我使用select()检测数据并调用recvmsg api 2) 当接收端的数据包长度增加时,我实现了部分接收,以便“recvmsg”也返回部分数据。在本例中,一段时间后,recvmsg调用返回0字节的EAGAIN。 与对等方的连接仍处于打开状态,因为对等方仍在发送数据

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

我有两个问题: 1) 谁将这些数据包捆绑在中间,接收方接收这些数据包,我使用select()检测数据并调用recvmsg api

2) 当接收端的数据包长度增加时,我实现了部分接收,以便“recvmsg”也返回部分数据。在本例中,一段时间后,recvmsg调用返回0字节的EAGAIN。 与对等方的连接仍处于打开状态,因为对等方仍在发送数据包,为什么recvmsg调用返回EAGAIN错误

请帮忙

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

1) 谁将这些数据包捆绑在中间,接收方接收这些数据包,我使用select()检测数据并调用recvmsg api

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

TCP是一个流,没有消息的概念。在多个
send()
调用中发送的数据可以在一个
recv()
调用中接收,反之亦然

2) 当接收端的数据包长度增加时,我实现了部分接收,以便“recvmsg”也返回部分数据。在本例中,一段时间后,recvmsg调用返回0字节的EAGAIN。与对等方的连接仍处于打开状态,因为对等方仍在发送数据包,为什么recvmsg调用返回EAGAIN错误


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

您必须处于非阻塞模式。解决方案:d不可用,或使用select()。我已经使用select()获取数据通知。.我的接收器能够接收数据一段时间,但当出现大字节时,recvmsg调用返回o字节。如果select()指示通道可读,则永远不应该这样做。你的描述毫无意义。如果recv()返回-1并将errno设置为EAGAIN,则它不会同时为您提供零字节。它不能返回0和-1。如果你得到了EAGAIN,这只意味着没有什么可读的,你必须重新选择。谢谢。但我很确定,在高负载时,这个问题会发生。是,它返回0字节,但套接字缓冲区仍有剩余数据。我使用ioctl跟踪recv缓冲区中的数据,并调用recvmsg,它将返回EAGAIN。。有没有可能,如果recv缓冲区中的mesg大小超过某个限制,那么这个问题就会出现//只有当recv缓冲区中的数据增加某个限制时,我才得到EAGAIN,我猜大约是32767。正如我所说,我使用ioctl计算recv缓冲区大小,然后使用“recvmsg”的帮助,它返回EAGAIN。这在高负载时发生。对于小数据包,流工作正常/I在接收器套接字上有可用数据,因为我使用ioctl调用检查recv套接字缓冲区中的数据长度。选择returns让我从这个套接字读取,然后当我读取它时,recvmsg返回EAGAIN。这适用于小数据包,但当recv缓冲区的长度增加一些限制时,我就面临这个问题。