2017-06-01 67 views
0

我最近一直在学习Linux套接字编程,主要是从this site为什么socketpair()允许SOCK_DGRAM类型?

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

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

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

的socketpair()调用创建 一位不愿透露姓名对连接插座指定的域名,指定的类型...

这里没有矛盾吗?

我认为在PF_LOCALPF_INETSOCK_DGRAM暗示UDP,这是一种无连接协议,所以无法调和socketpair()的要求似乎的冲突来创建连接的套接字。

回答

1

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

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

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

+0

在数据报套接字上使用'connect()'还可以在该套接字上使用'recv()'和'send()',而不必使用'recvfrom()'和'sendto()'。 –

+0

@RemyLebeau我认为你可以在未连接的套接字上使用'recv()',你只是不知道它来自哪里。但是你对'send()'是正确的。 – Barmar

相关问题