關於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都是可行的,只不過這樣子的話,有點不符合規范。

 /* 服務器端開始建立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;

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM