内核丢弃的sendto()数据包

时间:2014-02-22 08:47:58

标签: linux sockets networking linux-kernel sendto

ioctl(socketFd_, SIOCOUTQ, &outstandingBytes);  
getsockopt(socketFd_, SOL_SOCKET, SO_SNDBUF, &sendBuffSize, &buffLen);  

我正在使用这两个api来调试程序中的数据包丢弃 观察:

  1. sendto将始终返回数据包大小,因此对sendto的调用始终是成功的。
  2. oustandingBytes达到2040 时,linux内核将丢弃数据包意味着我无法在wireshark中看到它。我正在我当地的eth界面上捕获数据包。
  3. 我的 sendBuffSize是124928 ,由getsockopt返回。
  4. 我发送的数据包大小约为300到350字节。我有两个插槽一个原始套接字用于发送GRE数据包和另一个udp套接字,我看到两种协议类型的数据包丢弃,两个套接字都处于非阻塞模式。
    sendto是否无法检测到错误,因为数据包在达到sendBuffSize限制之前被丢弃了?
    如何在我的系统中增加2040的限制。该值应为getsockopt() api返回的124928 我有这个问题的类似线程如下所示但是我无法得到答案所以决定开始一个新的线程 rawsocket sendto() some of the packet are dropped and not seen in the network

1 个答案:

答案 0 :(得分:0)

UDP和原始套接字不提供任何方法来检测丢弃的数据包。由于路由器故障或网络拥塞,数据包可能在网络中丢失,或者可以在内核中丢弃它们。如果需要检测丢失的数据包,则必须在应用层中执行,或者在UDP上实现会话层。

如果内核在您致电sendto()时无法缓冲数据包,则应返回-1并将errno设置为EWOULDBLOCK