--
----------------------------------------
Kousuke Tanzaki(xa...@tka.att.ne.jp)
- To be a universal joint of the world -
----------------------------------------
> ソケットのプログラミングで、AF_UNIXというのとPF_UNIXというのを
> 使いますが、この2つの違い(使い分け)をご存じの方、教えてください。
> 「どっちも同じだ」というのは違うと聞いています。事実上そう使われて
> いるとしても。
> 私は勝手に、AFはaddress family、PFはprotocol familyだから、
> socket()を呼び出すときの引数はPFのほう、相手のアドレスを
> 記述する構造体に入れるのはAFのほう、じゃないかと思っていました。
W.R.Stevens「UNIX ネットワークプログラミング」(トッパン)
には「どっちも同じだ」と書いてあります。また
S.A.Rago「UNIX ネットワークプログラミング」(Addison Wesley)
も同様です。
>AFはaddress family、PFはprotocol familyだから
この解釈はこれで良い様です。
ただ両者で「どっちも同じだ」と言えるように
AF_UNIX と PF_UNIX の値が定義されているとのことです。
>> 私は勝手に、AFはaddress family、PFはprotocol familyだから、
>> socket()を呼び出すときの引数はPFのほう、相手のアドレスを
>> 記述する構造体に入れるのはAFのほう、じゃないかと思っていました。
私もそのように認識しています。
自分が記述するプログラムについては、
全てそう区別して記述してあります。
>> 前、Douglas Comer(スペル怪しい)の本に書いてあると聞いて、
>> 探したのですが見つからなくて...
残念ながら私はこの本については知りません。
しかし、ちょっと関連した事柄を思い出しました。
確かSunOS4のオンライン マニュアルには
man socketで出てくる解説に、PF_XXXをsocketを
生成する時に与えるパラメータとして利用するように
記述されていたように思います。
Kenji Arisawa wrote
in article <ErL27...@vega2.aichi-u.ac.jp>
>> > 私は勝手に、AFはaddress family、PFはprotocol familyだから、
>> > socket()を呼び出すときの引数はPFのほう、相手のアドレスを
>> > 記述する構造体に入れるのはAFのほう、じゃないかと思っていました。
>>
>> W.R.Stevens「UNIX ネットワークプログラミング」(トッパン)
>> には「どっちも同じだ」と書いてあります。また
>> S.A.Rago「UNIX ネットワークプログラミング」(Addison Wesley)
>> も同様です。
どちらの書籍も資料として重宝するのは確かですが、
いずれも既存の処理系を観察した上での紹介という性質のものです。
そして前者は(今となっては)古い記述であり、
載っているソースコードをそのまま動かすのは困難な状況になっています。
(私はDEC OFS/1ではそのままでは動作しないことを知っています。)
私は前者は邦訳版ではなくオリジナルしか読んでいません。
ですが「どちらも同じ」という記述ではなく、
Tanzakiさんが述べられているように、
「使い分けを考えられていたが、事実上同じ値である」という
記述であったような気がします。
ちょっと手元に書籍が無いので詳しい記述位置は示せません。
違っていたらごめんなさい。
xa...@tka.att.ne.jp (Kousuke Tanzaki) writes:
> ソケットのプログラミングで、AF_UNIXというのとPF_UNIXというのを
> 使いますが、この2つの違い(使い分け)をご存じの方、教えてください。
> 「どっちも同じだ」というのは違うと聞いています。事実上そう使われて
> いるとしても。
> 私は勝手に、AFはaddress family、PFはprotocol familyだから、
> socket()を呼び出すときの引数はPFのほう、相手のアドレスを
> 記述する構造体に入れるのはAFのほう、じゃないかと思っていました。
> 前、Douglas Comer(スペル怪しい)の本に書いてあると聞いて、
> 探したのですが見つからなくて...
その通りなんですけど、(protocol family とaddress familyだから)Richard
Stevensの本ではどっちでも同じってなってますし、事実、どちらかはもう片
方へのマクロだったりする。また、(少なくともネットワークの)カーネルの中
では同じ値だからこそってコードも散見されますし。
まあ、「ソース重視」ってことだと、ちゃんとかき分けるのが良いかな。って
思ってます。
--
___ わしは、山吹色のかすてーらが大好きでのぅ
[[o o]] ふぉっふぉっふぉ
'J' 森下 お代官様 MaNMOS 英夫@ステラクラフト
PGP Finger = CD EA D5 A8 AD B2 FE 7D 02 74 87 52 7C B7 39 37
> 私は前者は邦訳版ではなくオリジナルしか読んでいません。
> ですが「どちらも同じ」という記述ではなく、
> Tanzakiさんが述べられているように、
> 「使い分けを考えられていたが、事実上同じ値である」という
> 記述であったような気がします。
邦訳版には確かに「どっちでも同じ」旨が書いてありました。最近この
W.Richard Stevens の 2nd edition を買ったんですが、AF_ と PF_ の
混乱ぶりについてなかなか興味深い話が述べられています(p.88)。簡単
に要約して引用しますと、
・BSD/OS 2.1 の socket を使用した137 のプログラム中、AF_ を使っ
ているのが 143 個所、PF_ はたった8 個所だけ。
・これらの同様なマクロ定数が誕生した理由は 4.1cBSD の頃にさかのぼ
るが、ここで PF_ の値を必要とした sockproto 構造体は 4.4BSD ではも
はやカーネル内部でしか使用されていない。しかも最初は"protocol
family" と書いてあったコメントも今では "address family" と変更さ
れている。
・ socket の引数と比較される値が、カーネルの内部でも AF_ で初期
化されていたり PF_ で初期化されていたりする。
・一時期の 4.2 BSD のsocket のマニュアルでは AF_ を使用するよう
な記述があった。
・Posix.1g ではそれぞれを使い分けるように記述されているが、
socket とアドレス構造体の値のどちらにも使うように意図されてい
るはずのaddrinfo 構造体のメンバは実は一個しかない。
***
Richard Stevens 氏は、PF_ と AF_ の値が違っている場合に動かなく
なることを危惧して、「このテキストでは全て AF_ を使う」というス
タンスのようですね。
私も個人的には使い分けた方が良いとは思っているのですが、上記のよ
うな現実を見せられると、なんか苦労が報われないような気がしてきます。
--
Keisuke MORI / NTT Software Corp. California Branch
E-Mail: k...@ntts.com