[Subject Prev][Subject Next][Thread Prev][Thread Next][Subject Index][Thread Index]

[linux-users:84055] Re: inetd経由のudpサーバ


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

この情報があなたの探していたものかどうか選択してください。
yes/まさにこれだ!   no/違うなぁ   part/一部見つかった   try/これで試してみる

あなたが探していた情報はどのようなことか、ご自由に記入下さい。特に「まさにこれだ!」と言う場合は記入をお願いします。
例:「複数のマシンからCATV経由でipmasqueradeを利用してWebを参照したい場合の設定について」
References: