【问题标题】:POSIX message queues or unix domain sockets for local IPC用于本地 IPC 的 POSIX 消息队列或 unix 域套接字
【发布时间】:2011-06-01 04:37:53
【问题描述】:

我需要在客户端和服务器之间设置本地 IPC。它是单服务器多客户端的情况,需要双向交换数据。客户端是一个发送命令选项的命令,服务器获取数据并将其发送给客户端。客户端在控制台打印从服务器接收到的输出。

命令发送的数据很小,但服务器发送给命令的数据很大(~11Mb)。 Windows 中的现有设计使用命名管道以 65 KB 的块发送数据。服务器需要同时向多个命令客户端发送数据,因为不同终端同时执行具有不同选项的命令是很常见的。

我省略了 FIFO,因为来自多个进程的数据可以交错处理大小大于 4096 字节的消息。如果我错了,请纠正我。

考虑到以下两个标准,POSIX 消息队列或 unix 域套接字哪个是更好的选择?

  1. 消息大小(65K)
  2. 不应交错来自多个客户端的数据。只有发往该客户端的数据才能被客户端接收。

如果您需要更多详细信息,请告诉我。

问候,罗希尼·钱德拉

【问题讨论】:

    标签: linux ipc


    【解决方案1】:

    听起来你想要一个套接字。使用 bind 在服务器上设置套接字,然后当每个客户端连接到它时,服务器可以分叉来单独处理每个客户端,或者使用 select 来处理客户端。分叉通常更简单:

      int sock = create and bind the socket to any port
    
      while (1) {
        int client = accept(sock);
        pid_t pid = fork()
        if (pid == 0) {
           // Handle client command
           exit(0);
        }
      }
    

    【讨论】:

    • 感谢丹尼尔的建议。您能否让我知道 unix 域套接字最能满足您想要的标准之一。我问是为了学习。
    • Sockets 会自动分离不同的客户端数据流。每次客户端连接时,服务器都会创建一个新的临时套接字,并将原始服务器套接字留给新客户端使用。使用消息队列,您必须实现自己的分离。此外,套接字使用 POSIX 标准的 read() 和 write() 系统调用,因此维护者更容易理解。
    • 谢谢丹尼尔。我认为由于 Linux 消息队列在打开消息队列时会提供文件描述符,因此我们可以为每个客户端都有一个新的描述符。但是为了让它起作用,我认为操作系统应该支持这种分离,就像 windows Named Pipes 天生一样。我不确定 Linux 消息队列是否能处理这个问题。
    • 虽然每个客户端都有自己的消息队列描述符,但它始终是同一个队列。因此,当服务器将数据写入队列时,您的客户端必须在将消息从队列中删除之前知道该消息是否是给他们的,因为所有客户端都从同一个队列中读取。
    猜你喜欢
    • 2011-04-16
    • 2013-04-16
    • 2020-10-30
    • 1970-01-01
    • 1970-01-01
    • 2014-07-24
    • 1970-01-01
    • 1970-01-01
    • 2019-08-21
    相关资源
    最近更新 更多