關於PF_INET和AF_INET的區別

http://blog.csdn.net/xiongmaojiayou/article/details/7584211


   在寫網絡程序的時候,建立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都是可行的,只不過這樣子的話,有點不符合規範。

 /* 服務器端開始建立socket描述符 */
// if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) 
 if((sockfd=socket(PF_INET,SOCK_STREAM,0))==-1) 
 {
 fprintf(stderr,"Socket error:%s\n\a",strerror(errno));
 exit(1);
 }
 /* 服務器端填充 sockaddr結構 */ 
 bzero(&server_addr,sizeof(struct sockaddr_in));
 server_addr.sin_family=AF_INET;
 //server_addr.sin_family=PF_INET;
 server_addr.sin_addr.s_addr=htonl(INADDR_ANY);
 server_addr.sin_port=htons(portnumber);


 在函數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;


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