• 締切済み

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

こんにちは。 早速ですが、ソケット通信について質問です。 複数クライアント(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