2017-10-18 98 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),它是確定。