gpt4 book ai didi

c - rawsocket sendto() 一些数据包被丢弃并且在网络中看不到

转载 作者:太空狗 更新时间:2023-10-29 11:19:20 27 4
gpt4 key购买 nike

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 放入队列中,并且不会保证网络中的数据包传递,但是从那里我可以获得丢包统计信息和内核中丢包的原因。我尝试将接口(interface)的 txqueuelen 增加到 65000,但没有帮助。我该如何调试这个问题?

最佳答案

你说得对,sendto 只会将 txpacket 放入队列中,并不保证交付。

来自 sendto 的 iEEE 文档:

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

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

类似于:

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

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

关于c - rawsocket sendto() 一些数据包被丢弃并且在网络中看不到,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21829051/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com