如何在 C++ 中将字节数组发送到另一个进程

Posted

技术标签:

【中文标题】如何在 C++ 中将字节数组发送到另一个进程【英文标题】:How to send a byte array to another process in C++ 【发布时间】:2012-11-19 14:07:57 【问题描述】:

我一直在网站上查看一种将数据从一个进程传输到另一个进程的 C++ 方法。我找到了方法 SendMessage() 但它似乎无法获取字节数组。

为了稍微解释一下这里的上下文,我有一个向另一个应用程序发送数据的应用程序。我们有几个具有不同 ID 的对象。接收的应用程序为每个不同的对象创建一个选项卡。如果接收数据的应用程序关闭,我们将启动一个新进程并将数据显示给用户。如果我们第二次发送,我们需要检查 ID 以查看我们是否已经拥有其中一个对象,如果是则替换它。否则为新对象添加新选项卡。

我们使用来自 google 的协议缓冲区,它们使用字节数组进行传输和序列化,这就是为什么我需要找到一种方法将字节数组从一个进程发送到另一个进程。

我能够获得进程的 HWND,但我不知道从现在开始。

【问题讨论】:

添加了 windows 标签,因为您提到您使用的是 HWND(这是特定于平台的问题) 您不想为此使用 Windows 消息。您可以使用命名管道、本地套接字、文件、共享内存或几乎任何您喜欢的其他通信机制。有关更多选项,请参阅this article。 (如果你真的想用windows消息here's how。) 你可以考虑使用socket IO。例如,在 *nix 中使用 Berkeley 套接字(我认为 Windows 实现了这些的变体?)。 【参考方案1】:

进程间通信是特定于平台的事情。在 Windows 中,有很多方法可以做到这一点。这篇 MSDN 文章描述了几种方法及其优缺点和用例:

http://msdn.microsoft.com/en-us/library/windows/desktop/aa365574(v=vs.85).aspx

当您控制这两个应用程序,并且不关心对第 3 方应用程序的支持时,通过 SendMessage() 将 WM_COPYDATA 消息发送到其他进程可能是一个好方法。

【讨论】:

如果使用套接字,IPC 可以相对跨平台。 另外,一个 SO 问题给出了如何使用 WM_COPYDATA 的示例:***.com/questions/2451103/… 感谢大家的闪电般快速的回复,这回答了我的问题。 @Robert Mason:在主机内部滥用 TCP/IP 堆栈进行进程间通信对我来说似乎很不自然。您必须牢记一些安全隐患——您不希望网络上的任何人向您的应用程序发送数据。还有一些互联网安全套装会在应用程序尝试打开服务器套接字时通知用户 - 与在您的支持论坛上声称 ZoneAlarm 已将您的产品识别为木马的人一起玩。此外,套接字在 C++ 上根本不是跨平台的,除非您使用像 boost.asio 这样的第 3 方库。 @Philipp:在 unix 上,AF_UNIX 地址系列明确存在于此目的。此外,使套接字跨平台所需的只是一个小头文件,它将处理所有平台相关的头文件和 typedef int SOCKET。然后,您只需要为 windows 提供一些存根初始化函数。可能有 20 行代码。 boost.asio 也很棒。如果您想在集群中扩展您的应用程序,那么如果您使用单独的进程和套接字而不是线程和本地 IPC 机制,则此过程会更加容易。尽管那是另一天的圣战。【参考方案2】:

如果你想使用 SendMessage,你可以使用 WM_COPYDATA 消息发送一个数据块,尽管它只是一个字节块,而不是一个对象。

【讨论】:

以上是关于如何在 C++ 中将字节数组发送到另一个进程的主要内容,如果未能解决你的问题,请参考以下文章

将 C# 3D 数组作为 1D 字节数组传递给 C++ 库

如何在 C++ 中将字节数组转换为十六进制字符串?

如何在c ++中将int数组转换为字节数组[重复]

如何在 Visual C++ 中将字节数组转换为十六进制字符串?

如何在C ++中将字节数组中的整数转换为数字

如何在 Java 中将 libGDX 的纹理转换为字节数组并再次返回