Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 带有gso的UDP不';我没有收到完整的信息_C++_C_Networking_Tcp_Udp - Fatal编程技术网

C++ 带有gso的UDP不';我没有收到完整的信息

C++ 带有gso的UDP不';我没有收到完整的信息,c++,c,networking,tcp,udp,C++,C,Networking,Tcp,Udp,我正在尝试使用UDP和GSO(通用分段卸载)来发送50Kb大小的数据包 // sender side int val = 1472; // ETHERNET - udp - upv4 header if (setsockopt(fdt, SOL_UDP, UDP_SEGMENT, &val, sizeof(val))) error(1, errno, "setsockopt udp segment"); int ret = sendmsg(fd, msg,

我正在尝试使用UDP和GSO(通用分段卸载)来发送50Kb大小的数据包

// sender side 
int val = 1472; // ETHERNET - udp - upv4 header
if (setsockopt(fdt, SOL_UDP, UDP_SEGMENT, &val, sizeof(val)))
    error(1, errno, "setsockopt udp segment");
int ret = sendmsg(fd, msg, flags);
至于recv的尺寸,我知道

// recv side 
int ret = recvmsg(fd, msg, flags);
我可以看到,我发送了50Kb的消息,接收方只收到了1472个呼叫。我听说过GRO(通用接收卸载),但我没有在网上找到任何例子。我是否必须进行多个系统调用以获取所有数据,是否可以设置socekt选项或进行系统调用以一次性接收重新组装的消息?如果我必须进行多个系统调用,而不是仅仅依靠IP碎片和发送比MTU更大的数据包,那么如何提高效率呢?

这里有一个有趣的内容,您可以阅读以深入了解GSO和GROEthtool可以在特定接口上启用/禁用GRO。取决于版本。如果你能很好地使用它,那就最好了

如果不是,因为Linux网络堆栈非常复杂,很难仅仅通过结果来检查哪个部分导致了段失败。我认为最好使用一些工具,如netstat、ss、sar、tcpdump、wireshark和其他工具来分析每一层,这样就更容易知道哪里出错了。但别忘了检查您的硬件是否支持此功能。

这里有一篇有趣的文章,您可以深入了解GSO和GROEthtool可以在特定接口上启用/禁用GRO。取决于版本。如果你能很好地使用它,那就最好了


如果不是,因为Linux网络堆栈非常复杂,很难仅仅通过结果来检查哪个部分导致了段失败。我认为最好使用一些工具,如netstat、ss、sar、tcpdump、wireshark和其他工具来分析每一层,这样就更容易知道哪里出错了。但是别忘了检查你的硬件是否支持这个。

发送大小过大的UDP包不是我所能信任的,尤其是你在中间有多少层的NAT和状态防火墙。你不能把传输分成更小的数据块,或者用TCP来传输它吗?正如1472(ish)所说的,这是关于你对碎片化数据包序列的第一个数据包的期望值。@tadman:我确信一个recvmsg只收到了碎片化消息序列中第一个数据包的1472,我认为UDP GRO应该重新组合所有碎片数据包并返回整个消息。@tadman:另外,数据通过以太网在直接连接的ECU之间传输。没有重新路由,NAT或任何东西。1472几乎是我们可以发送的最大安全数据包。UDP数据包理想情况下大约为576个八位字节,并且您永远不希望发送导致数据包大于路径MTU的数据包(您可以使用PMTUD来发现路径中最小的MTU)。您将丢失数据报,数据报越小,丢失的数据就越少。此外,智能站点现在有防火墙丢弃分组片段(第一个通过,但其余的片段被丢弃)以防止碎片攻击。发送大小过大的UDP包不是我所信任的,特别是在中间有多少层NAT和状态防火墙。你不能把传输分成更小的数据块,或者用TCP来传输它吗?正如1472(ish)所说的,这是关于你对碎片化数据包序列的第一个数据包的期望值。@tadman:我确信一个recvmsg只收到了碎片化消息序列中第一个数据包的1472,我认为UDP GRO应该重新组合所有碎片数据包并返回整个消息。@tadman:另外,数据通过以太网在直接连接的ECU之间传输。没有重新路由,NAT或任何东西。1472几乎是我们可以发送的最大安全数据包。UDP数据包理想情况下大约为576个八位字节,并且您永远不希望发送导致数据包大于路径MTU的数据包(您可以使用PMTUD来发现路径中最小的MTU)。您将丢失数据报,数据报越小,丢失的数据就越少。此外,智能站点现在有防火墙丢弃数据包碎片(第一个经过,但其余的碎片被丢弃),以防止碎片攻击。