基于此question,当您在closesocket()
已使用的套接字上调用recv()
时,RST
数据包将被发送到另一方而不是执行正常断开连接(4次握手)。
但我希望执行正常的断开连接,因此我需要在致电recv()
之前退出closesocket()
。
有办法吗?
答案 0 :(得分:6)
您可以shutdown()
套接字输入。 recv()
将解锁并返回零,每个人都会很高兴。
答案 1 :(得分:0)
这里真正的问题是肯定的kill,terminatethread(),对它的使用效果不好有各种各样的警告。我一直在使用这种方法退出recv()。 windows文档说"在应用terminatethread之前你必须知道线程正在做什么",好吧,我们知道它在做什么,它在recv()中。问题不在于THREAD正在做什么,而是Windows内核正在做什么。
在嵌入式系统RTOS中我做过killthread()是可行的。它不容易,你必须找到线程拥有的每一个锁和资源并将其退出。只有操作系统才有这种信息(和权力)。