• 締切済み

ソケット通信で同時受信の制限?

こんにちは。 早速ですが、ソケット通信について質問です。 複数クライアント(Win)からサーバ(UNIX)に対して、connect()し、サーバ側はaccept()したら、それぞれに対しfork()で子プロセスを作っています。 そこで、50台くらいのクライアントから一気にconnect()すると通信エラーとなってしまうのですが、なにか制限があるのでしょうか? connect()のタイミングをずらせば、それぞれのクライアントとサーバの子プロセスでやり取りができます。 一斉にconnect()される場合の通信エラーの原因や対処法などをご教授願います。 初歩的なことかもしれませんが・・・。 よろしくお願いいたします。

みんなの回答

回答No.3

エラーの内容が不明なのではっきりしたことは言えませんが、Spiraさんの言うようにlisten()の引数が一つの原因ではあるかもしれません。この引数はbacklogといってデフォルトでは5程度になっています。これはどういう意味かというと、listenしているポートに対しacceptがコールされるまで待ってくれる最大数を意味し、つまりacceptされないconnect要求が5個溜まると、それ以後は即座にconnect関数が失敗することになります。従ってlisten(50)としてやれば一応の解決にはなるでしょう。ただ、サーバ側の処理としてはできるだけすぐにacceptしてやるべきで、backlogを大きくとるのはあまり上手なプログラムではありません、、、がんばって下さい。

sunasaka3
質問者

お礼

詳しい説明ありがとうございます。 listenの引数は100を設定していました。 acceptではなく、forkで異常になっているようでした。 errnoは10のようですが、もう少し調べてみます。 ありがとうございました。

回答No.2

listen()の引数に同時に処理(保留)できるコネクション数を設定できたような気がします。(覚えてない…) この値を増加させてみたらいいのではないでしょうか? この値はあくまでも【同時】に接続要求がきた場合のことなので、パラパラと接続要求がくるぶんには関係ありません。お尋ねの現象と合致するような気がします。

sunasaka3
質問者

お礼

お礼が遅くなりました。 listenの第2パラメータには100を設定しています。 しかし、100台もつないでいないため、違う原因かと思っています。 また、acceptではなく、forkで異常になっているようでした。 errnoは10のようですが、もう少し調べてみます。 ありがとうございました。

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.1

最大ソケット数というのはありますが しかし50台とかそんな小さい数字ではないはず。 でもかならず51台目にかならずコネクションがはれないのであれば サーバーがそういう制限をかけたソースなのでは? acceptが失敗しているんですよね? http://www.linux.or.jp/JM/html/LDP_man-pages/man2/accept.2.html acceptがなんでエラーがでているのかを調べてください。

sunasaka3
質問者

お礼

お礼が遅くなりました。 acceptではなく、forkで異常になっているようでした。 errnoは10のようですが、もう少し調べてみます。 ありがとうございました。

関連するQ&A

  • ソケット通信

    現在プロセス間通信について学んでおり、 今はソケットを使ったプロセス間通信のプログラムを書いています。 そのソケット通信での質問なのですが、 2台のパソコンでINETドメインのソケットを使って プログラムを書いているのですが、 サーバーを実行した後、 別のパソコンでサーバー側のパソコンのIPアドレスを指定して クライアントを実行しようとすると、 connect:Connection timedout と表示されて実行できません。 同じプログラムをUNIXドメインで 1台のパソコンで実行すると正しく実行できます。 これは、プログラムに問題があるのでしょうか? それとも、ソケット通信を行う際には 何かパソコン等の設定が必要なのでしょうか? 教えてください。お願いします。 あと、セマフォを用いたプロセス間通信のサンプルプログラムが のっているホームページなどご存知でしたら、 教えていただけるとありがたいです。

  • ソケット通信(telnet)を行いたい

    現在、クライアントプログラムをアプレットで作ってます。 サーバ側はsocketで通信できる状態で、telnetで会話できます。 そこで質問なのですが、クライアント側でのsocket通信時の手順がわかりません。。 ソケットの入門書でわかったのはここまでです。 Socket s = new Socket("10.255.50.14", 23); でソケットを作るところはわかるのですが、そこからの手順がわかりません。。 ここから、connectとか使うのでしょうが、、 どなたかご存知の方がいらっしゃいましたらお教え願いたいと思います。

    • ベストアンサー
    • Java
  • サーバプロセスとクライアントプロセスの通信

    サーバプロセスとクライアントプロセスの通信がどのように行われているのか確認させてください。 現在、以下の認識でいます。 (1)TCPコネクション  サーバ側ポート番号【23】と、それぞれのクライアント側ポート番号【****】との間に確立する。   (2)通信処理  クライアント側のプロセスAは、サーバ側のプロセスA(子)  クライアント側のプロセスBは、サーバ側のプロセスB(子)  クライアント側のプロセスCは、サーバ側のプロセスC(子)  との間で通信を行う。 ※添付の図も参照ください。 認識に相違ないでしょうか。 サーバプロセスとクライアントプロセスの通信を行う際、プロセス間(ポート間?)の通信には、IPアドレスとポート番号を組み合わせたソケットを用いるため、サーバ側ではソケット【192.168.0.1:23】を1個作成し、クライアント側ではソケット【192.168.0.2:****】をプロセス分作成すると考えています。 このとき、クライアントプロセスAはサーバプロセスA(子)と通信を行いますが、サーバ側で作成されているソケットは1つであるため、どの子プロセスに対してデータをせばいいのか判別できないのではないかと考えています。 ※クライアントプロセス(A、B、C)はソケット(サーバ側)【192.168.0.1:23】に対して送信されるため。 上記について、何らかの仕組みがあるのでしょうか。 よろしくお願いします。

  • ソケット通信でチャットプログラム(unix c言語)

    c言語のソケット通信でチャットプログラムを作り中です 仕様:あるクライアントからメッセージがサーバに送信された時点でサーバは接続されたいる全てのクライアントにメッセージを送信する。 以下のようにクライアントからの接続(accept)がある度に、その返り値であるファイルディスクリプタにに対するreadと全クライアントに対するwriteの処理を行うchild関数をforkで起動します。これだとforkが起動した時点での全てのファイルディスクリプタ(接続されている全クライアント)の情報をchild関数に渡せますが、それ以降増え続けていくファイルディスクリプタの情報をchild関数に渡せないので、最初の方に接続したクライアントからのメッセージをそれ以降接続した他のクライアントに送信できないという状態です。 main() {   socket()   bind()   listen()     while(1){       accept()       if(fork()==0) {        child()       }     } } child() {   select()   if(FD_ISSET()) {     read()     write()   } } ※forkやソケット通信に関してかなり初心者なので、ソースや説明分が意味不明かもしれませんがよろしくお願いします。

  • ソケットを使った通信

    いつ発生するか分からない128バイト程度のデータをできるだけ早く(1秒以内)インターネットの向こう側に点在している500台程度の端末に確実に送りたいのですが、どういう方法があるでしょうか?サーバのOSはUNIXを想定しています。 500台の端末から1台のサーバにTCPセッションを張ったまま(forkして子プロセスにするなど)にして、このようなことを実現するのは可能でしょうか?

  • ソケット通信について

    VC++6.0MFCでソケット通信のプログラムを作成しようとしています。勉強始めたばかりなので、やっと普通に通信するプログラムは理解できたところです。 そこで応用していろいろ考えているのですが、方法がわからないところがありますので教えていただければと思ってます。 サーバ側の接続待ちはいつでも受けれるようにして、接続してきたクライアントに対して送信したいと考えております。ソケットの接続情報を保持しておいて、別プロセスの送信プログラムが接続クライアントに対して送信したいと考えてます。その送信プログラムが複数ある場合も同じ接続情報を利用したいと考えてるのですが、可能でしょうか。 説明が下手で申し訳ありません。補足はいたしますので、アドバイスお願いいたします。

  • JAVAのソケット通信の接続数について

    JAVAのソケット通信の接続数について ServerSocket server= new ServerSocket( port ); server.setSoTimeout( 4000 ); Socket socket = server.accept();//クライアントからの接続をまつ 以上のコードを使っていますが、クライアントからの接続数を調べる方法はないでしょうか?

    • ベストアンサー
    • Java
  • ソケット通信処理について

    現在、下記のようなクライアント、サーバ通信を行っております。 [クライアント] (a)WSAStartup (b)socket (c)connect (d)send(サーバへの要求送信) (e)recv(サーバからの応答受信) (f)shutdown (g)closesocket (1)プロセスは、常駐している (2)(a)は初回起動時1回のみ (3)通常(d)~(e)を周期的に行う (4)(e)にて一定時間経過した場合、5秒待ち6回リトライし、それでもだめな場合は、(f)(g)を実施後(b)から処理を行う。この後、WSACleanupを行っていない。プロセス終了(exit)もしていない。 [サーバ] (a)socket (b)bind (c)listen (d)accept (e)子プロセス生成 以下子プロセス処理 (f)select (g)recv(クライアントからの要求受信) (h)send(クライアントへの応答送信) (1)親プロセス((a)~(e)を行うプロセス)は常駐している。子プロセス起動後、(d)でconnect待ちとなる。(クライアント側からの再接続待ち) (2)子プロセスは、通常(f)~(h)の処理を行い、(f)又は(g)の異常時にexitする。 この処理で、クライアント処理(e)の一定時間経過後の再接続が正常に動作しない場合があります。 詳細情報を取得していませんが(現実的にすぐに詳細情報を取得することができない状況)(c)にて異常が発生していると思われます。 一度その状態になると二度と再接続できなくなり、マシン再起動(プロセス再起動)で復旧させることになります。 (実際は、マシン再起動後に再接続が正常になることを確認しています。(プロセス単体の再起動での確認はしていません。)) そこで質問ですが、 (1)再接続時、WSACleanupを行っていないが、問題ないか(処理の順番:(f)→(g)→(b)) (2)再接続前にプロセス終了(exit)していないが、問題ないか (3)上記の作りで考えられる要因として、何があるか ご教示して頂きたく、宜しくお願い致します。

  • ソケット通信で接続クライアントの上限を設ける

    (Unix c言語) ソケット通信で、サーバに接続するクラインとの上限をきめてそれ以上の数の接続要求があった場合、そのクライアントに対しての接続を拒否するには、サーバ側とクライアント側でどのような書き方をすればいいでしょうか?

  • ソケット通信で、250本しか接続できない

    solaris上で、ソケット通信をするプログラムを作成しております。 サーバー側にクライアントを多数接続したいのですが、 250本くらい接続するとサーバー側でacceptを呼び出したタイミングで セグメント例外を出力して異常終了してしまいます。 ここからは推測なのですが、 サーバー側のディスクリプタが255までは正常に動作するため、 ディスクリプタの数が256に制限されているのではないかと思います。 そこで、ulimitでdescriptorsを増やしたり、 setrlimit関数で、RLIMIT_NOFILE値を増やしたりしてみましたが、 状況は全く変わりませんでした。 念のためスタックサイズを増やしてもみましたがやはり効果ありませんでした。 どなたか、解決方法をご存じでしたら、ご教授頂けませんか? よろしくお願いします。

専門家に質問してみよう