3

マルチスレッドの winsock アプリケーションを作成していて、ソケットを閉じる際に問題が発生しています。まず、同時にオープンできるソケットの数に制限はありますか? 一度に 32 個のソケットがあるとしましょう。

ソケットの1つで接続を確立し、情報を渡すと、すべてがうまくいきます。問題は、ソケットを切断してから同じ宛先に再接続すると、SYN の後にサーバーから RST を取得することです。サーバーアプリのコードがないため、デバッグできません。

SO_LINGER を使用し、各セッションの最後に RST フラグを送信すると、機能しました。しかし、この方法で接続を終了したくありません。SO_LINGER を使用していない場合、FIN フラグが送信されましたが、接続が実際には閉じられていないようです。

助けはありますか?ありがとう

4

2 に答える 2

2

Unix では、プロセスごとにファイル記述子の制限があります。Windows では「ハンドル」だと思います。

おそらくbind()、クライアントソケットを固定ポートに接続しています。これが、サーバーが後続の接続を拒否している理由である可能性があります。通常のエフェメラル ポートを試してください。

于 2010-05-13T16:07:23.967 に答える
2

まず、ニコライに同意します。クライアントソケットをバインドしていますか?

もしそうなら、サーバー側のソケットがまだ入っていてTIME_WAIT、新しい接続の試行を破棄しているようです。クライアント ソケットをバインドすることにより、現在 2MSL 待機期間にあるのとまったく同じ接続をサーバーに強制的に再利用させます。この時点では再利用できないため、表示されているものを確認できます。 . 通常、クライアント ポートをバインドする必要はありません。バインドを停止すると、問題が解消される可能性があります。

第 2 に、Windows プラットフォームではオープン ソケットの数に制限がありますが、ハードコードされた数値ではなく、リソースに関連しています。

開いている各ソケットはいくつかの「非ページ プール」メモリを使用し、ソケットで保留中の読み取りまたは書き込み要求も「非ページ プール」の両方を使用し、I/O 中にメモリ内にロックされたメモリのページを持つ可能性があります (ロックできるページ数)。つまり、Vista以降では、以前のバージョンのWindowsよりもはるかに多くの「非ページプール」が利用可能であり、それでもかなり低スペックのXPボックスで70,000を超える同時アクティブ接続を達成することができました(ここを参照してください: http :/ /www.lenholgate.com/blog/2005/11/windows-tcpip-server-performance.html )。確立できるアウトバウンド接続の数にはいくつかの個別の制限があることに注意してください (これはあなたにとってより興味深いものです)。MAX_USER_PORT同時 TCP/IP 接続の最大数 - 詳細については、Win XP SP3を参照してください。

于 2010-05-13T16:38:40.750 に答える