6

我是套接字编程的新手

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

int on = 1;

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

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

4

1 回答 1

10

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

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

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

如果您发布程序的其余部分或告诉我们一些有关它的信息,我们可能会提供帮助。

于 2014-03-01T16:29:26.577 回答