我正在尝试将已编译的C ++进程中的图像数据发送到已编译的C#进程。 C ++进程正在访问网络摄像头并对图像进行一些处理。该图像由2D像素阵列表示,每个像素值是8位值(0-255),该值是该像素的灰度值。 图像尺寸为640 x 480。
C#应用程序执行更多处理并将此图像显示在屏幕上。这些进程在我的笔记本电脑(Windows 7操作系统)上同时运行,但我不能制作一个完成所有步骤的过程,这就是我需要使用C ++和C#代码进行通信的原因。
我想知道最好的方法是什么?我读到了在C#部分编写UDP或TCP服务器以及在C ++部分编写客户端,然后我可以将图像数据作为数据报发送。我想知道这是否是最好的方式,如果是UDP或TCP是否更好?
编辑:C ++进程是非托管C ++,我没有选择将其作为托管DLL运行。我可以使用命名管道发送图像吗?如果在本地进行通信,最后是UDP保证顺序吗?我意识到图像将超过UDP的限制,但如果它是有序的,我应该能够分割图像以便发送。
答案 0 :(得分:2)
如果您正在编写这两个程序,则可以将C ++编译为DLL,并使用System.Runtime.InteropServices命名空间中的DllImport属性调用从C#程序返回数组或某些结构的函数。
答案 1 :(得分:2)
进程间通信可以通过套接字或管道完成。
使用套接字(TCP和UDP),您实际上是通过互联网向自己发送数据。幸运的是,因为你的comp知道自己,数据不应该离开comp,所以这应该很快。 TCP保证是有序的,并且具有许多其他不错的功能,而UDP几乎是对数据的一些标题,并希望最好。对于这个应用程序TCP应该没问题。 UDP增加了不必要的复杂性。
管道是让两个进程进行通信的另一种方式。您基本上有C ++或C#进程创建管道并启动其他进程。你只需像文件一样使用管道:写入和读取它。这可以使用pipe
,fork
和exec
函数的组合在C / C ++中完成,或者只使用popen
函数。 C#可能具有类似的功能。
我建议使用_popen
(popen for windows)管道,并在管道中写入一系列内容并从另一侧读取。这可能是最简单的方法......当然除了使用一种语言......
答案 2 :(得分:1)
为什么你不能在同一个过程中这样做?是因为你需要混合使用C#和C ++吗?在这种情况下,C ++ / CLI可以用作环境之间的桥梁,以便在一个进程中本地编译.NET CLR的C#代码和C ++代码。
如果您确实需要两个进程,则在本地计算机上运行时有几个选项,但基于TCP的小型服务可能是最佳选择。每张图像的大小为307kb,大于UDP的65kb限制。
答案 3 :(得分:0)
我想知道这是否是最佳方式,是否UDP或TCP是否更好?
当TCP速度不够快且数据包丢失不方便而不是无法处理时,您通常会使用UDP作为速度优化。如果您无法处理传输中丢失部分图像,我怀疑您可以使用UDP。
此外,由于您将使用环回接口,UDP不太可能在您的情况下提高性能。这意味着所有TCP数据包都可能按顺序到达而不会丢失,从而使TCP更加便宜。
如果您使用TCP编写应用程序,并且将来由于某种原因,您决定不再在同一台计算机上运行进程,则无需更改代码。
最后,TCP套接字更容易使用,所以除非TCP在你的机器上不够快,否则我会坚持使用TCP套接字。
如果在本地通信,则按顺序保证UDP吗?
AFAIK,此行为无法保证。它很可能在大多数时间都有效,但除非您能从相关文档中找到引用,否则我不会指望这一点。
我可以使用命名管道发送图像吗?
是的,命名管道与套接字非常相似,但已知它们很慢。
答案 4 :(得分:0)
除了套接字之外,这样做的方法是将图像数据从C ++应用程序保存到磁盘上,并从C#应用程序的磁盘中读取。当然,您需要确保某种读/写同步,以便在完全写入之前不读取该文件。
或者您最终决定使用UDP或TCP,尝试使用RTP。 RTP使用带有额外时间戳层的UDP,序列编号以确保正确的数据传送顺序。您应该能够找到协议的C ++和C#实现。特别要提到的是,如果您的应用程序正在生成JPEG图像,您可以通过RTP / MJPEG流发送图像。
答案 5 :(得分:0)
转移到完全托管的代码:p(将所有内容保存在同一个进程中)
https://net7mma.codeplex.com/SourceControl/latest有一个C#RtspServer和RtpClient