C++ で Winsock 2 を使用していますが、サーバーがクライアント接続からの読み取りを停止する方法を考えています。読み取りスレッドがブロックされrecv()
、中止する方法がわかりません。これを行う 1 つの方法は、 でノンブロッキング ソケットを使用することですselect()
が、このスレッドは新しい をチェックする前に待機する必要がありselect()
ます。
ソケットの読み取りを停止する適切な方法は何ですか?
へのブロッキング呼び出しを中止するには、別のスレッドからrecv()
でソケットを閉じることができます。少し醜くても、うまくいくはずです。closesocket()
ソケットも試すことができshutdown()
ます(私はそれをテストしたことはありません)。
あなたのプログラムがソケット I/O 以外にやるべきことがあるなら、そもそもブロックすべきではありません。
スレッドは待機する必要があると主張していますが、それはプログラムの現在の設計を反映したものにすぎません。なんらかの形式のノンブロッキング ソケットで動作するように再設計する必要があります。すべてのネットワークの問題は、ノンブロッキング ソケットを使用して対処できます。
Winsock を使用しているので、select()
. select()
アプリケーションを多くのプラットフォームで実行する必要があり、最新のすべてのプラットフォームで利用可能な優れた (ただし相互に互換性のない) 代替手段を使用できない場合にのみ、これを選択することをお勧めします。