9

クロスプラットフォームのサポートが必要だったので、Java/JavaFX でプログラムを書きました。作業が進むにつれて、Java では不可能な低レベルの OS ネットワーキング操作を行う必要がありました。私は Runtime.exec() から始めて、JNA/JNI に移行しましたが、Java の OS 互換性を維持することは、ネイティブ アプリケーションへの移植よりも多くの作業になるのではないかと心配しています。

これを行う最善の方法は何ですか?

GTK+ が *nix と Windows でサポートされていることはわかっているので、それを UI に使用すると思います。OS ごとに異なるバージョンのアプリケーションを維持するのはどれほど難しいでしょうか? クロス プラットフォームである必要があるが、低レベルの OS アクセスが可能なものを作成するための出発点をお勧めできますか? 私は Java の経験が豊富です (そして、OpenGL を使用した C++ のかなりの量) がありましたが、これまで Linux 以外のことを気にする必要はありませんでした。

または、生のパケットを作成し、ICMP ping を送信し、Java から他の低レベルのネットワーク タスクを実行する良い方法はありますか?

4

4 に答える 4

3

ネイティブ コードの要件はネットワーク パケットに関連しているように思われるため、JPCAPを参照してください。注: JPCAP には 2 つのフォークがあります。SourceForge でホストされているもの (パッケージ)net.sourceforge.jpcap.netは送信をサポートしていません。ほとんどの「低レベル」のネットワーク操作 (無差別モードでのリッスン、非 IP データグラムの送信、ICMP などを含む) にはこれで十分だと思います。jpcaphttp://netresearch.ics.uci.edu/kfujii

于 2013-03-15T04:38:18.923 に答える
2

あなたの質問はかなり一般的なので、ここにいくつかのベストプラクティスをリストします. それに応じて質問を編集すれば、絞り込むことができます。

1-最も重要なのはコンパイラとビルド環境です。これを選択するのはおそらく簡単です.ClangGCCの両方がすべての主要なプラットフォームでサポートされています. ただし、ビルド環境は少しトリッキーです。単一の Makefile だけでは、すべてのプラットフォームに適しているわけではありません。代わりに、CMakeSConsなどを使用してください。これにより、ソースを管理し、すべてのシステムで適切なメイクファイルを簡単に生成できます。

2-すべてのプラットフォームで同じ GUI を構築したい場合があります。その場合、あなたが言及したようにQtまたはGTK +を使用できます。

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

于 2013-03-15T04:31:42.727 に答える
1

クロスプラットフォームの GUI には、おそらく Qt が最適です。Windows (または Mac) をターゲットにしたい場合、GTK+ は良い選択ではないと思います。ただし、これは変更された可能性があります。最後にチェックしてからしばらく経ちました。この投稿も参照してください。

Boost と Poco はどちらも優れたクロスプラットフォーム C++ ライブラリです。どちらもネットワーク ライブラリ (boost asio と Poco Net) を提供します。

ICMP ping リクエストの送信は、boostPocoの両方でサポートされています。

ただし、これらのライブラリで独自のイーサネット フレームと IP パケットを構築できるかどうかはわかりません。

于 2013-03-15T22:40:52.787 に答える
0

それはよりデザイン的なものであり、

  1. 可能な限りクロスプラットフォーム ライブラリを使用するようにしてください (例: ブースト)
  2. プラットフォーム固有のコードを記述し、その上に優れた抽象化レイヤーを記述します。

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

  • Windows/Signalingは、Windows プラットフォーム固有のシグナリング コードです。
  • Linux/Signalingは Linux プラットフォーム固有のシグナリング コードです。
  • シグナリングはプラットフォームの抽象化レイヤーであり、コンパイル時にプラットフォームを決定できます
于 2013-03-15T07:33:52.050 に答える