• ベストアンサー

Linuxでパケットのデータ部分を合成するプログラムを教えてください。

LinuxでC言語を使用しているのですが、パケットのデータ部分を合成するプログラムのを教えてください。 具体的な例として、 端末A,B,Cがあり、AはBを中継して、CにUDPパケットを2個送信します。 中継端末のBは2個のUDPパケットをバッファリングした後、データ部分のみを1個のパケットにまとめてCに送信します。(ヘッダ部分はAが送信したときと同じにしたい) Cは2個分のデータが入ったUDPパケットを1個受信する。 この例の端末Bでのプログラムを書くとするとどのようにすればいいのでしょうか?? よろしくお願いしますm(_ _)m

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

「パケットのpayloadを合成する」という機能が必要なだけでしたら、Click Modular Router http://www.read.cs.ucla.edu/click/ を使用してみるのはいかがでしょうか。 複数の要素をかちゃかちゃと組み合わせるだけで、色々なルーティングを可能にするシステムです。 このシステムには、ARPだけ選ぶもの、送信優先度を低くするもの、ひとつのパケットを二つに増殖させて二つの場所に送るものなどといった小さな機能要素があります。こういった要素を順番に並べていくことで、「ARPの送信優先度を低くして、二箇所に送る(他は変化なし)」などの複雑なルーティングを、簡単に作ることが出来ます。 二つのペイロードの合成も多分出来たんじゃないかと思います。なかったとしても、新しいモジュールを付け加えることはそんなに難しいことではありません。(C++でClickモジュールを書くことになります) 要素一覧 : http://www.read.cs.ucla.edu/click/elements 手動で作成するとなると、いわゆるRaw Socketを作ることになりますが・・・、まともに使えるものを作るつもりでしたら、かなり面倒が多いですよね。

d_x-x_b
質問者

お礼

ありがとうございます!! そんなシステムがあるのですか!? これはなんらかのシミュレーションではなく、パソコンにインストールすれば実際のルータとして使用できるということですかね??

その他の回答 (2)

  • Yanch
  • ベストアンサー率50% (114/225)
回答No.2

Linux で UDP 通信をするなら、「socket.h」を使えばよいでしょう。 いくつか参考になりそうなサイトを挙げておきます。 Manpage of SOCKET http://www.linux.or.jp/JM/html/LDP_man-pages/man2/socket.2.html Geekなぺーじ [インターネット技術メモ] http://www.geekpage.jp/ Winsock Programmer's FAQ http://www.kt.rim.or.jp/~ksk/wskfaq-ja/index.html

d_x-x_b
質問者

お礼

返信ありがとうございます。 説明が不足していたのですが、中継点Bと言ったのですが、実際はルータのことで、Aから見ると、Bには中継しているとは気づかないで、Cに届くというイメージです。 基本的なUDP通信のプログラムは私もGeekなページを参照しています(^-^;)

回答No.1

・ルータを作っているのですか、それともオーバーレイネットワークを作っているのですか? ・ネットワーク的にどのような構成になっていますか? ・「Bを中継する」際のIPヘッダはどのようになっているのですか?

d_x-x_b
質問者

お礼

素早い返信ありがとうございます。 >・ルータを作っているのですか、それともオーバーレイネットワークを作っているのですか? 中継する端末表記しましたが、実際はルータのことです。PCでルータを作成し、その中でパケットを合成するようなプログラムが欲しいです。 >・ネットワーク的にどのような構成になっていますか? A→(無線接続)→ルータ(Bのこと)→(有線接続)→C という風に接続されています。 >・「Bを中継する」際のIPヘッダはどのようになっているのですか? Bはルータなので、AのIPヘッダには、Cのアドレスとポート番号の情報のみです。 最初からルータを使用するをいったほうがよかったですね(^-^;) よろしくお願いします。

関連するQ&A

  • 任意のTCPパケットを送信するプログラムの実装

    TCP 通信確立後、任意のパケットを送信するプログラムを 作成しようと考えてます。ここでの任意のパケットとは、 下記のように TCP ヘッダの値を色々と設定したパケットを 指します。 ・TCP ヘッダのすべての制御フラグを有効にしたパケット ・TCP ヘッダのチェックサムを意図的に間違えたパケット 任意のデータを送信するだけであれば、通常の socket プログラムで実装できると思うのですが、TCP ヘッダを 色々と設定するプログラムとなると、どんな実装になるの でしょうか。C だと SOCK_RAW で socket 通信するよう、 実装するのでしょうか。 実装は C、perl を考えてます。

  • socket通信でのフィルタリング

    linux環境にてC言語でUDPソケットのプログラムを作成しています。 Aの端末からUDPで受信してパケットヘッダの表示及び、宛先アドレスや宛先ポート番号 を書き換えてBの端末にUDPで送信します。 そこで下記の関数を使用して受信しているのですが、パケットキャプチャのように なんでも受信してしまいます。 socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)) これを特定のポート番号だけ受信(フィルタ)するにはどのようにすれば良いのでしょうか?

  • テキストデータを合成するプログラム

    テキストデータの合成 私業務で必要なプログラムなどを片手間に作っています。 超簡単なマクロなどを組めるスキルのレベルです。 テキストデータの合成を行っています。 エディタでコピペすれば済むといえば済むのですが、 実際はデータの数が多く手作業ではミスなども起きやすいのでできればプログラム化したいと考えています。 やりたいことは・・・ 【元データ】 下のような3つのテキストファイルがあります a.txt 1234 abcd ABCD b.txt 5678 efgh EFGH c.txt 9012 ijkl IJKL これらを行ごとに合成して 【結果】 d.txt 123456789012 abcdefghijkl ABCDEFGHIJKL のようなファイルを作成します。 VBScriptかExcelのVBAで簡単にできないかなと思い、 取り組んだのですがなかなか筋道が立ちません。 アドバイスよろしくお願いします。

  • 秋月電子H8/3069Fのアセンブラでのプログラミング

    H8マイコンの3069Fでパケット送信するプログラムをアセンブラでプログラムしたいと考えてます。 プロトコルはまずはUDPを考えてます。 常に一定のデータ(1500バイト)を送信し続ける単純なプログラムを作ろうと思ってますが、 よく分かりませんでした。 C言語での作成は問題ありませんでした。 H8/OSを入れてudp_sockを使用するだけで済みました。 私なりのイメージとしては イーサヘッダ・IPヘッダ作成して データを送信バッファに書き込み、 後は無限ループで送信 という流れかと思うのですが、アセンブラに関する知識が、レジスタやアドレス等を含めて乏しいためいまいち書き方がわかりません。 ソース等を解説して頂ければ幸いです。 はてなでも質問させて頂いてますがなるべく多くの人に見て頂きたいのでこちらにも質問致しました。

  • UDPソケット通信におけるデータパケット

    UDPソケット通信をする際、受信データサイズとして考慮するべきサイズはアプリサイズとUDPヘッダー(8バイト)としてソケットオプションで受信バッファサイズを増加させたのですが、予想より受信できるパケット数が少ないです。 例) 1パケットのアプリサイズを10バイトしUDPヘッダーも考慮して実際1パケットあたり18バイトとして、最大5パケット受け取れるようにソケットオプションで アプリサイズ(10バイト)× UDPヘッダー(8バイト)×パケット数(5) 上記のように設定したのですが、実際5パケットも受信できませんでした。 上記のほかにIPヘッダーなども考慮しなければならないのでしょうか? 開発環境:solaris8 C言語

  • バッファ内の全てのパケットを好きな時に送信する方法

    無線LANのアクセスポイントのバッファについて質問があります。 通常はFIFOの仕組みによって、バッファ内に格納されたパケットAを端末へ送信したくても、パケットAがバッファの先頭になければ送信できない、と理解しています。 これを変更して、バッファ内の全てのパケットを自由なタイミングで送信できるようにすることは、現実問題として可能でしょうか? もしかすると非常におかしな質問かもしれませんが、ご回答いただければ幸いです。

  • データ通信にかかるパケットについて

    質問です。書籍やWEBで検索しても一向に分かりませんでした。 問題 MTUが1500バイトの通信回線システムにおいて、300KBのデータを送信することを考える。このとき下記の問いに答えなさい。ただし、1KB=1024Bとして計算しなさい。 (1)IPヘッダに20バイト、TCPヘッダに20バイト付加して送信する。すべてのデータを送るためには、何パケットに分割すればよいか。

  • UDPソケットを利用した送受信プログラムについて

    VC++.NETを用いて、UDPソケットの送受信プログラムを作成しようとしています。 3台のPCを用いて、A→B→Cと言うふうにAからCへBをはさんだ形でパケットを送りたいのですが、この場合B端末は送受信する必要があります。この場合、マルチスレッドプログラミングの知識が必要となってくるのでしょうか? よろしくお願いします。

  • パケットについて

    1パケットは128バイトということですが携帯もパケット通信をしています。その場合、いくつかのパケットをまとめて送信するのでしょうか。それともデータをすべて1パケットずつに分けて送信するのでしょうか。 また実際データ分として使えるのはパケットの半分以下だと聞いています。(ヘッダーの情報とデータの送信受信分にパケットを使うので)実際は何%位をデータ分として使えるのでしょうか。 詳しい方、教えていただけないでしょうか。よろしくお願いいたします。

  • LinuxのTCPIP

    LinuxのTCPIP実装についてご教示ください。 (C言語をベースとして記載します) 例えば、Kernelとしてはデータを受信していて、アプリケーションがrecv()等の関数で データを引き抜いていない状態でのSocketのCloseはRSTの送信になりFINにはならないと 理解しています。 このとき、send()にデータが残っていた場合でもRST送信するのだから、 送信バッファのデータは破棄され、送信されないというKernel側の実装になっている という理解で良いのでしょうか? #送信バッファのデータというのは、アプリケーション側がsend()しており、実際にパケットは #送信されていない状態(パケットキャプチャされていない状態)としてください 手元で試していると、受信バッファにデータが残っている、かつ送信バッファにも 残っている場合はRST送信され、送信バッファにあるデータも送信されない 受信バッファにデータが残っていない状態で送信後すぐにCloseしても送信が完了してから FINされるように見えています。 ずらずらと書いたのですが、要は受信バッファにデータがある・なしでClose()の挙動が変わり RST送信か、FIN送信になるというのはWeb上でKernelの実装によるものというのを 見つけましたが、その状態、かつ送信バッファにデータが残っている場合は、 RSTだと送信されず、FINだと送信されないという違いがあるので、 Kernel側の意図された実装なのかどうかを知りたいです。

専門家に質問してみよう