如何中止winsock阻塞调用?

我在C ++中使用Winsock 2,并想知道如何使我的服务器停止从客户端连接读取。 阅读线程在recv()被阻止,我不知道如何中止它。 一种方法是使用带有select()的非阻塞套接字,但是这个线程必须在检查新的select()之前等待。

什么是停止读取sockets的正确方法?

要中止对recv()的阻塞调用,可以使用来自另一个线程的closesocket()关闭套接字。 即使它有点难看,也应该有效。

您也可以尝试shutdown()套接字(我从未测试过)。

如果您的程序除了使用套接字I / O之外还有其他事情要做,那么您不应该首先阻止它。

你声称你的线程必须等待,但这只是你程序当前设计的反映。 你应该重新设计它,以便它可以使用某种forms的非阻塞套接字。 可以使用非阻塞套接字解决每个网络问题。

既然你正在使用Winsock,那么你有很多选择 ,而不仅仅是select() 。 只有当您的应用程序必须在许多平台上运行并且您无法使用每个现代平台上可用的高级(但互不兼容)替代方案时, select()才是一个不错的选择。

在我读完你的回复之后,我有了一个主意。 它以setsockopt()结束。 我用它来设置recv()的超时时间,如果它超时,我只是检查系统是否还想从这个套接字中读取。

这种方式使得读取线程花费大部分时间等待recv()中的传入数据包。

谢谢你,Voteforpedro