0

UDP 数据包被发送到 Linux 客户端。如果这些数据包在特定时间间隔(1 分钟)内未发送并再次发送到同一 UDP 端口,则该recv函数返回 -1 并且错误为EAGAIN. 仅当客户端通过 LAN 交换机连接到网络时,才会出现此问题。为什么会出现这个问题,当使用开关时?

并且这个问题被暂时修复了,当 UDP 客户端使用 send 函数向服务器发送虚拟数据时,每当recv函数返回EAGAIN错误时。请有人澄清这种行为。

4

2 回答 2

0

上述问题已解决。如果没有数据包流到客户端,它的 UDP 超时(30 秒)设置会在 30 秒后影响数据包流。

于 2013-09-17T02:57:32.207 回答
0

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 这样的数据包捕获工具,看看数据包是否通过了?

于 2013-09-13T03:25:33.703 回答