2013-03-18 45 views
1
#include <sys/socket.h> 
int main() { 
    int s[2]; 
    socketpair(AF_UNIX, SOCK_STREAM, 0, s); 

    close(s[1]); 
    char buf; 
    read(s[0], &buf, 1); 
} 

完成,但与SOCK_DGRAM它挂起。如何知道sockatpair的SOCK_DGRAM对等套接字何时关闭?

如何找出何时不再有消息?为什么“read”在对等FD关闭时不会返回类似ECONNRESET的内容?

回答

3

SOCK_DGRAM和SOCK_STREAM之间的区别在于前者是无连接的,这意味着除了别的以外,没有连接通信的另一端的连接“状态”。因此,这个插座没有被另一端封闭的概念。监听服务器仍然有一个有效的端点可以接收数据报,即使在这种情况下它恰好是匿名的,因此没有其他人可以找到它来发送数据报。

如果你想拥有连接状态信息,你想使用SOCK_STREAM。

参见例如this thread,其讨论了非常类似的问题。 OK。

+0

OK。我可以用SOCK_SEQPACKET替换SOCK_DGRAM,并假设它将支持SOCK_SEQPACKED吗? – 2013-03-18 22:41:37

+0

我没有亲自使用过SOCK_SEQPACKET,但是是的,这似乎是它的目的,它听起来像它应该工作的线程。 – rra 2013-03-19 00:36:22