【发布时间】:2012-03-24 09:04:50
【问题描述】:
我正在尝试将图像数据从已编译的 C++ 进程发送到已编译的 C# 进程。 C++ 进程正在访问网络摄像头并对图像进行一些处理。图像由二维像素阵列表示,每个像素值为 8 位值 (0-255),即该像素的灰度值。 图片尺寸为 640 x 480。
C# 应用程序执行更多处理并将此图像显示到屏幕上。这些进程都在我的笔记本电脑(Windows 7 操作系统)上同时运行,但我无法创建一个执行所有步骤的进程,这就是我需要 C++ 和 C# 代码进行通信的原因。
我想知道最好的方法是什么?我读到过在 C# 部分编写 UDP 或 TCP 服务器,在 C++ 部分编写客户端,然后我可以将图像数据作为数据报发送。我想知道这是否是最好的方式,如果是 UDP 还是 TCP 会更好?
编辑:C++ 进程是非托管 C++,我没有将它作为托管 DLL 运行的选项。我可以使用命名管道来发送图像吗?
如果在本地通信,最后是否保证了 UDP 的顺序?我意识到图像会超出 UDP 的限制,但如果它是有序的,我应该能够将图像拆分以发送过来。
【问题讨论】:
-
共享内存可能会有所帮助:stackoverflow.com/a/925272/390913
-
通常,您会希望使用 TCP,因为它是可靠的并且可以处理数据包丢失。但是在您的情况下,两个应用程序都在同一台机器上,因此不会丢失数据包,您可以侥幸逃脱。 UDP的优点是速度。 UDP 不检查丢失的数据包并且比 TCP 更快,因此如果您从网络摄像头流式传输视频而不是一次发送单个图像,您可能会看到使用 UDP 的性能改进。
-
代码的哪些部分是你写的?您是否使用 C++ 部分只是为了访问 C++ 库?如果您可以用 C# 编写自己的所有代码并且只需要访问 Lib,您可以尝试
dllimport -
@arc:由于 TCP 数据包在通过环回接口时也会按顺序到达并且不会丢失,因此 UDP 不太可能在 OP 的情况下产生明显的性能差异。此外,如果您想将这两个进程分布在不同的机器上,则可以保证如果您使用 TCP,代码仍然可以工作。