【发布时间】:2014-02-22 08:47:57
【问题描述】:
ioctl(socketFd_, SIOCOUTQ, &outstandingBytes);
getsockopt(socketFd_, SOL_SOCKET, SO_SNDBUF, &sendBuffSize, &buffLen);
我正在使用这两个api来调试我的程序中的丢包。
观察:
-
sendto将始终返回数据包大小,因此对sendto的调用始终成功。 - 当 oustandingBytes 达到 2040 时,Linux 内核将丢弃数据包,这意味着我无法在 Wireshark 中看到它。我正在本地 eth 接口上捕获数据包。
- 我的 sendBuffSize 是 124928,由
getsockopt返回。 - 我发送的数据包大小约为 300 到 350 字节。我有两个套接字,一个用于发送 GRE 数据包的原始套接字和另一个 udp 套接字,我看到两种协议的数据包丢失,两个套接字都处于非阻塞模式。
sendto是否无法检测到错误,因为数据包在达到 sendBuffSize 限制之前被丢弃?
如何在我的系统中增加 2040 的限制。此值应为getsockopt()api 返回的 124928。
对于这个问题,我有类似的线程,如下所示,但是我无法得到答案,所以决定开始一个新线程。
rawsocket sendto() some of the packet are dropped and not seen in the network
【问题讨论】:
标签: linux sockets networking linux-kernel sendto