2017-10-18 96 views
0

我搞乱了C语言中的套接字,并且这个协议继续出现,我找不到任何关于它的东西,那么它用于什么? HOPOPT和IP有什么区别?什么是HOPOPT协议,以及socket()如何工作?

而且我是不明白为什么socket()函数的最后一个参数应该是0。根据手册页:

该协议规定一个特定的协议与插座使用。通常只有一个协议支持特定协议族中的特定套接字类型,在这种情况下协议可以被指定为0.但是,可能存在许多协议,在这种情况下,必须在此指定特定的协议方式。要使用的协议号码是特定于要进行通信的“通信域”的;见协议(5)。请参阅getprotoent(3)了解如何将协议名称字符串映射到协议号码。

据我所知,将最后一个参数设置为0会让标准库决定使用哪种协议,但在这种情况下会使用0以外的数字吗?

+0

“在这种情况下,将一个使用除0以外的数。” >> _However,它是可能的许多协议可能存在,在这种情况下,一个特定的协议必须在此manner._ –

+0

@SouravGhosh指定,我希望看到一个真实的例子,那就是我的意思 – Trey

回答

0

HOPOPT是Hop-by-Hop IPv6 extension header的首字母缩写。它是一个头部,可以为IPv6数据包添加更多选项。 IPv6数据包包含此标头是正常的。

socket()是BSD和其他人(Linux等)提供的用于创建新套接字的系统调用,即网络连接的内部表示。在创建新套接字时,必须指定所需的协议:TCP,UDP等,这些协议可以通过IPv4,IPv6等。

您引用的段落解释了每个协议可能存在一个或多个协议套接字类型。

如果只有一个存在,参数必须是零。例如,SOCK_STREAM套接字只通过TCP实现:

int sk = socket(AF_INET, SOCK_STREAM, 0); 

如果有存在,比你必须指定要使用的协议尤其如此。例如,SOCK_SEQPACKET类型都可以通过SCTP协议来实现:

int sk = socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP); 

所以,结论是:

  • 如果你想创建一个插座,选择使用什么协议,如TCP过IPv4的。
  • HOPOPT是在IPv6数据包完全正常。如果你看到它出现在你的痕迹,因为你创建了一个IPv6套接字(使用AF_INET6),它是确定。