ギリギリ行けるお一人様のライン

こんにちは。
早速ですが、ソケット通信について質問です。
複数クライアント(Win)からサーバ(UNIX)に対して、connect()し、サーバ側はaccept()したら、それぞれに対しfork()で子プロセスを作っています。

そこで、50台くらいのクライアントから一気にconnect()すると通信エラーとなってしまうのですが、なにか制限があるのでしょうか?

connect()のタイミングをずらせば、それぞれのクライアントとサーバの子プロセスでやり取りができます。

一斉にconnect()される場合の通信エラーの原因や対処法などをご教授願います。

初歩的なことかもしれませんが・・・。
よろしくお願いいたします。

A 回答 (3件)

エラーの内容が不明なのではっきりしたことは言えませんが、Spiraさんの言うようにlisten()の引数が一つの原因ではあるかもしれません。

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

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

お礼日時:2005/04/12 19:24

listen()の引数に同時に処理(保留)できるコネクション数を設定できたような気がします。

(覚えてない…)
この値を増加させてみたらいいのではないでしょうか?

この値はあくまでも【同時】に接続要求がきた場合のことなので、パラパラと接続要求がくるぶんには関係ありません。お尋ねの現象と合致するような気がします。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/04/12 19:22

最大ソケット数というのはありますが


しかし50台とかそんな小さい数字ではないはず。

でもかならず51台目にかならずコネクションがはれないのであれば
サーバーがそういう制限をかけたソースなのでは?
acceptが失敗しているんですよね?
http://www.linux.or.jp/JM/html/LDP_man-pages/man …

acceptがなんでエラーがでているのかを調べてください。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/04/12 19:20

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報