[PHP-users 17021]Re: UDPブロードキャストを受け取るには?

KOYAMA Tetsuji koyama @ hoge.org
2003年 7月 28日 (月) 22:52:20 JST


  小山です。

At Mon, 28 Jul 2003 22:29:52 +0900,
Osamu Shigematsu wrote:
> > <?php
> > $sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
> > if (!$sock) {
> >   die('socket_create error: ' . socket_strerror());
> > }
> > 
> > $port = 9988;
> > $addr = '0.0.0.0';
> > 
> > socket_bind($sock, $addr, $port);
> > $buf = socket_read($sock, 100, PHP_BINARY_READ);
> > ?>
> 
> ありがとうございます。
> bind したら、いきなり socket_read() でいいんですね。
> 
> けど、UDP って、飛んでこなかったりするし、そういう時どうなるのかしら、
> とか思ったりします。

  通常 socket_read はパケットを読み取れる状態になるまでブロックします。
つまり socket_read を呼び出したところでプログラムが一時停止するわけで
すね。

  これを避けるには、socket_select でタイムアウトを指定して一定時間で処
理が戻るようにするか、socket_set_nonblock でノンブロッキングモードにし
て、適当に sleep しながらパケットが来るまで呼びつづければよいと思いま
す。

# C のソケットプログラミングの本を読むと、この辺は詳しく書いてあります。

> PEAR も眺めてみたんですが、TCP の Server はあるけど、
> UDP だとかはないですね?

  Net_Socket も見てみましたが、これは完全に TCP しか相手にしてないです
 ねぇ。

-- 
	小山 哲志@ビート・クラフト
	koyama @ beatcraft.com
	koyama @ hoge.org


PHP-users メーリングリストの案内