coLinux日記

coLinuxはフリーソフトを種として、よろずのシステムとぞなれりける。

PHPで、ソケット通信(UDP)をする。その1

2009-03-14 00:53:45 | php
前回までで、PHP でシリアルポートを使った、AQUOS用のリモコンができましたが、LANにつながっている別のコンピュータからも操作したくなりました。

そこで、ソケット通信を使ってみたいと思います。

この通信は送りつけるだけなので、UDP にしました。

ソケット通信メモ http://www.ne.jp/asahi/hishidama/home/tech/socket/index.htmlなどを参考にすると、UDP通信は、
  クライアント  サーバ
  socket        socket
                bind
                recvfrom (ここで、受信待ちになる)
  sendto                 (データを送信する)
  close	        close

の手順で行います。

さて、UDP通信の手順がわかったところで、具体的に PHP でどのような関数を使うのでしょうか。

PHP: PHP マニュアル - Manual http://www.php.net/manual/jp/で目次を見たところ、それらしいものはないようですが、「関数リファレンス」-> 「その他のサービス」-> 「ソケット」にありました。

この機能は、標準で準備されていますね。ただし、Windows では、

php_sockets.dll

を利用し、coLinux 等で、PHPをコンパイルしてインストールする場合は、

configure にオプション --enable-sockets を指定することにより使用可能になります

ので、注意が必要です。

マニュアルによると、create (上の手順で、socket にあたるもの)して得られるソケットを「ソケットリソース」と呼ぶようです。このソケットリソースを使って、データの送信や受信をするわけです。

先ほどの手順に、対応する PHP の関数を当てはめると、
  クライアント	   サーバ
  socket_create	   socket_create
                   socket_bind
                   socket_recvfrom
  socket_sendto
  socket_close     socket_close

になります。マニュアルを見ながら、各関数について調べていきたいと思います。

最初は、socket ソケットの生成です。今回の通信は、UDP なので、
  $socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);

です。$socket が、生成されたソケットリソースですね。

bind は、
  socket_bind($socket, IPアドレス, ポート番号);

と、サーバのIPアドレスを、127.0.0.1 のような文字列で指定でき、サーバが使うポート番号も指定できます。

recvfrom 受信は、PHPのマニュアルのサンプルどおりにしたほうが無難です。つまり、
  $from = "";
  $port = 0;
  socket_recvfrom($socket, $buf, 受け取る文字列長, 0, $from, $port);

です。これで指定されたポート番号で受信待ちになります。

一方 sendto 送信は、これも PHP のサンプルを参考に、
  socket_sendto($socket, $msg, 送る文字列長, 0, 
                  サーバのIPアドレス, サーバのポート番号);

です。

しかし、このマニュアルは本当に良くできていますね。各関数にサンプルプログラムがあるので分かりやすいです。次回、プログラムを作成しますが、このサンプルプログラムを大いに活用したいと思います。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする