gpt4 book ai didi

c++ - 如何在套接字上设置不分段(DF)标志?

转载 作者:可可西里 更新时间:2023-11-01 16:27:01 29 4
gpt4 key购买 nike

我正在尝试设置 DF(不分段标志)以使用 UDP 发送数据包。

正在看 Richard Steven 的书 Volume 1 Unix Network Programming; Sockets Networking API,我找不到如何设置它。

我怀疑我会用 setsockopt() 来做,但在第 193 页的表中找不到它。

请建议这是如何完成的。

最佳答案

您可以使用 IP_DONTFRAG 选项调用 setsockopt() 来完成此操作:

int val = 1;
setsockopt(sd, IPPROTO_IP, IP_DONTFRAG, &val, sizeof(val));

Here's进一步详细解释这一点的页面。

对于 Linux,您似乎必须使用值为 IP_PMTUDISC_DOIP_MTU_DISCOVER 选项(或 IP_PMTUDISC_DONT 将其关闭):

int val = IP_PMTUDISC_DO;
setsockopt(sd, IPPROTO_IP, IP_MTU_DISCOVER, &val, sizeof(val));

我还没有对此进行测试,只是查看了头文件和一些网络搜索,所以您需要对其进行测试。

关于是否有其他方法可以设置 DF 标志:

I find nowhere in my program where the "force DF flag" is set, yet tcpdump suggests it is. Is there any other way this could get set?

从这个优秀的页面here :

IP_MTU_DISCOVER: Sets or receives the Path MTU Discovery setting for a socket. When enabled, Linux will perform Path MTU Discovery as defined in RFC 1191 on this socket. The don't fragment flag is set on all outgoing datagrams. The system-wide default is controlled by the ip_no_pmtu_disc sysctl for SOCK_STREAM sockets, and disabled on all others. For non SOCK_STREAM sockets it is the user's responsibility to packetize the data in MTU sized chunks and to do the retransmits if necessary. The kernel will reject packets that are bigger than the known path MTU if this flag is set (with EMSGSIZE).

在我看来,您可以使用 sysctl 设置系统范围的默认值:

    sysctl ip_no_pmtu_disc

在我的系统上返回 "error: "ip_no_pmtu_disc"is an unknown key" 但它可能是在你的系统上设置的。除此之外,我不知道还有什么其他因素(除了前面提到的 setsockopt())会影响设置。

关于c++ - 如何在套接字上设置不分段(DF)标志?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/973439/

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