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,但它没有帮助。 我该怎么调试这个问题?。
答案 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 */
}
我会通过将发送和接收器放在同一台机器上进行测试,丢包可以来自操作系统网络层以外的其他地方。