5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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)

追記

stackorverflowにも同様のことが書いてあるが、
socket()にPF_*、bind()にAF_*を使うべきらしい2

結論

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

 参考ページ

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

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

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

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?