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


ソケットを使ってプログラムを書くときに
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])

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

追記

stackorverflowにも同様のことが書いてあるが、
socket()にPF_*、bind()にAF_*を使うべきらしい[^2]
[^2]: ショーン・ウォルトン著 野村純子訳 「Linuxソケットプログラミング」より

結論

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

 参考ページ

Linuxソースコード
Man Page of Socket
stackorverflowの解説