Edited at

AF_* とPF_*の違いについて

More than 1 year has passed since last update.

ソケットを使ってプログラムを書くときに

int socket(int domain, int type, int protocol);

の第一引数にAF_INETとPF_INETが使われることがあり、違いが気になったので調べて見た。

linuxのソースコードを確認したところ、


/include/linux/socket.h(v4.16.2)

/* Protocol families, same as address families. */

#define PF_UNSPEC AF_UNSPEC
#define PF_UNIX AF_UNIX
#define PF_LOCAL AF_LOCAL
#define PF_INET AF_INET
~~~以下略~~~

という記述があったので、linuxにおいてはどちらも変わらなそう

ただ、同ファイルでのsockaddr構造体の定義を見ると

struct sockaddr {

sa_family_t sa_family; /* address family, AF_xxx */
char sa_data[14]; /* 14 bytes of protocol address */
};

となっていたので、AF_*を使うのが無難そう

(PF_*を支持する理由としては、現在では廃止された古いバージョンのBSDでのsocketコールの継承性等があるそう1)


追記

stackorverflowにも同様のことが書いてあるが、

socket()にPF_*、bind()にAF_*を使うべきらしい2


結論

基本的には差がないのであまり気にしなくて良さそう


 参考ページ

Linuxソースコード

Man Page of Socket

stackorverflowの解説





  1. JonC.Snader著トップスタジオ訳「TCP/IPプログラミング徹底解説」より 



  2. ショーン・ウォルトン著 野村純子訳 「Linuxソケットプログラミング」より