9

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

做这个的最好方式是什么?

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

或者,有没有一种好方法可以从 Java 构建原始数据包、发送 ICMP ping 以及执行其他低级网络任务?

4

4 回答 4

3

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

于 2013-03-15T04:38:18.923 回答
2

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

1-最重要的是编译器和构建环境。这可能很容易选择,所有主要平台都支持ClangGCC 。但是,构建环境有点棘手。仅仅一个 Makefile 并不适用于所有平台。相反,请选择CMakeSCons 之类的东西。这将帮助您更轻松地管理源代码并在所有系统上生成适当的 makefile。

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

3-文件 I/O。如果你有很多文件 I/O,你可能想看看Boost File System

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

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

如果您想深入了解跨平台 C++ 编程,这里有一本好书:C++ 中的跨平台开发:构建 Mac OS X、Linux 和 Windows 应用程序

于 2013-03-15T04:31:42.727 回答
1

Qt 可能是跨平台 GUI 的最佳选择。如果您想针对 Windows(或 Mac),我不认为 GTK+ 是一个很好的选择。然而,也许这已经改变了。自从我上次检查以来已经有一段时间了。另见这篇文章

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

boostPoco都支持发送 ICMP ping 请求。

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

于 2013-03-15T22:40:52.787 回答
0

它更多的是设计的东西,

  1. 尽可能使用跨平台库(例如:boost)
  2. 编写特定于平台的代码并在其之上编写良好的抽象层。

例如:Windows/Signaling、Linux/Signaling、Signaling Here、

  • Windows/Signaling是 Windows 平台特定的信令代码
  • Linux/Signaling是 Linux 平台特定的信令代码
  • 信令是平台抽象层,编译时我们可以决定平台
于 2013-03-15T07:33:52.050 回答