用MFC中的异步过程调用中断一个accept winsock调用

Interrupt a accept winsock call with Asynchronous Procedure calls in MFC

本文关键字:一个 accept 调用 winsock MFC 异步过程调用 中断      更新时间:2023-10-16

问题很简单,

我有一个守护线程,它等待传入的客户端连接,当至少一个客户端连接时,它退出。

现在,当有人调用shutdownApp函数时,我需要将信号(或中断)发送给守护线程,并要求它从阻塞接受中出来,以便它可以退出。

我不想用

1)选择(或非阻塞线程)
2) TerminateThread

MFC提到winsock的accept函数可以通过异步过程调用被中断。如果有人能告诉我怎么做,那就太好了。

只需关闭正在调用accept()的套接字。这将导致accept()失败,并显示一个错误代码,然后线程可以检查。如果您更仔细地阅读文档,它提到APC可以过早地中止accept(),以警告您不要在APC仍在运行时再次调用accept()。这并不意味着你应该故意使用APC来中止accept(),这是错误的解决方案。

如果不想关闭套接字,则在循环中使用select()。它可以在阻塞和非阻塞套接字上工作,并且会告诉您何时调用accept(),因此它不会阻塞。指定一个超时,以便您的线程可以在再次调用select()之前定期唤醒以查找终止条件。