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,但没有起到任何作用。如何调试此问题?
发布于 2014-02-20 16:36:10
您是正确的,sendto只会将txpacket放在队列中,而不保证传递。
来自sendto的iEEE文档:
成功完成对sendto()的调用并不能保证消息的传递。返回值-1仅表示本地检测到的错误。
您必须通过ioctl()和getsockopt()执行一些您自己的节流操作,就像您几乎要做的那样。我不认为你能指望网络栈为你做这一切。
类似于:
sendMsgThrottled( msg Msg ) {
ioctl(socketFd_, SIOCOUTQ, &outstandingBytes);
if ( outStandingBytes < limit )
sendto(socketFd_, ..)
else
queueMsg(); /* Or delay */
}通过在同一台机器上设置发送和接收端来测试这一点,除了操作系统的网络层之外,数据包丢失还可以来自其他地方。
https://stackoverflow.com/questions/21829051
复制相似问题