我在等待连接请求的线程中有一个阻塞accept()
调用。当应用程序即将关闭时,我想发信号正在等待accept()
正在优雅退出的线程。我在Winsock的文档中发现我可以为send()
和recv()
设置超时值,但我不能为accept()
设置。
我已经读过我可以使套接字无阻塞并使用select()
,并传递select()
的超时值,但我正在寻找阻塞套接字的解决方案。
答案 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标识要检查的可读性套接字。如果套接字当前处于侦听状态,则在收到传入连接请求时将标记为可读,以确保接受完成而不会阻止。