【问题标题】:Linux IPC multiple clients with daemon带有守护进程的 Linux IPC 多客户端
【发布时间】:2012-11-22 15:15:27
【问题描述】:

这真的很基本,但我现在正在空白。

我有一个守护进程,并希望多个客户端能够与之交谈。我希望客户端能够启动然后使用共享库,本质上是向守护进程“注册”。守护进程将为这个新客户端生成一个线程,并在客户端和新线程之间提供一个通信管道。

我正在考虑将 unix 数据报套接字作为所有客户端最初使用的“注册通道”,然后切换到特定于客户端的通道,但随后无法弄清楚如何为新的数据报套接字创建唯一名称而不设置它们先验的。

  • 服务器和客户端在同一台机器上,更喜欢使用数据报套接字,而不必处理将流分成数据包的问题。
  • 将来回发送(非常)高速率的小消息。

【问题讨论】:

  • 我认为你不需要任何特别的东西。单域套接字可以接受多个客户端,只需在其上开始通信即可。这个stackoverflow.com/questions/9644251/… 可能是重复的。
  • 我不能使用一个套接字与多个客户端通信,对吧?我仍然需要构建一些协商协议来设置辅助套接字,以允许服务器线程只与单个客户端通信。
  • 我认为每次接受都会返回一个新的文件描述符
  • 这仅适用于 (AF_UNIX, SOCK_STREAM) 套接字而不是 DGRAM 这将迫使我在消息中添加标头,然后必须在接收代码中将流分解为数据包。 Unix 数据报套接字在绑定之前必须有一个与之关联的名称。
  • 好的,我现在明白你在说什么了。我会看看我的 Stevens 副本。

标签: linux ipc unix-socket


【解决方案1】:

如果您愿意,您可以完全避免命名客户端套接字的问题。每个客户端都可以使用 socketpair() 创建一对连接的套接字。然后客户端发送一个 通过众所周知的“注册通道”将套接字描述符发送到服务器。然后,服务器和客户端有一对私有的、连接的、未命名的套接字用于它们的通信。

socket 描述符使用 sendmsg() 发送到服务器并填写 msg 的控制消息。

这两个答案有一些相关的信息/链接:

How would I use a socket to have several processes communicate with a central process?

Sending file descriptor over UNIX domain socket, and select()

【讨论】:

    【解决方案2】:

    基本上,我认为您需要妥协并有一个 2 阶段进程,其中 SOCK_STREAM 套接字作为第 1 阶段,SOCK_DGRAM 作为第 2 阶段。 所以它会是这样的:

    服务器:

    1. 创建 SOCK_STREAM 套接字“my.daemon.handshake”
    2. 接受客户
    3. 向客户端发送随机生成的字符串XXX并关闭 插座
    4. 创建一个 SOCK_DGRAM 套接字“my.daemon.XXX”并启动 处理它
    5. 重复 (2)

    客户

    1. 连接到套接字“my.daemon.handshake”
    2. 读取到 EOF -- 获取值 XXX
    3. 开始与套接字“my.daemon.XXX”上的服务器通信

    4. 利润!!!

    【讨论】:

    • 是的,这是我能想到的唯一方案,但它太“丑陋”了。这在 Unix 领域必须是一个相对普遍的事情。我可能只是硬着头皮使用本地 STREAMS 来为每个连接自动创建文件描述符。
    • 我不知道。这并没有让我觉得超级丑陋。您始终可以使用一些更高级别的抽象,例如 RabbitMQ、ZeroMQ 甚至 dbus。
    猜你喜欢
    • 2018-05-03
    • 1970-01-01
    • 2010-12-17
    • 2011-03-06
    • 2019-04-15
    • 2019-07-20
    • 2015-02-08
    • 1970-01-01
    • 2020-05-04
    相关资源
    最近更新 更多