gpt4 book ai didi

sockets - 原始套接字接收缓冲区

转载 作者:行者123 更新时间:2023-12-03 11:52:41 25 4
gpt4 key购买 nike

我们目前正在测试 IP 上的电信应用程序。我们打开一个原始套接字并从远程端接收消息(msgrate@750+msgs/second 大约 180 字节,不包括 IP)。

在原始套接字的顶部有一个称为 SCTP(就像 TCP)的层,它时不时地指示它丢失了一些数据包。现在,我们在接收节点上运行 Wireshark,我们可以在 Wireshark 中看到该数据包。

在我看来,套接字的接收缓冲区很小,导致 IP(?) 丢弃消息。但是,IP Pegs(netstat -sv) 显示没有丢弃的数据包。我们尝试将套接字接收队列设置为 40000,但没有成功。

我很感激任何关于我们应该配置 IP 层的选项(如果有的话)或者是否有任何我们需要设置的特定套接字选项的指针。

最佳答案

感谢您的投入。但是,我们已经能够“解决”这个问题。
早些时候,我描述了我们如何阅读消息。
一旦 select 返回,我们就会运行一个循环(调整要读取的原始消息数量,在我们的例子中是 >1)。
1)我们调用ioctl(FIONREAD)来查找要读取的字节数;
2) 通过调用 recvfrom 读取那么多字节
3)将字节发送给用户
4)再次进入循环并调用ioctl(FIONREAD)然后重复步骤

但是,在第 4 点,ioctl(FIONREAD) 使用返回 0。我们的代码进行了防御性检查。它是期望的,来自 ioctl(FIONREAD) 的 0 字节意味着发送方已发送一个具有 0 有效负载的 IP header 。因此,它使用调用 recvfrom(bytes to read=0) 来清除 IP header ,以免选择再次设置。

在时间 t0,ioctl(FIONREAD) 返回 0 作为要读取的字节数
在时间 t1,调用 recvfrom(bytes to read=0)。
有时,在 t0 和 t1 之间,实际数据用于在套接字接收队列中排队并用于在我们调用 recvFrom(bytes=0) 时被丢弃。

设置,rawMsgsToRead=1 的数量已经“解决”了这个问题。但是,我的猜测是它会影响我们的表现。是它们的任何 ioctl 调用,它可以区分队列中的八位字节为 0 和有效载荷为 0 的 IP header

关于sockets - 原始套接字接收缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/784748/

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