首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >rawsocket sendto()一些数据包被丢弃,在网络中看不到

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

Stack Overflow用户
提问于 2014-02-17 12:24:20
回答 1查看 1.8K关注 0票数 3
代码语言:javascript
复制
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,但没有起到任何作用。如何调试此问题?

EN

回答 1

Stack Overflow用户

发布于 2014-02-20 16:36:10

您是正确的,sendto只会将txpacket放在队列中,而不保证传递。

来自sendto的iEEE文档:

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

您必须通过ioctl()和getsockopt()执行一些您自己的节流操作,就像您几乎要做的那样。我不认为你能指望网络栈为你做这一切。

类似于:

代码语言:javascript
复制
sendMsgThrottled( msg Msg ) {
    ioctl(socketFd_, SIOCOUTQ, &outstandingBytes);  
    if ( outStandingBytes < limit )
          sendto(socketFd_, ..)
    else
          queueMsg();  /* Or delay */
}

通过在同一台机器上设置发送和接收端来测试这一点,除了操作系统的网络层之外,数据包丢失还可以来自其他地方。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21829051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档