我在C ++中使用Winsock 2,并想知道如何让我的服务器停止从客户端连接读取。阅读线程在recv()
中被阻止,我不知道如何中止它。一种方法是使用带有select()
的非阻塞套接字,但是这个线程必须等到检查新的select()
之前。
停止阅读套接字的正确方法是什么?
答案 0 :(得分:2)
要中止对recv()
的阻止调用,您可以使用另一个线程中的closesocket()
关闭套接字。即使它有点难看,也应该有用。
您也可以尝试shutdown()
套接字(我从未测试过)。
答案 1 :(得分:2)
如果您的程序除了使用套接字I / O之外还有其他事情要做,那么您不应该首先阻止它。
您声称您的主题必须等待,但这只是您程序当前设计的反映。你应该重新设计它,以便它可以使用某种形式的非阻塞套接字。使用非阻塞套接字可以解决每个网络问题。
由于您使用的是Winsock,因此您在此处many alternatives,而不仅仅是select()
。只有当您的应用程序必须在许多平台上运行并且您无法使用每个现代平台上可用的优越(但互不兼容)替代方案时,select()
才是一个不错的选择。
答案 2 :(得分:-1)
在我读完你的回复之后,我有了一个主意。它以setsockopt()结束。我用它来设置recv()的超时时间,如果它超时,我只是检查系统是否还想从这个套接字中读取。
这样,读取线程大部分时间都在等待recv()中的传入数据包。
谢谢你, Voteforpedro