set socket选项为什么对套接字如此重要(IP_HDRINCL)在ICMP请求中?

Siv*_*nan 6 c sockets kernel icmp setsockopt

我是socket编程的新手

我看到了一个ICMP请求程序,因为他们习惯setsockopt了socket

int on = 1;

setsockopt(s, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on))
Run Code Online (Sandbox Code Playgroud)

但即使我不使用此语句,程序也能正常运行.为什么提到内核这个套接字包括IP结构如此重要?

abl*_*igh 8

该IP_HDRINCL选项执行以下操作(从手册页):

除非在IP_HDRINCL套接字上启用套接字选项,否则IPv4层在发送数据包时会生成IP标头.启用后,数据包必须包含IP标头.用于接收IP报头始终包含在数据包中.

大概你的程序正在构建一个IP头.如果删除此选项,它将使用内核的IP标头.这是否"有效"取决于您的计划的作用.也许在某些情况下,它想要自定义IP标头,并删除它将无法正常工作.

如果您发布该计划的其余部分或告诉我们一些相关信息,我们可能会提供帮助.