如何退出阻止recv()调用?

时间:2015-03-10 06:18:19

标签: c++ sockets winapi network-programming winsock

基于此question,当您在closesocket()已使用的套接字上调用recv()时,RST数据包将被发送到另一方而不是执行正常断开连接(4次握手)。

但我希望执行正常的断开连接,因此我需要在致电recv()之前退出closesocket()

有办法吗?

2 个答案:

答案 0 :(得分:6)

您可以shutdown()套接字输入。 recv()将解锁并返回零,每个人都会很高兴。

答案 1 :(得分:0)

这里真正的问题是肯定的kill,terminatethread(),对它的使用效果不好有各种各样的警告。我一直在使用这种方法退出recv()。 windows文档说"在应用terminatethread之前你必须知道线程正在做什么",好吧,我们知道它在做什么,它在recv()中。问题不在于THREAD正在做什么,而是Windows内核正在做什么。

在嵌入式系统RTOS中我做过killthread()是可行的。它不容易,你必须找到线程拥有的每一个锁和资源并将其退出。只有操作系统才有这种信息(和权力)。