我最近一直在学习Linux套接字编程,主要来自this site。
该网站表示使用域名/类型组合PF_LOCAL
/ SOCK_DGRAM
...
在本地主机中提供数据报服务。请注意这一点 服务无连接,但可靠,可能有例外 如果内核缓冲区耗尽,数据包可能会丢失。
我的问题是,socketpair(int domain, int type, int protocol, int sv[2])
为什么允许这种组合,当根据其手册页...
socketpair()调用会在其中创建一对未命名的已连接套接字 指定类型的指定域...
这里是不是有矛盾?
我认为SOCK_DGRAM
和PF_LOCAL
域中的PF_INET
隐含了UDP,这是一种无连接协议,因此我无法将看似冲突与socketpair()
进行协调声称要创建连接套接字。
答案 0 :(得分:1)
数据报套接字具有“伪连接”。该协议实际上没有连接,但您仍然可以调用connect()
。这会将远程地址和端口与套接字关联,然后它只接收来自该源的数据包,而不是所有目的地是套接字绑定的地址/端口的数据包,并且可以使用send()
而不是sendto()
发回这个远程地址。
可能使用此示例的示例是TFTP
协议。服务器最初侦听已知端口上的传入请求。传输开始后,使用不同的端口,发送方和接收方可以使用connect()
将套接字与该对端口相关联。然后他们可以简单地在新套接字上发送和接收参与转移。
同样,如果将socketpair()
与数据报套接字一起使用,则会在两个套接字之间创建伪连接。