在寫網絡程序的時候,建立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