如何使用QThreads在QT中实现POSIX消息传递?

时间:2011-04-24 01:13:17

标签: posix message-queue

我正在编写需要与IPC一起工作的客户端/服务器应用程序。我使用TCPSockets开发了程序,但现在想尝试使用消息队列。服务器只运行直到客户端连接。客户端连接后,它可以向服务器发送任何整数,然后显示在服务器上。多个客户端可以连接到服务器并发送整数,这对服务器和连接的客户端是可见的。

不使用套接字,我将如何实现此功能?可以连接任意数量的客户端。我正在考虑使用QThread来处理轮询以查看客户端是否已连接(?)但这是我被困的地方 - 您如何告诉客户端已连接?

2 个答案:

答案 0 :(得分:1)

请参阅此问题我询问是否使用POSIX消息队列建立“连接”: Using POSIX message queues instead of TCP sockets - how to establish "connection"?

我确实得到了它的工作,但最终开发了对Unix域套接字的支持,这给了我在MQ中享受的加速,但没有实现的复杂性。现在,出于某种原因,你在问题中说“不使用套接字”,所以我不知道你是否愿意使用Unix域套接字替换TCP而不是使用MQ,但如果你愿意尝试,我会做推荐它。 Unix域套接字确实支持面向连接的操作(以及无连接),因此您可以在没有应用程序复杂性的情况下解决如何知道何时建立或断开连接的问题(与TCP相同)。

答案 1 :(得分:0)

对于MQ来说,这不是一个特别好的用例,但你可以做到。

没有与消息队列“连接”的真实概念。从概念上讲,它们更像是一个邮箱。您的客户端会在以后的某个时间内删除一封信 - 几毫秒到几天,具体取决于服务器的设计方式 - 服务器决定打开邮件并对其进行处理。

在您的情况下,您可能会考虑让客户端可以向其发送消息的已知队列(客户端知道MQ的路径)。每个客户端都将创建一个自己的队列来接收响应。发送给服务器的消息可能包含客户端将从中读取响应的队列路径。服务器以整数响应客户端队列。这可以工作,但这不是你想要扩展到任何程度的东西。

客户端和服务器都有两个用于读取队列的选项。他们可以在mq_receive中阻塞,直到有东西要读。他们可以使用mq_timedreceive进行轮询。当队列中有新内容时,他们可以使用mq_notify接收信号(或创建线程)。或者,在linux上,他们可以在select(或类似)语句中使用mqd_t。