2016-08-23 11 views
7

接続要求を待機しているスレッドでブロックaccept()呼び出しがあります。アプリケーションが終了しようとしているとき、私はaccept()を待っているスレッドに正常に終了するように通知したいと思います。私はsend()recv()のタイムアウト値を設定できますが、私はaccept()でそれを行うことはできません。Windowsでblocking accept()呼び出しを終了するにはどうすればよいですか?

ソケットを非ブロックにしてselect()を使用し、select()のタイムアウト値を渡すことができますが、ソケットをブロックするソリューションを探しています。

+0

AFAIKは、少なくとも「古い」(事前確認済みの)ウィンドウではできません。 –

+1

'select()'を使うために非ブロッキングに切り替える必要はありません。ブロッキングソケットでも使用できます。タイムアウトで 'select()'を呼び出し、 'select()'が接続の受け入れを待っていない限り、 'accept()'を呼び出さないでください。それ以外の場合は、ノンブロッキングに切り替えます。 WSAWaitForMultipleEvents()で 'WSAEventSelect()'を使って、ソケットイベントと終了イベントを同時に待つことができます。または、ソケットイベントにI/O完了ポートを使用し、必要に応じて終了イベントを通知します。 –

+0

CancelSynchronousIo()は、すばやく簡単に修正することもできます。 –

答えて

1

私はソケットが非ブロックにし、使用を選択し()、およびselect()のタイムアウト値を渡すことができることを読みましたが、私はソケットをブロックするための解決策を探しています。

sock = socket(...); 
bind(sock, ...); 
listen(sock, ...); 

while (program_running()) 
{ 
    timeval timeout = {1, 0}; 
    fd_set fds; 
    FD_ZERO(&fds); 
    FD_SET(sock, &fds); 

    select(sock+1, &fds, NULL, NULL, &timeout); 

    if (FD_ISSET(sock, &fds)) 
    { 
     client = accept(sock, ...); 

     // do things with client 
    } 

MSDN accept function documentationから:

あなたは、ブロッキングソケット上でこれを行うことができます

パラメータreadfdsは、読みやすくするためにチェックされるソケットを識別します。ソケットが現在リッスン状態にある場合、着信接続要求が受信された場合に承認が完了することが保証されるように、をブロックしないと、ソケットは読み取り可能とマークされます。

関連する問題