gpt4 book ai didi

linux - sendto() 数据包被内核丢弃

转载 作者:太空宇宙 更新时间:2023-11-04 04:04:09 25 4
gpt4 key购买 nike

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

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

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

最佳答案

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

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

关于linux - sendto() 数据包被内核丢弃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21951980/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com