Help us understand the problem. What is going on with this article?

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ソケットプログラミング」より 

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away