創建套接字文件是否需要 AF_INET?
關於為
AF_INET
.為了
AF_UNIX
在同一主機內通話,我們創建套接字文件範例/tmp/name_of_the_socket_file
怎麼樣
AF_INET
,它需要創建套接字文件嗎?AFAIK,我不需要創建套接字文件
AF_INET
,我可以與簡單的客戶端和伺服器模型進行通信。我的同事告訴我我需要為
AF_INET
IP地址作為文件名創建套接字文件,我不明白有人可以澄清我嗎?
我的同事告訴我我需要為
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 地址,並以各種形式(單播、多播、廣播……)創建通信。相關資料: