【问题标题】:How do I establish communication between multiple applications across languages如何跨语言在多个应用程序之间建立通信
【发布时间】:2013-06-03 19:24:32
【问题描述】:

我目前正在运行两个与同一操作相关的程序。程序 A(用 vb6 编写)是一种“控制器”,它打开设备并启动程序 B(用 C++ 编写),开始收集设备数据。现在,程序 B 需要一种方法将一些 MINOR 数据报告回程序 A。程序 A 还需要监视某些额外的数据,如果信号 1 触发,它需要让程序 B 知道。建立这种沟通的最佳方式是什么?显而易见的方法是每个程序读取和写入的文本/二进制文件(没有最好的方法),而且我还考虑使用 UDP 进行通信,因为机器将在封闭的网络上。但是,我不确定我应该如何实际执行此操作?

【问题讨论】:

  • 最好的方法是一些数据库(根据要求选择),定义语法(SQL)来访问数据。
  • 但是如何使用数据库触发和同步呢?大多数不提供任何形式的异步更新通知,迫使您在程序中进行一些讨厌的轮询。
  • 我同意鲍勃的观点。 DB 不适合通信要求,并且可能会超过杀戮,因为所需的通信是基本信号。

标签: c++ sockets vb6 synchronization communication


【解决方案1】:

命名管道是一个优雅的解决方案,但您甚至可以按照您所说的那样使用文件。

http://support.microsoft.com/kb/177696

How to work with named pipes (C++ server , C# client)

【讨论】:

  • 对此进行调查。如果我最终确定这是解决方案,将标记。
【解决方案2】:

还有其他选择: 剪贴板、COM、数据复制、DDE、文件映射、邮槽、管道、RPC、Windows Sockets

参考这里:http://msdn.microsoft.com/en-us/library/windows/desktop/aa365574%28v=vs.85%29.aspx

【讨论】:

  • 您也可以使用 MSMQ。私有机器队列易于创建、销毁和使用。
  • 无论您选择什么,请确保在程序崩溃/结束时释放资源。我确信命名管道在崩溃时肯定会被释放。
  • 如果程序 A 运行程序 B,那么也可以使用匿名管道。任何一种管道、Malslots 等的大问题是 VB6 程序缺乏干净的异步实现。这意味着忙等待循环或计时器驱动的轮询,它可以工作但不是那么优雅。
【解决方案3】:

您如何打开设备并启动程序 B?

我会使用相同的频道进行额外的通信,因为这条线路已经在那里并且正在工作(因为程序 B 已经启动)

【讨论】:

  • 程序 A 只是简单地关闭程序 B。目前没有建立通信线路。
  • 啊,由于程序 A 启动了一个设备,我认为程序 B 正在该设备上运行……如果它是一个简单的 shell,那么所有通道都可以工作 :)
【解决方案4】:

我个人会选择使用标准协议(如 FTP 或 HTTP)建立通信并传输数据。这样,当您的程序 A 或程序 B 发生变化(或连接介质被换成另一个)时,您仍然可以拥有一个定义明确且易于实现的通信协议。网络堆栈可用于各种 CPU 和操作系统,并且 FTP(或 TFTP)易于实施。

【讨论】:

  • 我看不出这两种方法是如何工作的。两个程序都需要发送消息并通知另一个程序。充其量这两个程序都必须同时实现客户端和服务器,因为它们是“单向”协议。
  • HTTP 对于这个问题可能是矫枉过正。顾名思义,TFTP 可能是一个不错的选择,而且实施起来很简单。或者也许使用 TFTP 从设备下载大量数据负载,并通过 UDP 使用单独的自定义协议来进行简单的信令。
  • 我不是在程序之间传输文件,而且两个程序都在同一台 PC 上,所以我觉得 TFTP 和 HTTP 都过大了,因为我最多可能会发送 50 个字符。感谢您的想法
  • 哦。你说你有另一个设备来运行程序。在这种情况下是的,管道/套接字应该可以。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-10
相关资源
最近更新 更多