如何在Windows中退出阻塞的accept()调用?

use*_*975 7 c sockets winapi winsock

accept()在一个等待连接请求的线程中有一个阻塞调用.当应用程序即将关闭时,我想发信号正在等待accept()正常退出的线程.我在Winsock的文档中发现我可以为send()和设置超时值recv(),但我不能这样做accept().

我已经读过我可以使套接字无阻塞并使用select(),并传递超时值select(),但我正在寻找阻塞套接字的解决方案.

Mat*_*ieu 5

我读过,我可以使套接字成为非阻塞并使用 select(),并为 传递超时值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
    }
Run Code Online (Sandbox Code Playgroud)

来自MSDN 接受函数文档

参数 readfds 标识要检查可读性的套接字。如果套接字当前处于侦听状态,并且已接收到传入连接请求,则它将被标记为可读,从而保证接受完成而不会阻塞