【问题标题】:Why do I need socketpair() when I have socket() with AF_UNIX?当我有 AF_UNIX 的 socket() 时,为什么我需要 socketpair()?
【发布时间】:2021-01-20 15:36:26
【问题描述】:

让我感到困惑的是,鉴于套接字是双向的,为什么我不能只在客户端打开 1 个带有 socket() 的套接字,在服务器上打开一个,让它们通过这个单一套接字进行通信?

我需要一对套接字的常见用例是什么?

【问题讨论】:

  • 简单?使用socketpair,您只需要调用一个函数。
  • socketpair 只是在您的进程中获取一对匿名连接的本地套接字的快速便捷方式。这不是绝对必要的,但比等效的 socket/socket/bind/listen/connect 步骤要快得多,因为这些步骤只是最终目标的开销,并且需要内核执行许多额外的步骤。
  • 标题并未反映您在问题正文中实际提出的问题。在标题中您询问差异,在正文中 socketpair 用于什么。标题的答案:socket 创建 一个 socket,而 socketpair 创建 两个 socket,它们也连接彼此。

标签: c linux sockets


【解决方案1】:

socketpair 创建两个已经相互连接的套接字。一个常见的用例是父进程和子进程之间的通信:父进程创建套接字对,分叉子进程,然后子进程和父进程可以通过套接字对的末端相互通信。

【讨论】:

    【解决方案2】:

    那么我需要一对套接字的常见用例是什么?

    通常您希望在父进程和子进程之间(或有时在同一进程中的线程之间)进行双向通信。

    它类似于pipe 的双向等效项,并且避免为程序内部的某些内容暴露AF_UNIX 路径或任何其他公开可见的地址。

    有一个工作示例here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-03
      • 1970-01-01
      • 1970-01-01
      • 2020-04-14
      • 2023-01-24
      • 1970-01-01
      • 2021-11-05
      • 2015-07-11
      相关资源
      最近更新 更多