0

我最近一直在学习 Linux 套接字编程,主要来自这个站点

该网站说使用域/类型组合PF_LOCAL/ SOCK_DGRAM...

在本地主机内提供数据报服务。请注意,此服务是无连接的,但可靠,但如果内核缓冲区耗尽,可能会丢失数据包。

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

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

这里不是矛盾吗?

我认为SOCK_DGRAMPF_LOCALandPF_INET域中隐含 UDP,这是一个无连接协议,所以我无法调和与socketpair()' 声称创建连接套接字的看似冲突。

4

1 回答 1

3

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

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

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

于 2017-06-01T21:48:19.253 回答