#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会挂起。
如何找出何时不再有消息?当对等FD关闭时,为什么“read”不会返回类似ECONNRESET的内容?
答案 0 :(得分:3)
SOCK_DGRAM和SOCK_STREAM之间的区别在于前者是无连接的,这意味着,除了其他之外,没有连接“状态”传递给通信的另一端。因此,没有关于该插座被另一侧封闭的概念。侦听服务器仍然有一个可以接收数据报的有效端点,即使在这种情况下它恰好是匿名的,因此没有其他人可以找到它来发送数据报。
如果您想拥有连接状态信息,则需要使用SOCK_STREAM。
例如,请参阅this thread,其中讨论了一个非常类似的问题。