使用LAN交换机时,客户端未收到UDP数据包

时间:2013-09-13 02:55:49

标签: networking udp recv

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

当UDP客户端使用send函数在recv函数返回EAGAIN错误时向服务器发送虚拟数据时,此问题暂时得到解决。请有人澄清这种行为。

2 个答案:

答案 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秒后影响数据包流。