C++ 和 Java 之间的低延迟 IPC

2024-01-20

对于以下情况,实现 C++/Java IPC 的最佳方法是什么?

(最近有人问类似的问题 https://stackoverflow.com/questions/5900887/ipc-between-java-and-c-applications,但我的要求更具体)

  1. 我有两个程序——一个用 C++ 编写,另一个用 Java 编写——需要相互通信。两者都在同一台机器上运行。

  2. 程序相互发送消息。消息通常很短(少于几百字节),但大小可能为 100KB 或更大。

  3. 消息不需要确认(即不是像 HTTP 那样的请求/响应模型)。例如,C++ 程序向 Java 程序发送消息,Java 程序可以稍后通过向 C++ 程序发送消息来进行回复,反之亦然。

  4. 理想的解决方案将具有 a) 非常低的延迟,b) 没有安全麻烦(用户不必授权打开端口等),c) 与平台无关。

我的第一个想法是使用sockets-- 每个程序都充当另一个程序的服务器。套接字比其他形式的 IPC 具有更多的开销,并且如果我让系统自动分配端口号,我不知道服务器将如何通知客户端端口号。我也考虑过命名管道,但不同平台不支持(至少不一致)。JNI看起来像是一个选项,但它可以跨越流程边界吗?

有什么建议么?

谢谢!

后续问题

  1. 如果我使用套接字,我需要打开two套接字允许如上所述的异步通信?

我建议你使用TCP 套接字.

根据我的经验,与应用程序的其他任务工作负载相比,TCP 套接字的实际开销非常非常低,至少是我用来开发的应用程序。我的意思是,有时即使套接字的延迟是其他 IPC 机制延迟的两倍,在整个工作流程中它们的影响也很小。它省去了在 Java 应用程序和 C++ 应用程序之间进行 IPC 的麻烦,这最终会要求您使用使用 JNI 的特定 Java 库,以及 JNI 和库本身的开销。

我实际上在我的 Java 应用程序中测量到,垃圾收集器的影响远比由“loopback“ TCP 套接字。

此外,TCP 套接字比传统 IPC 更具可扩展性(并且可移植!)。如果将来您必须在不同的计算机上运行客户端和服务器怎么办?在“TCP 套接字”场景中,您必须进行 5 分钟的修改,在“传统 IPC”场景中,您必须重写整个 IPC 内容。

但是,您的应用程序的一般工作流程是什么?

即使不需要确认,我建议使用 TCP(而不是 UDP)来避免未排序的传递(这会导致重新排列您收到的内容时的痛苦 - 有些消息是 100KB,而这不适合 UDP 数据包)。

回答你的上一个问题,为了让服务器通知客户端有关端口的信息,你可以让服务器使用特定的“端口”命令行参数启动客户端,或者让服务器在 /tmp 下保存一个小文件(或者另一个临时目录),里面写着端口号。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 和 Java 之间的低延迟 IPC 的相关文章

  • 指针问题(仅在发布版本中)

    不确定如何描述这一点 但我在这里 由于某种原因 当尝试创建我的游戏的发布版本进行测试时 它的敌人创建方面不起作用 Enemies e level1 3 e level1 0 Enemies sdlLib 500 2 3 128 250 32
  • C - 找到极限之间的所有友好数字

    首先是定义 一对友好的数字由两个不同的整数组成 其中 第一个整数的除数之和等于第二个整数 并且 第二个整数的除数之和等于第一个整数 完美数是等于其自身约数之和的数 我想做的是制作一个程序 询问用户一个下限和一个上限 然后向他 她提供这两个限
  • 将目录压缩为单个文件的方法有哪些

    不知道怎么问 所以我会解释一下情况 我需要存储一些压缩文件 最初的想法是创建一个文件夹并存储所需数量的压缩文件 并创建一个文件来保存有关每个压缩文件的数据 但是 我不被允许创建许多文件 只能有一个 我决定创建一个压缩文件 其中包含有关进一步
  • Qt moc 在头文件中实现?

    是否可以告诉 Qt MOC 我想声明该类并在单个文件中实现它 而不是将它们拆分为 h 和 cpp 文件 如果要在 cpp 文件中声明并实现 QObject 子类 则必须手动包含 moc 文件 例如 文件main cpp struct Sub
  • 了解 Spark 中的 DAG

    问题是我有以下 DAG 我认为当需要洗牌时 火花将工作划分为不同的阶段 考虑阶段 0 和阶段 1 有些操作不需要洗牌 那么为什么 Spark 将它们分成不同的阶段呢 我认为跨分区的实际数据移动应该发生在第 2 阶段 因为这里我们需要cogr
  • 如何初始化静态地图?

    你会如何初始化静态Map在Java中 方法一 静态初始化方法二 实例初始化 匿名子类 或者 还有其他方法吗 各自的优点和缺点是什么 这是说明这两种方法的示例 import java util HashMap import java util
  • 如何衡量两个字符串之间的相似度? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 给定两个字符串text1 and text2 public SOMEUSABLERETURNTYPE Compare string t
  • for循环中计数器变量的范围是多少?

    我在 Visual Studio 2008 中收到以下错误 Error 1 A local variable named i cannot be declared in this scope because it would give a
  • 如何将单个 char 转换为 int [重复]

    这个问题在这里已经有答案了 我有一串数字 例如 123456789 我需要提取它们中的每一个以在计算中使用它们 我当然可以通过索引访问每个字符 但是如何将其转换为 int 我研究过 atoi 但它需要一个字符串作为参数 因此 我必须将每个字
  • 如何在 VBA 中声明接受 XlfOper (LPXLOPER) 类型参数的函数?

    我在之前的回答里发现了问题 https stackoverflow com q 19325258 159684一种无需注册即可调用 C xll 中定义的函数的方法 我之前使用 XLW 提供的注册基础结构 并且使用 XlfOper 类型在 V
  • 将 xml 反序列化为类,list<> 出现问题

    我有以下 XML
  • 春季 CORS。在允许的来源中添加模式

    查看CORS的弹簧指南 以下代码启用所有允许的来源 public class MyWebMVCConfigurer extends WebMvcConfigurerAdapter Override public void addCorsMa
  • 如何使我的表单标题栏遵循 Windows 深色主题?

    我已经下载了Windows 10更新包括黑暗主题 文件资源管理器等都是深色主题 但是当我创建自己的 C 表单应用程序时 标题栏是亮白色的 如何使我自己的桌面应用程序遵循我在 Windows 中设置的深色主题 你需要调用DwmSetWindo
  • 为什么应该首选 Java 类的接口?

    PMD https pmd github io 将举报以下违规行为 ArrayList list new ArrayList 违规行为是 避免使用 ArrayList 等实现类型 而是使用接口 以下行将纠正违规行为 List list ne
  • 32 位到 64 位内联汇编移植

    我有一段 C 代码 在 GNU Linux 环境下用 g 编译 它加载一个函数指针 它如何执行并不重要 使用一些内联汇编将一些参数推送到堆栈上 然后调用该函数 代码如下 unsigned long stack 1 23 33 43 save
  • Process.Start 阻塞

    我正在调用 Process Start 但它会阻止当前线程 pInfo new ProcessStartInfo C Windows notepad exe Start process mProcess new Process mProce
  • const、span 和迭代器的问题

    我尝试编写一个按索引迭代容器的迭代器 AIt and a const It两者都允许更改容器的内容 AConst it and a const Const it两者都禁止更改容器的内容 之后 我尝试写一个span
  • x86 上未对齐的指针

    有人可以提供一个示例 将指针从一种类型转换为另一种类型由于未对齐而失败吗 在评论中这个答案 https stackoverflow com questions 544928 reading integer size bytes from a
  • Java、Spring、Hibernate找不到org.springframework.orm.hibernate3.LocalSessionFactoryBean

    我正在尝试制作 spring hibernate ant 项目 目前我收到此错误 HTTP Status 500 type Exception report message description The server encountere
  • 限制C#中的并行线程数

    我正在编写一个 C 程序来生成并通过 FTP 上传 50 万个文件 我想并行处理4个文件 因为机器有4个核心 文件生成需要更长的时间 是否可以将以下 Powershell 示例转换为 C 或者是否有更好的框架 例如 C 中的 Actor 框

随机推荐

  • 为什么包含 -fPIC 来编译静态库会导致运行时出现分段错误?

    我正在使用 g 编译 C 静态库并使用 fPIC 选项 我必须使用 fPIC 选项 因为最终该库将与其他静态库链接以形成动态库 当我在本地测试静态库时 如果不包含 fPIC 选项 它可以完全正常工作 但是 一旦我使用 fPIC 编译库 我就
  • WPF 中的作物变换?

    WPF 允许使用以下子类Transform http msdn microsoft com en us library system windows media transform aspx缩放 ScaleTransform http ms
  • ng-include 编译为注释

    我有一个角度应用程序 想要在模板中添加其他内容作为 div ng include 似乎是一个完美的选择 在main html中 div div src div div 在 module html 中 div class module h1
  • 在 Visual Studio 2013 中找不到“置于前面”和“发送到后面”选项

    我是 Visual Studio 2013 的新手 我使用带有两个面板的单一表单 其中第二个面板堆叠在第一个面板的顶部 我无法切换到第一个面板 我搜索过谷歌 也在这里寻找答案 他们都建议使用 置于前面 和 发送到后面 选项 但我在任何地方都
  • 如何获取React Native GoogleSignIn的accessToken?

    我无法获取 accessToken 我需要在后端 api 中使用它 当我尝试这个时 googleLogin gt GoogleSignin signIn then data gt console log TEST JSON stringif
  • 如何使用 PHP 异常来定义重定向?

    我一直被教导在编程中使用异常可以从引发错误的对象中抽象出错误处理 看着PHP手册 http www php net manual en reserved exceptions php 看来PHP有一个Exception类和一个ErrorEx
  • 用字符串填充表格视图

    我已阅读 API 和示例 但无法理解如何填充表格视图 假设我有一个两列字符串数组 String 其中包含 名称 值 对 我现在只想创建一个表格视图 它在两列中显示数据 在第一列中显示原始数组中所有行的名称 在第二列中显示值 我尝试了什么 什
  • MySQL远程连接【不正常】

    我无法从外部访问 mysql 我认为这是 mysql 或防火墙的东西或 mysql 中的某些特权 我已经尝试执行互联网上的步骤 我将逐步介绍该过程 以举例说明我正在做的事情 并为其他遇到同样问题的人提供教程 我在用着 ubuntu serv
  • pyinstaller可执行文件的差异更新(修改嵌入的PYZ-00.pyz)

    我计划创建一个巨大的可执行目录并将其安装在某些设备上 想象一下 后来我发现我的 python 模块中有一个错误 有没有办法只传输 复制修改后的字节码 并用新的字节码替换原始字节码 我想这样做的原因是 在我的上下文中 带宽非常昂贵 我想远程修
  • 大型项目没有 PHP?为什么不? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我读过一些帖子 人们指出 没有建议 没有讨论 没有提供 PHP 不应该用于大型项目 作为一名主要的 PHP 开发人员 我问两个问题 大型项目 的
  • 带有 pod 标签的 Prometheus kubelet 指标 [关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 我想弄清楚如何使用 prometheus stack 将 pod 标签从 kubelet 指标获取到指标标签 在我们的环境中 我们需要
  • 在 C 中调用函数时的序列点和未定义/未指定的行为

    我试图确定我对 C 中序列点的理解 只是想检查一些东西 目前 我认为 1 是未定义的 而 2 只是未指定的 因为在 2 中 在评估参数后存在序列点g and h 所以我们不修改i序列点之间两次 但是参数的求值顺序f仍然未指定 我的理解正确吗
  • 为什么我的 Azure 存储帐户上的队列域丢失?

    我已使用以下设置在 Azure 上成功创建存储帐户 部署 资源管理器 类型 通用 标准 复制 ZRS 在 Azure 门户上 我可以看到 Blob 服务 如果单击它 我可以在 blob 域下创建 blob 容器 https 帐户名称 blo
  • Javascript字典性能问题

    现在我有以下 javascript 字典 var a a SVG343 1942 a UAL534 2153 右边的数字代表时间 键是唯一的 ID 我想让 id 成为键 因为它们是唯一的 我的问题是给出一个时间找到对应的id 我要如何做到这
  • 将外部域名连接到AWS S3网站

    我想在 Amazon S3 上托管一个静态网站 创建了相关的存储桶 测试它们正常 现在我已经在 EuroDNS 注册了一个域名 www gopropel io 我找不到如何将其连接到我的 AWS S3 存储桶 我需要创建路由 53 托管区域
  • Flutter Firebase Messaging 无法创建服务 io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService

    我正在尝试在 Flutter 应用程序中使用 Firebase Messaging 我遵循包装上的所有说明 在我的 pubspec yaml 中 我有这些包 dependencies flutter sdk flutter firebase
  • 当元素的父元素溢出时,使元素宽度拉伸以适合其子元素:auto;

    在这个简化的示例中 我有一个书柜 书架上放着书籍 书架是具有定义宽度的最外面的元素 书架上的书应该从左到右排列 没有包装 书架应该拉伸其宽度以显示书架上的所有书籍 所有书架的宽度必须相同 即最宽书架的宽度 My HTML div class
  • 保护 Raven 数据库的安全

    我正在尝试将 RavenDB 的访问权限限制为只有一名用户 更改设置以保护数据库后 我仍然可以访问 RavenDB 管理工作室 但我不确定为什么 我将 RavenDB 作为 Windows 服务运行 并且使用构建 573 这是我的 Rave
  • 如何向 Skype 聊天室发出 Jenkins 构建状态警报?

    我们公司使用 Skype 进行通信 我希望能够在 Jenkins 构建失败 以及恢复时 时向 Skype 聊天室发送警报 我怎样才能做到这一点 我已经使用了Skype 公共 API http developer skype com acce
  • C++ 和 Java 之间的低延迟 IPC

    对于以下情况 实现 C Java IPC 的最佳方法是什么 最近有人问类似的问题 https stackoverflow com questions 5900887 ipc between java and c applications 但