- 締切済み
ソケット通信で同時受信の制限?
こんにちは。 早速ですが、ソケット通信について質問です。 複数クライアント(Win)からサーバ(UNIX)に対して、connect()し、サーバ側はaccept()したら、それぞれに対しfork()で子プロセスを作っています。 そこで、50台くらいのクライアントから一気にconnect()すると通信エラーとなってしまうのですが、なにか制限があるのでしょうか? connect()のタイミングをずらせば、それぞれのクライアントとサーバの子プロセスでやり取りができます。 一斉にconnect()される場合の通信エラーの原因や対処法などをご教授願います。 初歩的なことかもしれませんが・・・。 よろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- foochannoshippo
- ベストアンサー率100% (1/1)
エラーの内容が不明なのではっきりしたことは言えませんが、Spiraさんの言うようにlisten()の引数が一つの原因ではあるかもしれません。この引数はbacklogといってデフォルトでは5程度になっています。これはどういう意味かというと、listenしているポートに対しacceptがコールされるまで待ってくれる最大数を意味し、つまりacceptされないconnect要求が5個溜まると、それ以後は即座にconnect関数が失敗することになります。従ってlisten(50)としてやれば一応の解決にはなるでしょう。ただ、サーバ側の処理としてはできるだけすぐにacceptしてやるべきで、backlogを大きくとるのはあまり上手なプログラムではありません、、、がんばって下さい。
- SpiralGalaxy
- ベストアンサー率39% (649/1653)
listen()の引数に同時に処理(保留)できるコネクション数を設定できたような気がします。(覚えてない…) この値を増加させてみたらいいのではないでしょうか? この値はあくまでも【同時】に接続要求がきた場合のことなので、パラパラと接続要求がくるぶんには関係ありません。お尋ねの現象と合致するような気がします。
お礼
お礼が遅くなりました。 listenの第2パラメータには100を設定しています。 しかし、100台もつないでいないため、違う原因かと思っています。 また、acceptではなく、forkで異常になっているようでした。 errnoは10のようですが、もう少し調べてみます。 ありがとうございました。
- sha-girl
- ベストアンサー率52% (430/816)
最大ソケット数というのはありますが しかし50台とかそんな小さい数字ではないはず。 でもかならず51台目にかならずコネクションがはれないのであれば サーバーがそういう制限をかけたソースなのでは? acceptが失敗しているんですよね? http://www.linux.or.jp/JM/html/LDP_man-pages/man2/accept.2.html acceptがなんでエラーがでているのかを調べてください。
お礼
お礼が遅くなりました。 acceptではなく、forkで異常になっているようでした。 errnoは10のようですが、もう少し調べてみます。 ありがとうございました。
お礼
詳しい説明ありがとうございます。 listenの引数は100を設定していました。 acceptではなく、forkで異常になっているようでした。 errnoは10のようですが、もう少し調べてみます。 ありがとうございました。