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

时间:2014-03-01 16:19:58

标签: c sockets kernel icmp setsockopt

我是socket编程新手

我看到 ICMP请求程序,因为他们使用setsockopt到套接字

int on = 1;

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

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

1 个答案:

答案 0 :(得分:7)

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

  

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

据推测,您的程序正在构建IP标头。如果删除此选项,它将使用内核的IP标头。这是否“有效”取决于您的计划的作用。也许在某些情况下,它想要自定义IP标头,并删除它将无效。

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