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

时间:2016-08-23 03:18:38

标签: c sockets winapi winsock

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

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

1 个答案:

答案 0 :(得分:2)

  

我已经读过我可以使套接字无阻塞并使用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
    }

来自MSDN accept function documentation

  

参数readfds标识要检查的可读性套接字。如果套接字当前处于侦听状态,则在收到传入连接请求时将标记为可读,以确保接受完成而不会阻止