3

mySocket私は次のようなループで受信するWinSockを持っています:

while(keepGoing){
    FD_SET fsd;
    FD_ZERO(&fds);
    FD_SET(mySocket, &fds);

    int result = select(1+mySocket, &fds, (fd_set *)0, (fd_set *)0, &timeout);
    if(result>0 && FD_ISSET(mySocket, &fds){
        result = recvfrom(mySocket, buff, NUM_BYTES, (struct sockaddr *)&add, &length);
        // do stuff       
    }
}

受信を停止したい場合はfalseに設定できますが、ソケットはそれが変更されたことを確認する前にkeepGoing待機している可能性があります。timeoutkeepGoing

タイムアウトの値を変更したくないと仮定すると、タイムアウトが発生するのを待たずに受信を停止するようにソケットに指示する信頼できる方法はありますか?

4

1 に答える 1

1

良性の信号を発生させ、がであるkeepGoingときにフラグを確認できます。または、を作成して、読み取り終了をセットに追加することもできます。フラグを設定した後、書き込み終了を閉じます。errnoEINTRpipeselectkeepGoing

int quitfds[2];
pipe(quitfds);

    //...
    FD_SET(quitfds[0], &fds);
    //...

    if (FD_ISSET(quitfds[0], &fds)) {
        close(quitfds[0]);
        continue;
    }

編集:Winsockアダムは、私が質問の参照を逃したと指摘します。socketpairの代わりに使用できますpipe。Windowsには実装されていないようですが、ここで回避策を見つけましたWSAEventSelectベンは、さまざまなイベントオブジェクトの混合を可能にすることを指摘しています。両方に感謝します。

于 2012-08-03T19:08:20.613 に答える