Tcp

創建套接字文件是否需要 AF_INET?

  • February 28, 2018

關於為AF_INET.

為了AF_UNIX在同一主機內通話,我們創建套接字文件範例/tmp/name_of_the_socket_file

怎麼樣AF_INET,它需要創建套接字文件嗎?

AFAIK,我不需要創建套接字文件AF_INET,我可以與簡單的客戶端和伺服器模型進行通信。

我的同事告訴我我需要為AF_INETIP地址作為文件名創建套接字文件,我不明白有人可以澄清我嗎?

我的同事告訴我我需要為AF_INET

你的同事錯了。看看bind(2)你的手冊頁可以看到不同的套接字類型有規則:

名稱綁定中使用的規則因地址族而異。有關詳細資訊,請參閱第 7 節中的手冊條目。對於AF_INET,見ip(7);對於AF_INET6,見ipv6(7);對於AF_UNIX,見packet(7);對於AF_X25,見x25(7);對於AF_NETLINK,請參見netlink(7)

您將看到ip(7)沒有涉及AF_INET可以創建文件的呼叫。還有一篇很棒的IBM 論文,介紹了這種套接字結構和一些關於它的歷史。遺留結構形式(BSD 4.4/Unix 98):

struct sockaddr_in {
 uint8_t         sin_len;
 sa_family_t     sin_family;
 u_short         sin_port;
 struct in_addr  sin_addr;
 char            sin_zero[8];
};

目前結構:

struct sockaddr_in {
   sa_family_t    sin_family; /* address family: AF_INET */
   in_port_t      sin_port;   /* port in network byte order */
   struct in_addr sin_addr;   /* internet address */
};

/* Internet address. */
struct in_addr {
   uint32_t       s_addr;     /* address in network byte order */
};

看,沒有提到任何文件創建。

引用手冊頁的其他部分ip(7)關於這種 socket( AF_INET) 的工作原理:

當一個程序想要接收新的傳入數據包或連接時,它應該使用 . 將套接字綁定到本地介面地址bind(2)。在這種情況下,只有一個 IP 套接字可以綁定到任何給定的本地(地址、埠)對。當INADDR_ANY在綁定呼叫中指定時,套接字將綁定到所有本地介面。在listen(2)未綁定的套接字上呼叫時,套接字會自動綁定到本地地址設置為的隨機空閒埠INADDR_ANY。當 connect(2)在未綁定的套接字上呼叫時,套接字會自動綁定到隨機空閒埠或本地地址設置為 的可用共享埠INADDR_ANY

–剪輯–

地址格式

IP 套接字地址定義為 IP 介面 ***地址和 16 位埠號的組合。***基本 IP 協議不提供埠號,它們由更高級別的協議實現,如 udp(7) 和 tcp(7)。在原始套接字上,sin_port 設置為 IP 協議。

但是,如果您查看unix(7)手冊頁,您會看到一些AF_UNIX套接字類型及其基本結構的範例。甚至還有一個稱為sun_path套接字文件路徑的欄位(請參閱下面的相關資料):

#define UNIX_PATH_MAX    108

struct sockaddr_un {
 sa_family_t sun_family;               /* AF_UNIX */
 char        sun_path[UNIX_PATH_MAX];  /* pathname */
};

tl,dr: AF_UNIX用於套接字(它們使用文件),而AF_INET用於綁定到 IP 地址,並以各種形式(單播、多播、廣播……)創建通信。

相關資料:

引用自:https://unix.stackexchange.com/questions/427207