【问题标题】:How to implement POSIX message passing in QT using QThreads?如何使用 QThreads 在 QT 中实现 POSIX 消息传递?
【发布时间】:2011-04-24 01:13:16
【问题描述】:

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

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

【问题讨论】:

    标签: posix message-queue


    【解决方案1】:

    请参阅我提出的关于使用 POSIX 消息队列建立“连接”的问题: Using POSIX message queues instead of TCP sockets - how to establish "connection"?

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

    【讨论】:

      【解决方案2】:

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

      消息队列没有真正的“连接”概念。从概念上讲,它们更像是邮箱。您的客户端将一封信放入其中,稍后 - 毫秒到几天,具体取决于服务器的设计方式 - 服务器决定打开消息并处理它。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-03
        • 2017-03-08
        • 2020-01-29
        • 1970-01-01
        • 2014-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多