快速通信C++和C#之间的最佳方法

5
我们正在开发一个新的视觉检测系统应用程序。实际的检测系统需要使用C++,因为有很多原因。对于该系统,我们将使用Boost和Qt。
对于我们的用户界面(UI),我们目前考虑使用WPF/C#来进行UI和基于SQL的报告。复杂的因素是UI必须在与C++检测系统相同的本地计算机上运行,或者在检测系统没有显示器或键盘的情况下在另一台计算机上远程运行。
我们关注的问题是两个系统之间传输数据的最快方法是什么?我们目前正在考虑使用基于套接字(socket)的系统,使用Google协议缓冲区进行序列化。协议缓冲区将生成C++和C#代码(jskeet/dotnet-protobufs)。
有人有什么建议/经验吗?

TCP和protobuf听起来不错。您有具体的关注点或问题吗? - dtb
1
protobuf-net 似乎是 .NET 平台上首选的 Protocol Buffers 实现。 - dtb
这是我没有太多经验的领域。我在想是否有更好的选择。 - photo_tom
1
这在很大程度上取决于您需要的交互方式。您的问题并没有详细说明您希望在两个系统之间如何进行通信。如果您遵循RESTful方法,您的应用程序可能会从消息队列基础架构中受益; 如果您遵循RESTful方法,架构决策将变得更加容易。这真的取决于您想要做什么。如果您只需要原始性能,则可以基于套接字和protobuf发明自己的协议,它将起作用。 - dtb
通信单元的频率/数量/大小,可靠性/吞吐量/延迟保证,授权/身份验证/机密性要求,消息/服务/资源导向架构等。 - dtb
@dtb 很好的问题。然而,在这种情况下,事情要简单得多。安全性不是问题,因为系统在防火墙内部的隔离网络上运行。保证响应问题在设计中处理。我们只是假设它们都偏向于不好,并相应地进行设计,以便只要网络仍在工作,系统就会解决这些问题。我们仍在研究整体通信架构,所以所有内容都有待确定。您的评论非常有帮助,谢谢。 - photo_tom
2个回答

1

如果你真的想要与你的C++检测系统进行最快速的通信,那么我建议你同时实现两种情况。一种是使用命名管道来创建本地接口(参见这里Interprocess communication for Windows in C# (.NET 2.0)),另一种是使用Google协议缓冲区来创建远程接口,适用于你的检测系统没有键盘和/或显示器的情况。

然后,用户界面首先尝试在本地计算机上打开一个命名管道,如果失败了,用户就必须输入一个远程地址以进行套接字通信。

希望这能有所帮助...


1
非常感谢您提供的链接。我已经按照SO问题50153上的链接找到了命名管道绑定类(http://msdn.microsoft.com/en-us/library/system.servicemodel.netnamedpipebinding.aspx)。这真的很有趣,但是根据MSDN页面上的评论,似乎每个消息存在一个16k到20k的隐藏限制。这可能会给我们带来问题,因为我们有一些消息块将超过此大小。 - photo_tom

0
如果您真的想要速度最快并且成本最低的话,我建议您看一下 zeromq。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接