Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 中断接收插座_C++_Sockets_Timeout_Winsock - Fatal编程技术网

C++ 中断接收插座

C++ 中断接收插座,c++,sockets,timeout,winsock,C++,Sockets,Timeout,Winsock,我有一个WinSockmySocket,它以如下方式循环接收: 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(my

我有一个WinSock
mySocket
,它以如下方式循环接收:

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
已更改


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

errno
EINTR
时,您可以发出良性信号并检查
keepGoing
标志。或者,您可以创建
管道
,并将读取端添加到
选择集。设置
keepGoing
标志后关闭写入端

int quitfds[2];
pipe(quitfds);

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

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

Edit:Adam指出我错过了问题中的
Winsock
参考。您可以使用
socketpair
而不是
管道
。它似乎没有在Windows上实现,但我发现。Ben指出,
WSAEventSelect
允许混合不同的事件对象。多亏了这两种方法。

这对Unix很好,但Windows没有信号,WinSock的
select
实现只能处理套接字对象,而不能处理其他类型的类似文件的对象,如管道。@Adam:True of
select
,但是Windows也有
WSAEventSelect
,它确实支持混音。@亚当:谢谢你向我指出,我在问题中遗漏了这一点。@Ben:哦,好的,我不知道
WSAEventSelect
。如果是TCP,你已经完全完成了套接字,请关闭它进行输入。这将向
recv()
方法(返回值为零)提供流的结束。您仍然可以写入套接字。