首页 > 解决方案 > 如何在 Linux 中“反转”POSIX 消息队列?

问题描述

我试图弄清楚如何“反转”单个 POSIX 消息队列以启用客户端和服务器进程之间的双向通信,同时仅使用一个 POSIX 消息队列(即一次仅一个内存段)。本质上,这是一种支持双向通信的半双工设置,但消息一次只能沿一个方向流动。

标准方法是使用一个队列用于客户端 -> 服务器,一个队列用于服务器 -> 客户端,如下所示(这基本上是我当前的代码)。

客户:

...
int read = mq_open("servertoclient", O_RDWR | O_CREAT, 0600, 0);
int write = mq_open("clienttoserver", O_RDWR | O_CREAT, 0600, 0);
char send_buffer[8192];
mq_send(write, send_buffer, 8192, 0); //send message to server
char receive_buffer[8192];
mq_receive(read, receive_buffer, 8192, 0); //receive response from server
mq_close(write);
mq_close(read);
mq_unlink("servertoclient");
mq_unlink("clienttoserver");
...

服务器:

...
int write = mq_open("servertoclient", O_RDWR | O_CREAT, 0600, 0);
int read = mq_open("clienttoserver", O_RDWR | O_CREAT, 0600, 0);
char send_buffer[8192];
mq_send(write, send_buffer, 8192, 0); //send message to client
char receive_buffer[8192];
mq_receive(read, receive_buffer, 8192, 0); //receive response from client
mq_close(write);
mq_close(read);
mq_unlink("servertoclient");
mq_unlink("clienttoserver");
...

我正在寻找一种方法来完成几乎相同的事情,但一次只使用一个消息队列,而不是同时为每个方向使用一个消息队列。唯一的区别是单队列不支持同时发送/接收,这在我的情况下是可以的。服务器和客户端将使用某种特殊的“代码”来表示队列反转。这类似于您在收音机中讲话,然后松开按钮,接收器的收音机会发出哔哔声,让他们知道您已完成通话。然后你收听接收者的信息,直到你的收音机发出哔哔声。但是发送者和接收者永远不能互相交谈。

这些方面的东西:

客户:

open a single queue with mq_open for writing to the server
send some data
send a special message notifying the server that the queue is to be reversed
prepare queue for reading (not sure how to do this)
read data from server until the 'reverse' message is received, then revert queue to write
... keep going like this until a terminating message is received or client exits

unlink the queue

服务器:

open a single queue with mq_open for reading from client
read in data
if the terminating message is read, 
   prepare queue for writing to client
send data and finish by sending the special 'reverse' message
prepare queue for reading
... keep going like this until a terminating message is received or server exits

unlink the queue

例如,客户端将始终启动第一条消息,因此服务器希望最初发送消息永远不会有任何危险。

我不愿意使用任何其他进程间通信方法(例如共享内存、sysv 队列、管道、tcp/udp 等)。

标签: c++posixmessage-queue

解决方案


推荐阅读