【发布时间】:2014-03-16 17:56:08
【问题描述】:
socketFd_ = socket(AF_INET, SOCK_RAW, protoType);
sentBytes = sendto(socketFd_, buf, len, 0,
(struct sockaddr *)&sa,sizeof(structsockaddr_in));
protoType = GRE
我正在网络中发送 1000 个数据包。 如果我的 tx 数据包速率为 40,我可以在 Wireshark 中看到所有数据包。 但是,当我尝试以 100 的速率发送时,一些数据包(3-4)将无法到达网络,但是 sendto 没有返回任何错误。 我知道 sendto 只会将 txpacket 放入队列中,并且不会保证数据包在网络中的传递,但是我可以从那里获得丢包统计信息和内核中丢包的原因。 我尝试将接口的 txqueuelen 增加到 65000,但没有帮助。 我该如何调试这个问题?。
【问题讨论】:
-
我尝试使用以下命令检查发送缓冲区大小:getsockopt(socketFd_, SOL_SOCKET, SO_SNDBUF, &sendBuffSize, &buffLen);它显示了一个很大的值 sendBuffSize = 124928,我观察到每当我在系统调用 sendto() 后挂起的缓冲区大小达到 2040 时,它就会丢弃数据包(sendto 在这里成功返回),我正在使用 ioctl(socketFd_ , SIOCOUTQ, &outstandingBytes);我的问题是为什么 sendto 没有返回任何错误?是因为sendBuffSize 比outstandingBytes 大吗?谁能帮我调试这个问题?谢谢
-
在 sendto 之后再测试一个场景,如果我在再次调用 sendto 之前等待 outstatndingBytes 达到零,那么系统中不会有任何丢包
标签: c linux sockets linux-kernel raw-sockets