【发布时间】:2016-12-29 17:28:36
【问题描述】:
我在等待连接请求的线程中有一个阻塞的accept() 调用。当应用程序即将关闭时,我想通知正在等待accept() 的线程正常退出。我在 Winsock 的文档中发现我可以为 send() 和 recv() 设置超时值,但我不能为 accept() 设置超时值。
我读到我可以使套接字变为非阻塞并使用select(),并为select() 传递超时值,但我正在寻找阻塞套接字的解决方案。
【问题讨论】:
-
AFAIK 你不能......至少不能在“旧”(pre-vista?)窗口上。
-
你不需要切换到非阻塞来使用
select(),它也可以与阻塞套接字一起使用。在超时时调用select(),并且不要调用accept(),除非select()告诉您连接正在等待被接受。否则是的,切换到非阻塞。您可以使用WSAEventSelect()和WSAWaitForMultipleEvents()同时等待套接字事件和终止事件。或者为套接字事件使用 I/O 完成端口,并在需要时发布终止事件。 -
CancelSynchronousIo() 也可能是一个快速简单的修复方法。
-
关闭插座总是能很好地拉动地板垫。