[kansaipm] Socketについて教えてください

Tetsuya Ryuchi ryuchi at ryuchi.org
Tue Dec 25 01:53:14 CST 2001


  りゅうちです

> ソケットとセレクトを使ったapacheで動く、cgiプログラムを作っています。 
> 1週間ほど悩んでいます。何かヒントでもありましたら、よろしく。  

  うーん、下記のサンプルだと Apache用のCGIでもなければ、モジュールでも
ない気がします。スタンドアローンのサーバでないですか?  


> 同時に 複数のクライアントから、アクセスしたとき、正しいクライアントに
> 返らず、他のクライアントが横取りしてしまうという現象に悩まされています。
> いくつかは、正しい、クライアントに返るのですが、いくつかは要求を出し
> たのとは、別のクライアントに返ります。 
> 
> サーバ側(C言語) 
> socket
> bind
> listen
> ループで、 
>   select
>   accept

  listen してクライアントからの接続を待っていますね、そのあと、クライアン
トから接続されたあと、fork(2)とかして プロセスを分けていますか?
  fork(2) したあと、子プロセスは クライアントからの接続を受付け、通信を
はじめる、親プロセスは次の接続を待つように書くのがいいでしょう。
  もし fork(2)せず、accept(2) していると あとから接続してきたクライアント
のポートと先に接続していたクライアントのポートが重なって 橋本さんの悩んで
おられる現象になるのでは? と思います。
  socket の使い方は Perl でも use Socket; したときとほとんど同じなので、
プログラミング Perl (ISBN4-900900-48-6)の ソケットを使ったクライアント/
サーバモデルのプログラミングを参考にするといいと思います。

  # ところで select(2) って必要でしたっけ? (^^;

> クライアント側(perl)
> use Socket;
> socket
> connect
> 
> です。1つのクライアントからのアクセスではうまくいくのです。 
> サーバ側はIPアドレス(127.0.0.1)+ポートは決めうちです。 
> クライアント側IPアドレスは、127.0.0.1、
> ポートは、netstatで見ると、1028番、1030とか、2番毎に、自動発生している 
> ようです。ファイルディスクリプタも、サーバ側では、クライアント毎に異なっ
>
  この場合、ポート番号は自動的に付けられます。ポート番号はグローバルなので
クライアント毎に独立している必要があります。

> ID (4とか 5とか連番)が付けられています。クライアント側は、どうすれ
> ば、 
> 自分のデータだけを受け取れるのでしょうか。クライアントも、IPアドレスと
> ポートではないのでしょうか。

  ?? ID ってなんでしょう? ソケットでは そういう番号は使わない気がしますが

> selectを使わず、 forkを使おうとしたら、 waitpidで子プロセスを殺さず、次
>> クライアントからの要求のため、acceptの待ちに入っていいのでしょうか。

  fork(2) を使って あるクライアントからの接続を子に任せて、親は次から次へ
と来る要求を処理するために accept(2)すればいいです。
  子が終わるときは 親にシグナルを送って、親がシグナルを受けたら wait して
やればいいはずです。

(龍)
--
# From Tetsuya Ryuchi <ryuchi@[ryuchi|fmclub|bsdclub|inet6].org>
#                         Powered By FreeBSD,  IPv4 and IPv6 Ready!



More information about the Kansai-pm mailing list