• ベストアンサー

ソケット通信におけるデータ送信手法

ソケット通信ができるサーバプログラムをPHPにて組んでいますが、疑問があります。 Server/Clientの形で、PHPでくんだServer側はListenして通信を待っているのですが、仮に、サーバ側から任意のタイミングで通信を発生させることは可能なのでしょうか。 これが1点です。 あと、1つのサーバプログラムに対して、複数のクライアントが接続するようなパターンは作成可能なのでしょうか。 暗中模索のため、難儀しています。 ご教示いただければ幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
  • lv4u
  • ベストアンサー率27% (1862/6715)
回答No.1

>>仮に、サーバ側から任意のタイミングで通信を発生させることは可能なのでしょうか。 これが1点です。  ソケット通信のサーバ側プログラムとはいえ、所詮はプログラムですから、クライアントが接続中のとき、送信命令を発行すれば可能ですね。  クライアントが接続していないときは、当然ながら無理です。 >>あと、1つのサーバプログラムに対して、複数のクライアントが接続するようなパターンは作成可能なのでしょうか。  Webサーバ下で、普通にPHPでプログラムを書けば、1つのプログラムで複数ユーザ(クライアント)を接続できますよね。これができないと多くのWebサイトは困りますから。ただし、この場合、クライアントとの接続処理などのサーバ中核部分は、CとかC++で作られていて、サブルーチン的にPHPが動作しているといえます。  で、PHPでソケット部分まで書くのであれば、C++やCが行っている手法と同じようにすれば、可能だと思います。この場合、fork(pcntl_fork)を使うことになるようです。もちろん、forkした時点で2つのプロセスが動作することになるので、”1つのサーバプログラム”と言えるかどうかという点はあります。  Cで記述されたサーバプログラムは書籍やサンプルに沢山あると思いますので、それを参考に記述すればいいと思います。 P.S. Cでのサーバは作成経験ありますが、PHPではやったことがありませんので、自信は無しです。

mimick777
質問者

補足

なるほど、ご回答ありがとうございます! >ソケット通信のサーバ側プログラムとはいえ、所詮はプログラムですから、クライアントが接続中のとき、送信命令を発行すれば可能ですね。 ここなんですが、接続後に、サーバ側でlistenしてしまうと、そこで待ちとなってしまい、以降処理を挟めなくなっている、というのが現在の問題点です。 これは仕様上仕方ないのでしょうか・・ 複数クライアントに関しては、やはりプロセスをもう一つあげて、そこで処理、が正解ですね。 この線で試してみます。

その他の回答 (1)

  • lv4u
  • ベストアンサー率27% (1862/6715)
回答No.2

>>ここなんですが、接続後に、サーバ側でlistenしてしまうと、そこで待ちとなってしまい、以降処理を挟めなくなっている、というのが現在の問題点です。 これは仕様上仕方ないのでしょうか・・  listenから戻ってきたらforkして、それ以降の通信はforkした子プロセスにお任せするのが通常の作り方です。ですから、listenで止まるのは正しいです。送信とか受信の処理をするのはforkされた子プロセスのお仕事になります。  つまり、最初のプロセスは受付だけやって、本来の仕事はすべて子プロセスに丸投げという小泉さんみたいな動作になりますね。  ただ、テスト的なものはいいのですが、障害対応を考慮した、実用レベルのサーバに仕上げるのは、ちょっとコードは複雑化するようです。まあ、ソケット関連プログラムってUNIXの内部動作を理解してないと、理解しずらい面があります。心もち高いですが、UNIXネットワークプログラミング〈Vol.1〉〈Vol.2〉がお勧めです。(合計で\13,440)

mimick777
質問者

お礼

なるほどです! めどが立ったような気がします。 早速実装テストします。 わかりやすく、ありがとうございました。