LoginSignup
5
5

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-04-15

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

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5