设置套接字选项为什么对ICMP请求中的套接字(IP_HDRINCL)如此重要?

问题描述 投票:6回答:1

我是套接字编程的新手

我看到了一个ICMP request程序,因为他们使用了setsockopt到套接字

int on = 1;

setsockopt(s, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on))

但是即使我不使用此语句,程序也可以正常运行。为什么会这样重要的是要向内核提及这个包含IP结构的套接字吗?

c sockets kernel icmp setsockopt
1个回答
8
投票

IP_HDRINCL选项执行以下操作(来自手册页:

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

大概您的程序正在构造IP标头。如果删除此选项,它将使用内核的IP标头。是否“起作用”取决于程序的作用。也许在某些情况下,它想自定义IP标头,但删除该标头将无法正常工作。

如果您发布程序的其余部分或向我们介绍一些内容,我们也许可以提供帮助。

© www.soinside.com 2019 - 2024. All rights reserved.