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       
    }
}

如果我想停止接收,我可以设置keepGoing为 false,但套接字可能仍在等待,timeout然后才能看到它keepGoing已经改变。

假设我们不想更改超时值,有没有可靠的方法告诉套接字停止接收而不等待超时发生?

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问题中的参考。您可以使用 asocketpair而不是 a pipe。它似乎没有在 Windows 上实现,但我在这里找到了解决方法。Ben 指出,这WSAEventSelect允许混合不同的事件对象。感谢双方。

于 2012-08-03T19:08:20.613 回答