2012-04-14 6 views
4

これは私の状況です。私はwinsockに取り組んでおり、ネットワーキングとプロトコルの開発についていくつか学んでいます。私は難局に達しました。私は受け入れの呼び出しでブロックするサーバーをやっていますが、バックグラウンドにユーザー入力を待ってユーザー入力を処理する別のスレッドがあります。このユーザー入力は、send、ping、sayなどのコマンドに使用されますが、exitと呼ばれるコマンドを使用して、winsockをシャットダウンし、開いているすべての接続を解放し、プログラムを終了します。問題は、この受け入れスレッドがまだブロックしていることです。、どうすればaccept関数が別のスレッドからブロックされるのを防ぐことができますか?

ここに質問があります。 1)それを呼び出している間、ブロッキングからのWinsock機能を停止するようにとにかくあり、かつ2)非ブロックモードでは、このようなものです:

while(m_continue) 
{ 
     Sleep(1); 
     tempsock = accept(m_listenSock, NULL, NULL); 
     if(tempsock != INVALID_SOCKET) 
     { 
      if(WSAGetLastError() == WSAEWOULDBLOCK) 
        continue; 
      else 
        return 1; 
     } 
     break; 
{ 

余分またはあまりにもinneficient使用することを?

答えて

3

ユーザコマンドスレッドから、exitコマンドを処理するときに、m_listenSockソケットを閉じます。ブロッキングaccept()のコールはすぐにINVALID_SOCKETで中止されます。

m_listenSockハンドルを2回閉じないでください。

+0

ハ、シンプルです。ありがとうございました。P – FatalCatharsis

+1

これはWindows 7では動作しません.closeesocket()とaccept()呼び出しスレッドの両方がブロックされます。 – wilx

+1

try: 注意acceptなどのWinsock呼び出しをブロックする場合、Winsockは呼び出しが完了する前にネットワークイベントを待つ必要があります。 Winsockは、この状況でアラート可能な待機を実行します。この待機は、同じスレッドでスケジュールされた非同期プロシージャコール(APC)によって中断される可能性があります。同じスレッド上で進行中のブロッキングWinsock呼び出しを中断したAPC内でもう1つのブロッキングWinsock呼び出しを発行すると、未定義の動作が発生し、Winsockクライアントは絶対に試みる必要がありません。 –

関連する問題