• 締切済み

データを取得して、同じ種類毎に区分する良いやり方はありませんか。

こんばんは。質問させて頂きます。 C言語で、pcap.hを使った通信フローの区分けをしたいと考えています。区分けの条件は、 1.送受信アドレスが同じであること(送受が逆でも同一) 2.送受信ポートが同じであること(送受が逆でも同一) の2つで、これらを全て満たしているパケットは同一の通信フローと見なし、その通信フローの数を数えるプログラムを目指しています。 パケットをキャプチャするところまではいったのですが、パケットデータを区分けするアルゴリズムが思い浮かばず困っています。どなたかお力添えを頂けないでしょうか。どうぞよろしくお願いします。

みんなの回答

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

アドレス・ポート・パケット数をメンバーにもつ構造体を作成して、この構造体の配列を使って区分けをする。 配列内にアドレス・ポートが一致する要素がある場合はその要素のパケット数を加算、ない場合はそのアドレス・ポートを新しい配列要素にする。 考え方はだいたいこんな感じでしょう。

arlstumia
質問者

お礼

お礼が遅れました事をお詫びします。 ご回答有難う御座いました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • for文が機能しません。どなたか原因を指摘して頂けますか。

    こんにちは。質問させて頂きます。 pcap.hで、「リスト構造に格納された送受ID・ポート」と、「キャプチャされたパケットの送受ID・ポート」を順に比較していって、同じであれば同一の通信フローとみなす、といったプログラムを作っています。 しかし、何故かfor文自体が機能せず、for文の中のprintf文が全く表示されないところをみると、for文をスルーしてしまっているようです。for文の中身の記述がおかしいのか、条件記述がおかしいのかのどちらかだとは思うのですが特定できません。 皆さんのお力をお貸し頂けないでしょうか。 以下がプログラムの一部です。 //ID・ポートを含んだリスト構造体作成 struct list { struct in_addr src, dst; u_short sport; u_short dport; struct list *next; }; //キャプチャされるパケットのID・ポート情報を記録する構造体 struct new_capture { struct in_addr new_src, new_dst; u_short new_sport; u_short new_dport; }; ループバック関数(){ //キャプチャされたパケット情報を構造体に写す struct new_capture nc; nc.new_dport = tcp->th_dport; nc.new_sport = tcp->th_sport; nc.new_src = ip->ip_src; nc.new_dst = ip->ip_dst; //リスト構造体の先頭と、ループさせるためのポインタを宣言 struct list flow_head; struct list *looplist; //問題のfor文 //looplistを利用して、キャプチャされたパケット情報と //リスト構造体に格納された情報とを比較する //同一ならばそれでbreak、全ての構造体と相違ならば //構造体の末端に新たに追加する for (looplist = &flow_head; looplist ; looplist = looplist->next) { if (inet_ntoa(looplist->src) == inet_ntoa(nc.new_src)) { if (inet_ntoa(looplist->dst) == inet_ntoa(nc.new_dst)) { if (looplist->sport == nc.new_sport) { if (looplist->dport == nc.new_dport) { printf ("送受アド、送受ポート同一"); break; } } } } else if (looplist->sport == nc.new_dport) { if (looplist->dport == nc.new_sport) { if (inet_ntoa(looplist->dst) == inet_ntoa(nc.new_src)) { if (inet_ntoa(looplist->src) == inet_ntoa(nc.new_dst)) { printf ("送受アド、送受ポート同一逆順"); break; } } } } else { printf ("同一ではない"); } } //通信フロー数を1増やし、リスト構造体にIDとポートを追加する if (looplist == NULL) { flow_counts++; printf ("通信フロー追加:%d\n", flow_counts); looplist = (struct list *) malloc (sizeof (struct list));   looplist->dport = nc.new_dport; looplist->sport = nc.new_sport; looplist->src = nc.new_src; looplist->dst = nc.new_dst; } free(looplist); return; } 上のlooplistにアドレスを代入しているはずなのに、ずぅ~っとNULLになっているらしく、for文が終わった後のif文が常に機能するようになってしまっています。 for文が機能しないのは何故なのか。 looplistがずっとNULLなのは何故なのか。 この二つが解決出来ればなんとか出来ると思うのですが力不足でそれに及びません。何か気が付かれた事等ありましたらご教授頂けないでしょうか。どうぞよろしくお願いします。

  • COMポートに流れるデータを監視する方法について

    ComPortキャプチャのような COMポート(シリアルポート)を経由してやりとりされる送受信データをキャプチャするツールを作成しようとしております。 言語は、C言語でBCCdeveloperの環境で 作成しております。 WIN32APIの下記の関数でなんとか 送受信できるツールは、できました。 CreateFile GetCommState ClearCommError WriteFile ReadFile ひとつのツールでポートをオープンすると 別のソフトからはオープンできないようなので、 なんとかして、他のソフトが送受信しているデータを キャプチャできる方法ありましたらご教授願います。

  • 通信フローの数をsyn,ack,rst等のフラグで区別できるツールご存知ないですか。

    こんにちは。 RubyもPHPもPerlも使わず、C言語でパケットデータを測量したいと考えています。目的はsynフラグが立っているパケットデータを含む通信フローの数のみの取得です。ackやrstの立っているパケットデータは数えないで、synフラグのみの通信フローを取得したいと考えています。 このような通信フローの数を数えてくれるツールをご存知でしたら教えて頂けないでしょうか。 環境はCentosです。どうぞよろしくお願いします。

  • Juniper SSG5 パケットログについて

    お世話になります。 Juniper SSG5 の F/Wパケットポリシーにて透過する通信のみ設定しています。 この状態で、通信を許可していない破棄されたパケットのログを見る方法はありますでしょうか。 又は下記の設定等をしなければ破棄されたログは見れないものでしょうか。 1.ポリシー定義の最終行にDENYポリシーを設定して通信ログをキャプチャする。 2.debugコマンドで通信ログをキャプチャする。(debug flow basic) 以上、宜しくお願いいたします。

  • ポートスキャンの特徴について

    「パケットモニタリングでポートスキャンを検知する」というプログラムを作っているのですが、ポートスキャンの特徴が良く分かりません。どなたかポートスキャンされている特徴などを教えていただけないでしょうか。 開発言語はC言語です。

  • 試験でのアルゴリズムの表現について

    現在進学を考えている情報系の大学院の入学試験の問題に、 「・・・のアルゴリズムを設計せよ。」 「・・・のアルゴリズムを設計し、プログラムを書け。」 などといった形式での出題があります。(解答は紙上だと思います。) このような出題文があったとき、どのような言語によってアルゴリズムを表現することが適切または一般的なのでしょうか? 候補としては ・言葉で書く ・既存のプログラミング言語で書く ・擬似言語やフローなどで書く などが考えられますが、どれも試験で書くには一般性が薄いように思われますが、いかがでしょうか。 要は、 ・「このような規約に従って」という注釈を入れなくても一般的に従われる規約があるのか ・そのような規約はどこで定義されているのか この二つが知りたいのです。 ぜひご教授よろしくお願いします。

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

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

  • 逆行列の高速解法

    C言語を用いて逆行列を計算するアルゴリズムのうち, 計算時間が短いプログラム例を教えていただけませんでしょうか?

  • パケットの受信速度の測定

    ただいまパケットの送受信速度を測定するプログラムを作成しようとしているのですが、どのような手法があるのでしょうか?使用言語はC++です。 C++に関してはまだ始めたがかりの初心者なのですがよろしくお願いします。

  • 指定アプリのパケットキャプチャがしたい

    パケットキャプチャソフトには、Wireshark等のソフトがあるかと思いますが、 指定アプリケーションのパケットキャプチャを行うソフトはありますか? 「指定アプリケーション」が通信しているポートやプロトコルは分からない状態です。 ファイヤーウォールソフトなどで、「○○アプリが通信しようとしています」と言われるので、 技術的には可能かと思っています・・・。 OS Windows7 32bit