【问题标题】:Why does socketpair() allow SOCK_DGRAM type?为什么 socketpair() 允许 SOCK_DGRAM 类型?
【发布时间】:2017-11-03 03:15:20
【问题描述】:

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

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

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

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

socketpair() 调用在 指定域,指定类型...

这里不矛盾吗?

我认为PF_LOCALPF_INET 域中的SOCK_DGRAM 暗示了UDP,这是一个无连接协议,所以我无法调和socketpair() 声称创建连接套接字的表面冲突。

【问题讨论】:

    标签: linux sockets socketpair


    【解决方案1】:

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

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

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

    【讨论】:

    • 在数据报套接字上使用connect() 还可以在该套接字上使用recv()send(),而不必使用recvfrom()sendto()
    • @RemyLebeau 我认为您可以在未连接的套接字上使用recv(),您只是不知道它来自哪里。但你是对的send()
    猜你喜欢
    • 1970-01-01
    • 2019-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    相关资源
    最近更新 更多