UDP数据包被发送到Linux客户端。如果这些数据包未在特定时间间隔(1分钟)内发送并再次发送到同一UDP端口,则recv
函数返回-1,错误为EAGAIN
。仅当客户端通过LAN交换机连接到网络时,才会出现此问题。使用开关时为什么会出现此问题?
当UDP客户端使用send函数在recv
函数返回EAGAIN
错误时向服务器发送虚拟数据时,此问题暂时得到解决。请有人澄清这种行为。
答案 0 :(得分:0)
recv函数返回-1,错误是EAGAIN
这意味着套接字是非阻塞的。如果是这种情况,那么您可能会丢失数据包(可能在数据报发送到接收方之前调用recv())。纯粹是为了调试,你应该阻止并尝试。
如果这些数据包未在特定时间间隔(1分钟)内发送并再次发送到同一UDP端口
这应该与UDP数据报接收有关。如果发送方发送数据,则接收方的UDP缓冲区应存储hte包,直到应用程序调用recvfrom()。
我会建议两件事。
首先,如果ss不可用,您可以使用ss(或其早期(Linux上已弃用)版本netstat)。你会看到这样的东西。如果您收到了数据包(datagram),那么与您的流有关的第二列(Recv-Q)应该显示收到的数据包的数量;您可以使用接收器绑定的端口号识别流量。
# ss -upan
State Recv-Q Send-Q Local Address:Port Peer Address:Port
UNCONN 0 0 *:48408 *:* users:(("dhclient",22086,20))
UNCONN 0 0 *:7000 *:* users:(("udp_server",23994,3))
UNCONN 0 0 *:68 *:* users:(("dhclient",22086,6))
UNCONN 0 0 *:631 *:* users:(("cupsd",1549,13))
UNCONN 0 0 :::47798 :::* users:(("dhclient",22086,21))
#
# netstat -upan
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
udp 0 0 0.0.0.0:48408 0.0.0.0:* 22086/dhclient
udp 0 0 0.0.0.0:7000 0.0.0.0:* 23994/./udp_server
udp 0 0 0.0.0.0:68 0.0.0.0:* 22086/dhclient
udp 0 0 0.0.0.0:631 0.0.0.0:* 1549/cupsd
udp 0 0 :::47798 :::* 22086/dhclient
#
其次,如果在接收队列中没有看到任何内容(Recv-Q),那么你应该使用像tcpdump这样的数据包捕获工具,看看数据包是否正在通过?
答案 1 :(得分:0)
上述问题已得到解决。它是路由器中的UDP超时(30秒)设置,如果没有数据包流到客户端,则会在30秒后影响数据包流。