设置Don';使用UDP原始套接字的t片段标志 我写了一个C++程序,允许我在发送UDP包之前使用原始套接字(MACOS不支持设置)设置DF标志(不片段位)。

设置Don';使用UDP原始套接字的t片段标志 我写了一个C++程序,允许我在发送UDP包之前使用原始套接字(MACOS不支持设置)设置DF标志(不片段位)。,c++,c,sockets,C++,C,Sockets,我对网络编程比较陌生,我正在寻找这样做的资源/代码示例 我继续搜索,但所有的答案大部分都是使用setsockopt(),在我的案例中我并不能真正使用它。他们中的大多数人都提到使用原始套接字,但对于如何使用原始套接字来实现这一点,并没有详细的答案 我对原始套接字有基本的了解。我正在寻找一个实现这一点,我找不到。有没有人能告诉我一个代码示例/代码片段,或者简要解释一下如何使用原始套接字实现这一点?创建原始套接字 通过设置IP\u HDRINCLsocket选项启用对IP报头的访问: int hdri

我对网络编程比较陌生,我正在寻找这样做的资源/代码示例

我继续搜索,但所有的答案大部分都是使用
setsockopt()
,在我的案例中我并不能真正使用它。他们中的大多数人都提到使用原始套接字,但对于如何使用原始套接字来实现这一点,并没有详细的答案

我对原始套接字有基本的了解。我正在寻找一个实现这一点,我找不到。有没有人能告诉我一个代码示例/代码片段,或者简要解释一下如何使用原始套接字实现这一点?

创建原始套接字

通过设置
IP\u HDRINCL
socket选项启用对IP报头的访问:

int hdrincl=1;
if (setsockopt(fd,IPPROTO_IP,IP_HDRINCL,&hdrincl,sizeof(hdrincl))==-1) {
    die("%s",strerror(errno));
}
这些标志位于
struct ip
头的
ip\u off
字段中,该字段在
中声明。对于不分段标志,有一个宏
IP_DF

((struct ip*)&packet)->ip_off |= IP_DF;
填写IP和UDP报头以及UDP有效负载中的所有其余字段

发送数据包。

创建原始套接字

通过设置
IP\u HDRINCL
socket选项启用对IP报头的访问:

int hdrincl=1;
if (setsockopt(fd,IPPROTO_IP,IP_HDRINCL,&hdrincl,sizeof(hdrincl))==-1) {
    die("%s",strerror(errno));
}
这些标志位于
struct ip
头的
ip\u off
字段中,该字段在
中声明。对于不分段标志,有一个宏
IP_DF

((struct ip*)&packet)->ip_off |= IP_DF;
填写IP和UDP报头以及UDP有效负载中的所有其余字段


发送数据包。

你告诉它你想要它发送的数据包,它就会发送它。为了理解如何做第一部分,你必须学习IP和UDP是如何工作的。任何指向代码示例的链接都将真正有助于理解@user253751如果数据包不被碎片化,那又怎么样?如果它对于MTU来说太大,那么就把它放下?@user4581301——然后发回一条ICMP“需要碎片”消息。这就是Path MTU发现的工作原理。您需要什么样的“详细信息”?IP头中有一个
标志
字段。第1位是“不要框架”。所以只要做
iphdr.flags |=0x2你告诉它你想要它发送的数据包,它就会发送它。为了理解如何做第一部分,你必须学习IP和UDP是如何工作的。任何指向代码示例的链接都将真正有助于理解@user253751如果数据包不被碎片化,那又怎么样?如果它对于MTU来说太大,那么就把它放下?@user4581301——然后发回一条ICMP“需要碎片”消息。这就是Path MTU发现的工作原理。您需要什么样的“详细信息”?IP头中有一个
标志
字段。第1位是“不要框架”。所以只要做
iphdr.flags |=0x2
是否需要使用
getaddrinfo()
bind()
将原始套接字绑定到地址?我不确定。阅读一篇关于原始套接字的教程,了解如何在一般情况下使用它们。另外,如果我使用的是“netinet/ip.h”,它没有iphdr,而是struct ip,该怎么办。那么DF位的设置看起来如何?我已经用
struct ip
的正确字段更新了答案。这是正确设置IPv4和IPv6的DF位的方法?我是否需要使用
getaddrinfo()
bind()
将原始套接字绑定到一个地址?我不确定。阅读一篇关于原始套接字的教程,了解如何在一般情况下使用它们。另外,如果我使用的是“netinet/ip.h”,它没有iphdr,而是struct ip,该怎么办。那么DF位的设置看起来如何?我已经用正确的
struct ip
字段更新了答案。这是正确设置IPv4和IPv6的DF位的方法吗?