-1

IOCP、ソケット、オーバーラップを使用するサーバーがあります。最初はすべてが素晴らしいです。リッスンしているソケットは、IOCP で AcceptEx を使用して、新しく作成されたソケットにハンドオフします。何千もの接続を問題なく処理できます。

サーバー プロセスの処理が遅れると、リッスン ポートを閉じて切断します。追いつくと、新しい IOCP でリッスン ポートを再確立します。

私が遭遇した問題は、リスニング ポートを再確立した後、新しい接続が到着した後、上記とまったく同じコード パスを使用して受け入れようとすることです。AcceptEx は WSAEINVAL で失敗します。

いくつかの詳細を省略していることは承知しています (そして、悪魔は常に詳細に潜んでいますよね?)。

好奇心旺盛な方がさらに詳しい情報をお知りになりたい場合は、喜んで提供させていただきます。

4

2 に答える 2

1

ソースコードが表示されていない場合、問題が何であるかを推測するのは困難ですが...

  1. リッスンしているソケットを閉じる必要はありません。新しい AcceptEx() 呼び出しの送信を停止するだけで、サーバーは新しい接続を受け入れることができなくなります。

  2. リスニング ソケットも閉じたい場合は、IOCP を閉じずに、リスニング ソケットを再作成するときに必ず同じ IOCP を使用してください。

于 2014-01-01T15:27:58.563 に答える
0

根本的な問題が何であるかを理解したので、私は自分の質問に答えます。この問題にとって重要なことの 1 つは、サーバーにサブプロセスがあることでしたが、問題の説明には記載されていませんでした。

ウィンドウのデフォルトの動作は、サブプロセスによってハンドルが継承されないことですが、winsock の動作は逆です。作成時に明示的に継承なしに設定されていない限り、ハンドルはサブプロセスによって継承されます。

継承不可能なハンドルを持つソケットを作成すると、この問題が解決します。これが、この問題に遭遇した誰かに役立つことを願っています。

于 2014-05-16T17:27:28.420 に答える