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

时间:2017-06-01 20:29:26

标签: linux sockets socketpair

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

该网站表示使用域名/类型组合PF_LOCAL / SOCK_DGRAM ...

  

在本地主机中提供数据报服务。请注意这一点   服务无连接,但可靠,可能有例外   如果内核缓冲区耗尽,数据包可能会丢失。

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

  

socketpair()调用会在其中创建一对未命名的已连接套接字   指定类型的指定域...

这里是不是有矛盾?

我认为SOCK_DGRAMPF_LOCAL域中的PF_INET隐含了UDP,这是一种无连接协议,因此我无法将看似冲突与socketpair()进行协调声称要创建连接套接字。

1 个答案:

答案 0 :(得分:1)

数据报套接字具有“伪连接”。该协议实际上没有连接,但您仍然可以调用connect()。这会将远程地址和端口与套接字关联,然后它只接收来自该源的数据包,而不是所有目的地是套接字绑定的地址/端口的数据包,并且可以使用send()而不是sendto()发回这个远程地址。

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

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