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 它挂起。

如何确定何时不再有消息?为什么当对等 FD 关闭时“读取”不返回类似 ECONNRESET 的内容?

4

1 回答 1

3

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

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

例如,参见这个线程,它讨论了一个非常相似的问题。

于 2013-03-18T22:25:55.573 回答