C / C ++中的跨平台兼容性(从Java移植项目)?

时间:2013-03-15 03:40:15

标签: java c++ c networking cross-platform

我在Java / JavaFX中编写了一个程序,因为我需要跨平台支持。随着我的进步,我需要做一些Java中无法实现的低级操作系统网络操作。我从Runtime.exec()开始,转移到JNA / JNI,现在我担心维护操作系统与Java的兼容性最终会比仅移植到本机应用程序更多。

这样做的最佳方式是什么?

我知道GTK +受* nix和windows支持,所以我想我会将它用于我的UI。为每个操作系统维护不同版本的应用程序有多难?您是否可以建议一个起点来编写需要跨平台但仍具有低级操作系统访问权限的东西?我有很多Java经验(以及使用OpenGL的大量C ++)但我以前从未关心过任何事情。

或者,是否有一种很好的方法来构建原始数据包,发送ICMP ping以及从Java执行其他低级别网络任务?

4 个答案:

答案 0 :(得分:3)

由于您对本机代码的要求似乎与网络数据包有关,因此您可以查看JPCAP。注意:有两个JPCAP分支:一个托管在SourceForge(包net.sourceforge.jpcap.net)上,一个不支持发送,另一个我在这里链接(包jpcap,最初托管在{ {1}})。我认为这对于大多数“低级”网络操作来说已经足够了(包括监听混杂模式,发送非IP数据报,ICMP等)。

答案 1 :(得分:2)

你的问题非常笼统,所以我会在这里列出一些最佳实践。如果你相应地编辑你的问题,我可以缩小范围。

1 - 导入最多的是编译器和构建环境。这可能是微不足道的选择,所有主要平台都支持 Clang GCC 。但是,构建环境有点棘手。只需一个Makefile就不适合所有平台。相反,请选择CMakeSCons之类的内容。这将有助于您管理源代码并在所有系统上生成适当的makefile。

2 - 您可能希望在所有平台上构建相同的GUI。在这种情况下,您可以按照提及的那样使用QtGTK+

3 - 文件I / O.如果您有大量文件I / O,您可能需要查看Boost File System

4 - 对于您使用的所有其他库,请确保所有平台都支持它们。一般来说,我建议使用历史上维护良好的库,例如 Boost

5 - 最后,使用PIMPL Idiom隐藏特定于平台的代码。

如果你想深入学习跨平台C ++编程,这里有一本好书:Cross-Platform Development in C++: Building Mac OS X, Linux, and Windows Applications

答案 2 :(得分:1)

Qt可能是跨平台GUI的最佳选择。如果您想要定位Windows(或Mac),我认为GTK +不是一个很好的选择。但是,也许这已经改变了。我上次检查已经有一段时间了。另请参阅this post

Boost和Poco都是优秀的跨平台C ++库。他们还提供网络库(boost asio和Poco Net)。

boostPoco支持发送ICMP ping请求。

我不确定这些库是否允许您构建自己的以太网帧和IP数据包。

答案 3 :(得分:0)

更多的是设计用品,

  1. 尝试在任何可能的地方使用跨平台库(例如:boost)
  2. 编写特定于平台的代码并在其上面编写好的抽象层。
  3. 例如:Windows /信令,Linux /信令,信令       在这里,

    • Windows / Signaling 是Windows平台特定的信令代码
    • Linux / Signaling 是Linux平台特定的信令代码
    • Signaling 是平台抽象层,编译时我们可以决定平台