UDP 数据包被发送到 Linux 客户端。如果这些数据包在特定时间间隔(1 分钟)内未发送并再次发送到同一 UDP 端口,则该recv
函数返回 -1 并且错误为EAGAIN
. 仅当客户端通过 LAN 交换机连接到网络时,才会出现此问题。为什么会出现这个问题,当使用开关时?
并且这个问题被暂时修复了,当 UDP 客户端使用 send 函数向服务器发送虚拟数据时,每当recv
函数返回EAGAIN
错误时。请有人澄清这种行为。
UDP 数据包被发送到 Linux 客户端。如果这些数据包在特定时间间隔(1 分钟)内未发送并再次发送到同一 UDP 端口,则该recv
函数返回 -1 并且错误为EAGAIN
. 仅当客户端通过 LAN 交换机连接到网络时,才会出现此问题。为什么会出现这个问题,当使用开关时?
并且这个问题被暂时修复了,当 UDP 客户端使用 send 函数向服务器发送虚拟数据时,每当recv
函数返回EAGAIN
错误时。请有人澄清这种行为。
上述问题已解决。如果没有数据包流到客户端,它的 UDP 超时(30 秒)设置会在 30 秒后影响数据包流。
recv 函数返回 -1 并且错误是 EAGAIN
这意味着套接字是非阻塞的。如果是这种情况,那么您可能会丢失数据包(可能在数据报到达接收方之前调用 recv())。纯粹为了调试,你应该让它阻塞并尝试。
如果这些数据包在特定时间间隔(1 分钟)内未发送并再次发送到同一 UDP 端口
这应该与 UDP 数据报接收有关。如果发送方发送数据,则接收方的 UDP 缓冲区应存储 hte 数据包,直到应用程序调用 recvfrom()。
我会建议两件事。
首先,您可以使用 ss(或其早期版本(Linux 上已弃用)的 netstat,如果 ss 不可用)。你会看到这样的东西。如果您已收到数据包(数据报),则与您的流相关的第二列(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 这样的数据包捕获工具,看看数据包是否通过了?