我在 C++ 中使用 Winsock 2,想知道如何让我的服务器停止从客户端连接读取。阅读线程被阻塞recv()
,我不知道如何中止它。一种方法是使用带有 的非阻塞套接字select()
,但该线程必须等待才能检查新的select()
.
停止读取套接字的正确方法是什么?
要中止对 的阻塞调用,您可以从另一个线程recv()
关闭套接字。即使它有点难看,它也应该工作。closesocket()
您也可以尝试shutdown()
使用套接字(我从未测试过)。
如果您的程序除了使用套接字 I/O 之外还有其他事情要做,那么您首先不应该阻塞。
您声称您的线程必须等待,但这只是您程序当前设计的反映。您应该重新设计它,使其适用于某种形式的非阻塞套接字。每个网络问题都可以使用非阻塞套接字来解决。
由于您使用的是 Winsock,因此这里有很多选择,而不仅仅是select()
. select()
仅当您的应用程序必须在许多平台上运行并且您无法使用每个现代平台上可用的高级(但相互不兼容)替代方案时,它才是一个不错的选择。