使用Linux POSIX IPC消息队列

时间:2013-04-23 15:21:48

标签: c linux posix ipc

我必须创建单个服务器进程A和多个客户端进程。所有应该使用Linux POSIX IPC消息队列进行数据传递。消息将在两个方向上流动。有时,多个客户端进程可能已注册到服务器进程A.

目前我只使用一个名为Message的队列,该队列由Server Process A创建和打开,并由客户端进程使用/打开(仅限)。这适用于两个进程场景(即一个服务器进程A和一个客户端进程B),但不适用于多个客户端进程和一个服务器进程。

我面临的问题是设计/逻辑。我应该如何从服务器进程A解复用来自其他客户端进程的消息以及来自服务器进程A的回复应该仅发送回相应的客户端进程,或者可以将其发送回所有客户端进程但是它必须只能在各自的客户流程中处理。

例如我只给出了一个场景。 假设进程A已经创建了消息队列X.进程B和C现在正在启动并且还打开消息队列X.现在进程B向消息队列X发送请求消息,但是这里的问题是进程A和进程C都将通过入队进入唤醒状态事件。这里,进程C如何理解Message不属于它。

  • IPC消息大小小于128字节。
  • IPc消息是定义结构包含整数和字节数组。结构中没有双重/浮动。
  • IPC消息队列处于NON_BLOCKING模式。
  • 没有高性能的授权。
  • 语言:C
  • 编译:GCC
  • 平台/操作系统:Linux
  • IPC消息队列:仅POSIX。
  • 我不想使用其他IPC mechansim,如System V消息或Unix本地套接字或管道等。

如果需要更多详细信息,请与我们联系。

请建议我解决此问题的方法。

仅供参考:我已经在数据库中进行过搜索,但我找不到类似的问题/已经回答过,所以请在确定复制之前确认。如果您发现类似的问题已经被问及答案,那么请提供链接。

4 个答案:

答案 0 :(得分:2)

如果我正确理解了场景,那么听起来你需要多个消息队列。尝试使用单个消息队列进行多个进程之间的双向通信将变成复杂的情况。如果没有查看消息的能力,服务器进程甚至很难将特定消息发送到特定客户端。

  • 有一个消息队列,它是客户端用来建立“私有”消息队列的通用消息队列。想要与服务器打开通信通道的客户端可以向该队列上的服务器发送消息。也许让客户端发送队列的名称(例如,使用进程ID),以便服务器打开。
  • 然后,服务器可以专门为该客户端打开一个新的消息队列以进行双向通信(或者根据用途,打开两个队列可能是有意义的,一个用于客户端和服务器之间的每个方向)。 LI>

答案 1 :(得分:0)

也许不是你怀疑的答案,但考虑根本不使用POSIX IPC。我大约15年前使用SysV IPC设计了一个应用程序。这是我最糟糕的设计决定之一。

今天我将使用具有适当协议的TCP / UDP。除了它将来允许将各个组件移动到不同的计算机这一事实之外,IP堆栈得到了大量使用和支持。

使用TCP,您可以建立良好的1:1和个人1:多个面向连接的通信。使用UDP,您可以实现1:1,1:许多和许多:许多非面向连接的通信。您需要密切关注安全问题,但是有很多有用的教程和支持库。

同样对于TCP / UDP可移植性要好得多。

答案 2 :(得分:0)

我构建了一个像多年前这样的系统,我无法记住所有细节,但想法是在msgrcv()中使用一个参数来指示如何从队列中读取消息。

在服务器想要仅向一个客户端发送消息的消息类型(msgbuf.type)中,我使用目标进程的pid作为消息的类型。客户端只读取类型等于其pid的消息。

当然,客户需要在启动时将他的pid发送到服务器。

答案 3 :(得分:0)

System V在msgrcv()中有一个选项,用于从队列中获取特定消息,这样每个客户端都可以读取服务器在单个队列中发布的消息。因此,我们可以使用单个队列进行全双工通信。在POSIX中没有这样的选项,所以我们必须选择一个两个单独的队列,一个用于服务器从客户端接收所有队列,每个客户端应该有一个单独的队列来接收frm服务器。 qid应该是所有过程都知道的。