rawsocket sendto()一些数据包被丢弃而在网络中看不到

时间:2014-02-17 12:24:20

标签: c linux sockets linux-kernel raw-sockets

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,但它没有帮助。 我该怎么调试这个问题?。

1 个答案:

答案 0 :(得分:1)

你是正确的,sendto只会把txpacket放入队列而不保证交付。

来自sendto的iEEE文档:

成功完成对sendto()的调用并不能保证传递消息。返回值-1表示仅检测到本地检测到的错误。

你必须通过ioctl()和getsockopt()执行一些自己的限制,就像你几乎要做的那样。我不认为您可以期待网络堆栈为您完成所有工作。

类似的东西:

sendMsgThrottled( msg Msg ) {
    ioctl(socketFd_, SIOCOUTQ, &outstandingBytes);  
    if ( outStandingBytes < limit )
          sendto(socketFd_, ..)
    else
          queueMsg();  /* Or delay */
}

我会通过将发送和接收器放在同一台机器上进行测试,丢包可以来自操作系统网络层以外的其他地方。