2012-04-12 12 views
5

プログラムを作成して2台のマシンで実行し、イーサネットフレーム内のあるマシンから別のマシンにデータを送信したいとします。イーサネットベースのネットワークプログラムをC++で書くことはできますか?

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

(私はIPやTCP/UDPヘッダーのような他のオーバヘッドは望んでいないので、レイヤー2よりも上に行きたくはありません)。

これはC++で行うことができますか、またはすべての通信がIPレイヤーで行われる必要がありますか?これはUbuntuで行うことができますか?例を指し示す、または提供するための余分な愛! :D

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

+1

C++はプログラミング言語であり、IPレイヤは抽象的な概念です。あなたのテキストの中の他のものをどのように置き換えるかは、私が超えています。 – littleadv

+5

@ littadadv:なぜですか?彼は何を尋ねるのか正確には分かりません( "C++でどのようにrawソケットを使うのですか?")が、意味を完全に理解することができます。 – cha0site

+3

理論的には、C++が後で2になるのに問題はないはずですが、OSのサポートによって制限されるかもしれません。 UDPにはほとんどオーバーヘッドがありませんが、それを使用してください。 –

答えて

7

すでにソケットを述べたように、おそらくあなただけの生のソケットを使用したいと思います。多分このpage with C example codeは助けになるでしょう。場合


あなたはまだ有用である一方で、イーサネットを使用した唯一のプログラムのためのアイデアを探しています:それで

Wake on LANは元の形が非常に簡単であるのです。しかし、現在の実装では、実際にUDPパケットを送信することに注意してください(受信者はパケットヘッダーなどは解析せず、パケットのペイロードの文字列のみを解析する)。


また、通常、ローソケットの使用は特権ユーザーに制限されています。あなたはどちらか

  • がルートとして
  • を、あなたのプログラムを呼び出すか、それはrootが所有し、setuidビットが
  • を設定したり、setcap CAP_NET_RAW+ep /path/to/your/program-file

最後を使用して、生のソケットを作成するための機能を設定する必要があるかもしれませんオプションは他の2つよりも細かい粒度の特権(rawソケットだけで、ファイルシステム全体への書き込みアクセスなどはありません)を提供します。しかし、カーネル2.6.24(これはUbuntu 8.04に付属しています)から "唯一"サポートされているため、あまり広く知られていません。

+0

コードサンプルへの入力とリンクをありがとう。これは私のために物事を多くクリアしました:) – jwbensley

+0

喜んで私は助けることができます:) – zpea

関連する問題