#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 关闭时“读取”不返回类似 ECONNRESET 的内容?
SOCK_DGRAM 和 SOCK_STREAM 之间的区别在于前者是无连接的,这意味着除其他外,没有与通信另一端通信的连接“状态”。因此,不存在该套接字被另一侧关闭的概念。监听服务器仍然有一个可以接收数据报的有效端点,即使在这种情况下它恰好是匿名的,因此没有其他人可以找到它来向它发送东西。
如果你想拥有连接状态信息,你想使用 SOCK_STREAM。
例如,参见这个线程,它讨论了一个非常相似的问题。