我在VS 2008下使用Winsock。
我有一个专门通过阻塞调用accept()接受传入TCP连接请求的线程。当我的应用程序关闭时,我需要以某种方式取消阻止此线程,以便它可以执行其关闭工作并退出。有没有办法解锁accept()?
如果无法取消阻止accept(),我会发布另一个问题。那个问题是:如果我对在accept()上被阻塞的线程执行硬杀,那么会发生什么不好的事情(操作系统数据结构的损坏等)吗?
谢谢, 戴夫
答案 0 :(得分:8)
解除阻塞accept()
的唯一方法是从另一个线程关闭侦听套接字。否则,您需要将侦听套接字置于非阻塞模式,并使用select()
(确实支持超时)来检测何时可以在不阻塞的情况下调用accept()
。
答案 1 :(得分:1)
一种从另一个线程取消阻塞accept()调用的可靠方法是使用connect()创建连接。当然,线程需要知道正在监听的IP地址和端口。
答案 2 :(得分:0)
<击> 我过去使用的一种方法是为accept()提供超时值 - 当它超时时,你检查一个“取消”标志 - 如果设置,你停止 - 如果没有,你回到循环中accept()调用。
我认为杀死线程会起作用,但是你应该小心确保它是你的线程,例如,不是.NET线程池线程。
编辑:雷米是对的,并且认为我甚至做了一个快速谷歌来验证我记得存在的结构 - 看起来太快了。腮红/等
如果你想维护阻塞语义,那么就会看到从另一个线程关闭套接字(或者中止你的阻塞线程)。
答案 3 :(得分:0)
直接向前且特定于Windows的closesocket()返回而没有错误,并取消阻塞调用accept()的线程。
轮询select()并不是您真正想要的! 从其他线程进行连接并不是您真正想要的!
例如对于linux,close(socket)不会解除阻止侦听线程, 但是关闭(socket,SHUT_RD)将;另外,插座需要关闭。