2
A
回答
7
检查该套接字的所有文件描述符是否已关闭。如果在“远端”(假设这是你试图关闭的那个端口)上的任何一个保持打开,则“peer has not performed an orderly shutdown”。
如果这仍然不起作用,请在远程端调用shutdown(sock, SHUT_RDWR)
,这会关闭套接字,无论引用计数如何。
11
“为什么”就是这样,它是如何工作的,通过设计。
在内核中,recv()
通话呼吁对应的文件描述符struct file
fget()
,这将防止其被释放到相应的fput()
。
你只需要改变你的设计(设计本身就是活泼无论如何 - 要做到这一点,你必须没有锁定保护在用户空间的文件描述符,这意味着close()
可能的前刚刚发生recv()
调用 - 文件描述符甚至被重用于其他事情)。
如果你想唤醒另一个线程的阻止一个文件描述符,你应该有它select()
阻止相反,与包括在可以被主线程写入文件描述符集管。
相关问题
- 1. 来自另一个线程的套接字关闭调用是否总是使阻塞recv()线程唤醒?
- 2. 前往ZMQ4 - 关闭Recv上阻塞的套接字?
- 3. recv与非阻塞套接字
- 4. C/C++套接字和非阻塞recv()
- 5. 关闭非阻塞套接字通道
- 6. C++ Winsock recv不会阻塞
- 7. 从另一个线程关闭挂zmq套接字
- 8. 套接字线程在接收时阻塞主线程
- 9. 阻塞套接字何时会超时?
- 10. Poco:如何从另一个线程中止阻塞套接字操作
- 11. 多线程与非阻塞套接字
- 12. 异步套接字阻塞UI线程
- 13. 使用非阻塞套接字时,recv()返回什么?
- 14. 的recv不给我一个-1客户端套接字关闭()
- 15. 关闭线程套接字
- 16. .NET套接字超时 - 在关闭方法上阻塞
- 17. 套接字关闭后关闭线程
- 18. 中断阻塞网络IO而不关闭套接字
- 19. 退出一个线程关闭所有
- 20. 如何关闭阻塞套接字在while循环线程听吗?
- 21. recv函数不会阻塞并recv一些垃圾值
- 22. 关闭流阻塞线程吗?
- 23. 检测非阻塞套接字上的关闭连接
- 24. SCTP套接字上的关闭调用是阻塞还是非阻塞?
- 25. 阻塞套接字性能与非阻塞套接字
- 26. 从主线程关闭一个套接字
- 27. 中断阻塞从套接字等待IO的线程?
- 28. 蟒蛇recv从封闭套接字
- 29. 关于boost :: asio套接字和阻塞
- 30. 套接字:非阻塞关机(SHUT_WR)?
如果我在调用recv之前调用close,它应该可以工作,但是一旦调用在recv中,并且如果我从另一个线程调用close,它就不会被释放。它是否正确? – Jay 2010-09-02 10:37:34
@Jay:一旦你调用close(),你就不应该在文件描述符上调用recv()。如果你幸运的话,你只会得到'EBADF',但如果你不幸,你可以从另一个线程新打开的完全不同的套接字中读取。 – caf 2010-09-02 11:35:32
我认为你错过了这一点。 Pater试图在recv()内的ALREADY套接字上调用close()来强制recv()立即退出。这适用于其他系统,但不适用于Linux。 – 2010-09-02 21:47:53