为什么 socketpair() 允许 SOCK_DGRAM 类型?

Why does socketpair() allow SOCK_DGRAM type?

我最近一直在学习 Linux 套接字编程,主要来自 this site

网站说使用 domain/type 组合 PF_LOCAL/SOCK_DGRAM...

Provides datagram services within the local host. Note that this service is connectionless, but reliable, with the possible exception that packets might be lost if kernel buffers should become exhausted.

那么我的问题是,为什么 socketpair(int domain, int type, int protocol, int sv[2]) 允许这种组合,根据它的手册页...

The socketpair() call creates an unnamed pair of connected sockets in the specified domain, of the specified type...

这不是自相矛盾吗?

我认为 PF_LOCALPF_INET 域中的 SOCK_DGRAM 隐含 UDP,它是一种无连接协议,所以我无法调和 socketpair() 看似冲突声明创建连接套接字。

数据报套接字有 "pseudo-connections"。该协议实际上没有连接,但您仍然可以调用connect()。这将一个远程地址和端口与套接字相关联,然后它只接收来自该源的数据包,而不是所有目的地是套接字绑定到的 address/port 的数据包,你可以使用 send() 而不是 sendto() 发送回这个远程地址。

TFTP 协议可能会用到这个例子。服务器最初在众所周知的端口上侦听传入请求。传输开始后,将使用不同的端口,发送方和接收方可以使用 connect() 将套接字与该对端口相关联。然后他们可以简单地在那个新套接字上发送和接收以参与传输。

同样,如果您将 socketpair() 与数据报套接字一起使用,它会在两个套接字之间创建一个伪连接。