如何退出阻塞的 recv() 调用?

How to exit a blocking recv() call?

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

但我希望执行正常断开连接,所以我需要在调用 closesocket() 之前退出 recv()

有办法吗?

您可以shutdown()输入插座。 recv() 将解锁并且 return 归零,每个人都会很高兴。

这里真正的问题是肯定会终止 terminatethread(),上面有各种关于其使用不良影响的警告。我一直在使用这种方法来退出 recv()。 windows 文档说 "you must know what the thread is doing before applying terminatethread",嗯,我们知道它在做什么,它在 recv() 中。问题不是 THREAD 在做什么,而是 windows 内核在做什么。

在嵌入式系统中RTOSes 我做过killthread()是可以的。这并不容易,您必须找到线程拥有的每个锁和资源并将其退出。只有 OS 拥有那种信息(和力量)。