【问题标题】:Sending images from a C++ process to a C# process将图像从 C++ 进程发送到 C# 进程
【发布时间】: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,代码仍然可以工作。

标签: c# c++ image tcp udp


【解决方案1】:

只需转移到完全托管的代码:p(将它们全部保存在同一进程中)

https://net7mma.codeplex.com/SourceControl/latest 有一个 C# RtspServer 和 RtpClient

【讨论】:

    【解决方案2】:

    进程间通信可以通过套接字或管道完成。

    使用套接字(TCP 和 UDP),您实际上是通过互联网向自己发送数据。幸运的是,因为你的 comp 知道自己,数据不应该离开 comp,所以这应该很快。 TCP 保证是有序的,并具有许多其他不错的功能,而 UDP 几乎是在数据上添加一些标头并希望获得最好的结果。对于这个应用程序,TCP 应该没问题。 UDP 增加了不必要的复杂性。

    管道是让两个进程进行通信的另一种方式。您基本上让 C++ 或 C# 进程创建一个管道并启动另一个进程。您只需像使用文件一样使用管道:写入和读取它。这可以在 C/C++ 中使用 pipeforkexec 函数的组合或简单地使用 popen 函数来完成。 C# 可能也有类似的功能。

    我建议使用_popen 的管道,(对于 windows 的弹出窗口)并将一系列整数写入管道并从另一侧读取它。这可能是最简单的方法......当然除了使用一种语言......

    【讨论】:

    • OP 说他使用的是 Windows 7 操作系统,其中 pipe()fork()exec()popen() 不可用。
    • 在 Windows 上,您的意思分别是 CreatePipe、(无等效项)、CreateProcessOpenProcess 函数。
    【解决方案3】:

    除了套接字之外,一种方法是将图像数据从 C++ 应用程序保存到磁盘上,然后在 C# 应用程序中从磁盘上读取它。当然,您需要确保某种读/写同步,以便文件在完全写入之前不会被读取。

    或者您最终决定使用 UDP 或 TCP,请尝试使用 RTP。 RTP 使用带有额外时间戳层的 UDP,序列编号以确保数据传递的正确顺序。您应该能够找到该协议的 C++ 和 C# 实现。特别要提到的是,如果您的应用程序正在生成 JPEG 图像,您可以通过 RTP/MJPEG 流发送图像。

    【讨论】:

      【解决方案4】:

      我想知道这是否是最好的方法,是 UDP 还是 TCP 更好?

      当 TCP 不够快并且丢包不方便而不是无法处理时,您通常会使用 UDP 作为速度优化。如果您无法处理在传输过程中丢失部分图像,我怀疑您可以求助于 UDP。

      此外,UDP 不太可能在您的情况下提高性能,因为您将使用环回接口。这意味着所有 TCP 数据包都可能按顺序到达且不会丢失,从而使 TCP 变得格外便宜。

      如果您使用 TCP 编写应用程序,并且将来出于某种原因,您决定进程不再在同一台机器上运行,您将不必更改代码。

      最后,TCP 套接字更容易使用,所以除非你的机器上的 TCP 速度不够快,否则我会坚持使用 TCP 套接字。

      如果在本地通信,UDP是否保证顺序?

      AFAIK,此行为不保证。它很可能在大多数情况下都有效,但除非您能从相关文档中找到报价,否则我不会指望这一点。

      我可以使用命名管道来发送图像吗?

      是的,命名管道与套接字非常相似,但众所周知它们很慢。

      【讨论】:

        【解决方案5】:

        为什么你不能在同一个过程中做到这一点?是因为你需要混合 C# 和 C++ 吗?在这种情况下,C++/CLI 可以用作环境之间的桥梁,以便在一个进程中同时拥有 .NET CLR 的 C# 代码和本地编译的 C++ 代码。

        如果您确实需要两个进程,则在本地计算机上运行时有多种选择,但基于 TCP 的小型服务可能是最好的。每张图片的大小为 307kb,大于 UDP 的 65kb 限制。

        【讨论】:

          【解决方案6】:

          如果您同时编写这两个程序,您可以将 C++ 之一编译为 DLL,并调用函数,该函数从您的 C# 程序中返回一个数组或某些结构,并在 System.Runtime.InteropServices 命名空间中使用 DllImport 属性。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-03-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-09-21
            相关资源
            最近更新 更多