At Sat, 2 Jun 2001 22:01:04 +0900, ebihara wrote: > inetd 経由で起動する tcpのサーバは、inetdが標準入出力とtcpソケットを > つなげてくれますが、udpのサーバはいったいどうなるのでしょうか? 瑣末なことですが、inetd によって起動されるプログラムの 標準入出力はソケットそのものです。TCP の場合、相手から コネクトされると inetd が accept(2) を実行し、それで 得たソケットを起動するプログラムの標準入出力にします。 dup2(2) でソケットを 0, 1, 2 に割り当て直しているだけ ですので、「標準入出力とtcpソケットをつなげて」いるわけ ではありません。 > inetd.conf に dgram udp で指定できるという事は、 > 1. udpパケットが指定ポートに到着 > 2. inetd が処理プログラムを起動 > > tcpならばinetdがソケットと標準入出力をつないだ状態で起動してくれ > ますが、udpはコネクションレスなのでソケットがつながった状態では > ないですよね?? ここまではその通り。 > udpプログラムのほうで独自に相手方に対して返信を投げるのは可能と思いますが、 > 自分自身のポートはinetdによってすでに bind() されてしまっているので > 追加のデータは受信できないし。。。 できます。なんせ最初のパケットを受信したソケットそのもの だからです。 ただし、このままでは当該のソケットは対抗側が wildcard の ままですから、どこからパケットが来ても受信してしまいます。 そこで、tftp などは次のようなことをやります。 1. まず受信したパケットを recvfrom(2) で相手のアドレスともども 取り込む。 2. 自分のアドレスを getsockname(2) で調べる。 3. 標準入出力を閉じる。 4. 改めて socket(2) で新しいソケットを作り、2 で調べたアドレスを bind(2) する。 2 で得た自分のアドレスは、受信したパケットの destination に書いて あったアドレス。一方 inetd が listen しているのは wildcard なので カチ合うことなく bind できる。 5. 1 で得たアドレスに connect(2)。 6. 以降のやりとりは新しいソケットで続ける。 5 で connect が成功して以降は、connect した相手からのパケットに 限っては connect しているソケットで受信され、inetd のソケットでは 受信されません。 -- Naoto Shimazaki
References:
- Prev by Subject: [linux-users:84054] Re: LinuxのNFSとMacOSX
- Next by Subject: [linux-users:84056] Re: 複数の接続回線の併用。
- Previous by thread: [linux-users:84048] inetd経由のudpサーバ
- Next by thread: [linux-users:84064] dhcpd.leasesのabandoned
- Indexes:[Main][Thread]