5

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

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

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

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

2 回答 2

4

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

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

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

我将如何使用套接字让多个进程与中央进程通信?

通过 UNIX 域套接字发送文件描述符和 select()

于 2013-05-05T17:37:23.977 回答
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. 利润!!!!

于 2012-12-05T00:50:15.890 回答