2010-09-02 43 views

回答

7

检查该套接字的所有文件描述符是否已关闭。如果在“远端”(假设这是你试图关闭的那个端口)上的任何一个保持打开,则“peer has not performed an orderly shutdown”。

如果这仍然不起作用,请在远程端调用shutdown(sock, SHUT_RDWR),这会关闭套接字,无论引用计数如何。

11

“为什么”就是这样,它是如何工作的,通过设计。

在内核中,recv()通话呼吁对应的文件描述符struct filefget(),这将防止其被释放到相应的fput()

你只需要改变你的设计(设计本身就是活泼无论如何 - 要做到这一点,你必须没有锁定保护在用户空间的文件描述符,这意味着close()可能的前刚刚发生recv()调用 - 文件描述符甚至被重用于其他事情)。


如果你想唤醒另一个线程的阻止一个文件描述符,你应该有它select()阻止相反,与包括在可以被主线程写入文件描述符集管。

+0

如果我在调用recv之前调用close,它应该可以工作,但是一旦调用在recv中,并且如果我从另一个线程调用close,它就不会被释放。它是否正确? – Jay 2010-09-02 10:37:34

+6

@Jay:一旦你调用close(),你就不应该在文件描述符上调用recv()。如果你幸运的话,你只会得到'EBADF',但如果你不幸,你可以从另一个线程新打开的完全不同的套接字中读取。 – caf 2010-09-02 11:35:32

+0

我认为你错过了这一点。 Pater试图在recv()内的ALREADY套接字上调用close()来强制recv()立即退出。这适用于其他系统,但不适用于Linux。 – 2010-09-02 21:47:53