6

プログラムを作成して2台のマシンで実行し、イーサネットフレームで1台のマシンから別のマシンにデータを送信したいと思います。

通常、アプリケーションデータはOSIモデルのレイヤー7にありますが、カーネル制限やAPI制限のようなものがあり、宛先MACアドレスを指定して、そのMACにデータを送信するプログラムを作成できなくなります。イーサネットペイロード?次に、着信フレームをリッスンし、指定された送信元MACアドレスからフレームを取得して、フレームからデータのペイロードを抽出するプログラムを作成しますか?

(したがって、IPヘッダーやTCP / UDPヘッダーのような他のオーバーヘッドは必要ありません。レイヤー2よりも高くしたくありません)。

これはC++で実行できますか、それともすべての通信をIP層で実行する必要がありますか?また、これはUbuntuで実行できますか?ポインティングや例を提供するための余分な愛!:D

私の問題は明らかに私がc++でのネットワークプログラミングに不慣れであり、私が知る限り、ネットワークを介して通信したい場合はsocket()、IP層で機能する呼び出しなどを使用する必要があるので、c++を書くことができますOSIレイヤー2で動作するプログラム。このためのAPIはありますか?Linuxカーネルはこれを許可しますか?

4

2 に答える 2

8

すでにソケットについて言及したように、おそらくrawソケットを使用したいと思うでしょう。たぶん、Cのサンプルコードを含むこのページはいくつかの助けになります。


イーサネットのみを使用し、それでも有用なプログラムのアイデアを探している場合:

WakeonLANを元の形式で使用するのは非常に簡単です。ただし、現在のほとんどの実装は実際にUDPパケットを送信することに注意してください(受信者がパケットヘッダーなどを解析せず、パケットのペイロード内の文字列のみを解析することを利用しています)。


また、rawソケットの使用は通常、特権ユーザーに制限されています。あなたはどちらかをする必要があるかもしれません

  • プログラムをrootとして呼び出します
  • または、rootとsetuidビットで所有するように設定します
  • またはを使用してrawソケットを作成する機能を設定しますsetcap CAP_NET_RAW+ep /path/to/your/program-file

最後のオプションは、他の2つよりもきめ細かい特権(rawソケットのみ、ファイルシステム全体への書き込みアクセスなどではない)を提供します。ただし、カーネル2.6.24以降(Ubuntu 8.04に付属)から「のみ」サポートされているため、まだあまり知られていません。

于 2012-04-12T23:38:17.303 に答える
5

はい、実際、Linuxには、レイヤー2パケットの処理を容易にする非常に優れた機能があります。TAPデバイスを使用できます。これにより、ユーザースペースプログラムがカーネルを介してイーサネットトラフィックを読み書きできるようになります。

http://www.kernel.org/pub/linux/kernel/people/marcelo/linux-2.4/Documentation/networking/tuntap.txt

http://en.wikipedia.org/wiki/TUN/TAP

于 2012-04-12T21:37:27.660 に答える