多路进程间通信

Posted

技术标签:

【中文标题】多路进程间通信【英文标题】:multi way inter process communication 【发布时间】:2014-01-30 14:45:54 【问题描述】:

我的机器中有 10 个进程,每个进程都应该能够相互通信。 现在的场景是所有 10 个进程都应该处于侦听状态,以便任何进程都可以随时与其通信。同样,在需要时,它应该能够将消息传递给任何进程。 我正在尝试使用 C++ 和 unix tcp/udp 套接字对其进行编码。但是我不明白如何构造它。我应该使用 UDP 还是 TCP,哪个更好?一个进程如何同时监听和发送数据。

我需要帮助。

【问题讨论】:

异步读写函数同时列出和写入 哪个环境? *尼克斯?窗户? 通常,我们会创建一个新线程来读取套接字。 【参考方案1】:

UDP 还是 TCP 的决定取决于您的消息,它们是否需要可靠地传递等等。

对于纯 TCP,每个对等点都有一个 TCP 套接字,每个进程在该套接字上接受来自其他对等点的连接(每个接受都会产生一个新的套接字)。这个新的套接字是双向的,可用于从一个对等方发送/接收到另一个。使用此解决方案,您将需要某种发现机制。

对于 UDP,除了不需要接受套接字之外,它几乎相同。您仍然需要某种形式的发现机制。

发现机制可以是另一个具有众所周知(通过配置等)地址的对等点,或者您可以使用 UDP 广播作为发现机制。

zeroMQ 而言,它比原始套接字略高,您将有一个ROUTER 套接字用于监听和接收数据,并且每个对等点都有一个DEALER 套接字,您可以在该套接字上使用'正在发送数据。

无论解决方案如何,您都可能需要一个线程来使用 poll() 或类似的东西来处理网络连接,并且在收到消息时,您需要另一个线程(或线程池)来处理消息。

【讨论】:

【参考方案2】:

您可以更严格地运行每个进程并跨越 9 个线程来连接其他进程作为客户端。

【讨论】:

能否请您详细说明。我不明白你 每个进程将侦听 1 个端口(将在该端口接收数据)。如果进程想向任何其他进程发送消息,可以作为客户端发送给他们。【参考方案3】:

这个问题适用于任何语言,所以答案与 C++ 无关。

当有选择时,寻找一个更容易沟通的库(例如 apache-thrift)。

关于 TCP/UDP:TCP 通常速度较慢但更可靠,因此默认情况下选择 TCP,但可能有选择 UDP 的原因,例如流式传输、多播/广播......所有进程都在同一个板上,但您可能希望稍后与外部进程通信。

线程进程可以使用同一个套接字进行发送和接收而无需锁定。

此外,您需要某种方案来确定要发送到哪个端口才能到达进程,并且使用 TCP,您需要决定是使用静态连接还是每次要发送时都连接。

【讨论】:

【参考方案4】:

您想要做的似乎是消息传递。

在尝试自己构建之前,先看看 boost mpi

【讨论】:

以上是关于多路进程间通信的主要内容,如果未能解决你的问题,请参考以下文章

Linux系统编程--进程间通信 ---管道篇

#2021年底大盘点#TCPIP协议-多路复用

Linux进程间通信——管道

Linux进程间通信

进程间通信

进程间通信和线程间通信