C ++中的快速跨平台进程间通信

时间:2010-02-07 22:00:26

标签: c++ ipc p2p

我正在寻找一种方法来让两个程序有效地相互传输大量数据,这需要在Linux和Windows上以C ++工作。这里的上下文是P2P网络程序,其充当网络上的节点并且连续运行,并且其他应用程序(可能是游戏因此需要快速解决方案)将使用它来与网络中的其他节点通信。如果有更好的解决方案,我会感兴趣。

6 个答案:

答案 0 :(得分:15)

boost::asio是一个跨平台库,通过套接字处理异步io。您可以将此结合使用,例如Google Protocol Buffers用于实际消息。

Boost还为同一台计算机上的进程间通信提供boost::interprocess,但是asio允许您异步进行通信,并且可以轻松地为本地和远程连接提供相同的处理程序。

答案 1 :(得分:6)

我一直在使用ZeroC的ICE(www.zeroc.com),这太棒了。超级易用,它不仅是跨平台的,而且还支持许多语言(python,java等)甚至是库的嵌入式版本。

答案 2 :(得分:3)

好吧,如果我们可以假设这两个进程在同一台机器上运行,那么它们来回传输大量数据的最快方法是将数据保存在共享内存区域内;使用该设置,数据永远不会被复制,因为两个进程都可以直接访问它。 (如果你想更进一步,你可以将两个程序合并为一个程序,每个前'进程'现在作为同一进程空间内的一个线程运行。在这种情况下,它们将自动共享100%的内存彼此)

当然,在大多数情况下,仅拥有共享内存区域是不够的:您还需要某种同步机制,以便进程可以安全地读取和更新共享数据,而不会相互绊倒。我这样做的方法是在共享内存区域创建两个双端队列(每个队列一个用于发送)。使用无锁FIFO队列类,或者为每个双端队列提供信号量/互斥量,您可以使用它来序列化将数据项推送到队列中并将数据项弹出队列。 (请注意,您要放入队列的数据项只是指向实际数据缓冲区的指针,而不是数据本身......否则您将回到复制大量数据,这是您要避免的使用shared_ptrs而不是普通的C指针是个好主意,这样当使用它完成接收过程时,“旧”数据将自动释放。一旦你拥有了它,你需要的唯一另一件事就是进程A在它刚刚将一个项目放入队列以便B接收时通知进程B的方式(反之亦然)...我通常通过将一个字节写入另一个进程是select()的管道中,导致另一个进程唤醒并检查其队列,但还有其他方法可以执行此操作。

答案 3 :(得分:1)

这是一个难题。

瓶颈是互联网,你的客户可能在NAT上。

如果您不是在谈论互联网,或者您明确没有运营商级恶意NAT背后的客户,您需要说。

因为它归结为:使用TCP。吸吮它。

答案 4 :(得分:1)

我强烈建议在TCP或UDP套接字之上使用Protocol Buffers

答案 5 :(得分:0)

因此,虽然其他答案涵盖了部分问题(套接字库),但它们并没有告诉您NAT问题。不要让你的用户修改他们的路由器,最好使用一些技术,让你通过一个模糊的理智路由器,没有额外的配置。您需要使用所有这些来获得最佳兼容性。

首先,ICE library here是一种NAT遍历技术,可以在网络中使用STUN和/或TURN服务器。尽管有一些公共STUN服务器,但您可能必须提供一些基础设施才能工作。

其次,同时使用UPnP和NAT-PMP。例如,一个库here

第三,使用IPv6。 Teredo是运行IPv6 over IPv4的一种方式,当上述任何一种方式都没有时,通常可以工作,并且谁知道,您的用户可能通过其他方式使用IPv6。实现这一点的代码很少,而且越来越重要。例如,我发现大约一半的Bittorrent数据通过IPv6传播。