關於PF_INET和AF_INET的區別

在寫網絡程序的時候,建立TCP socket:
sock = socket(PF_INET, SOCK_STREAM, 0);
然後在綁定本地地址或連接遠程地址時需要初始化sockaddr_in結構,其中指定address family時一般設置爲AF_INET,即使用IP。

相關頭文件中的定義:AF = Address Family
PF = Protocol Family
AF_INET = PF_INET

在windows中的Winsock2.h中,

                #define AF_INET 0
                #define PF_INET AF_INET

所以在windows中AF_INET與PF_INET完全一樣.

而在Unix/Linux系統中,在不同的版本中這兩者有微小差別.對於BSD,是AF,對於POSIX是PF.

理論上建立socket時是指定協議,應該用PF_xxxx,設置地址時應該用AF_xxxx。當然AF_INET和PF_INET的值是相同的,混用也不會有太大的問題。也就是說你socket時候用PF_xxxx,設置的時候用AF_xxxx也是沒關係的,這點隨便找個TCPIP例子就可以驗證出來了。如下,不論是AF_INET還是PF_INET都是可行的,只不過這樣子的話,有點不符合規範。

在函數socketpair與socket的domain參數中有AF_UNIX,AF_LOCAL,AF_INET,PF_UNIX,PF_LOCAL,PF_INET.
這幾個參數有AF_UNIX=AF_LOCAL, PF_UNIX=PF_LOCAL, AF_LOCAL=PF_LOCAL, AF_INET=PF_INET.
但是對於socketpair與socket的domain參數,使用PF_LOCAL系列,
而在初始化套接口地址結構時,則使用AF_LOCAL.
例如:
z = socket(PF_LOCAL, SOCK_STREAM, 0);
adr_unix.sin_family = AF_LOCAL;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章