こんにちは。質問させて頂きます。
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なのは何故なのか。
この二つが解決出来ればなんとか出来ると思うのですが力不足でそれに及びません。何か気が付かれた事等ありましたらご教授頂けないでしょうか。どうぞよろしくお願いします。
No.3ベストアンサー
- 回答日時:
ざっと見た感じですが……
・flow_headがローカル変数なので関数呼び出しごとに初期化される
・if()の構成が間違っている(どのprintf()にも到達しないパターンがある)
・リストが構築されてない(malloc()で確保したメモリのアドレスをnextに入れる処理がない)
・追加で確保した要素のnextをNULLにしてない(このままリストに入れたら終端判定ができなくなる)
・関数脱出直前のfree(looplist)は不要というかここでやってはいけない(ヒットした要素、もしくは作ったばかりの新要素を壊してしまうことになる)
とりあえずこんなところで。
ループは一回は入ってると思いますが、ステップ実行で追ってみましたか?
この回答への補足
ご回答有難う御座います。
>・if()の構成が間違っている(どのprintf()にも到達しないパターンがある)
私の力不足でどんなパターンがあるのか予測がつきません。
お手数ですが、どんなパターンがあるのか教えて頂いてもよろしいでしょうか。if文の最後にelse文をつけているのでいずれかのprintf()には辿り着くのではと思えてしまうのですが・・。
No.2
- 回答日時:
>for (looplist = &flow_head; looplist ; looplist = looplist->next)
>{
ここのすぐ下でlooplistの値をprintf()で出力してみましたか?
いわゆる「printfデバッグ」の基本です。
No.1
- 回答日時:
>for (looplist = &flow_head; looplist ; looplist = looplist->next)
・・・ ループ条件 *looplist って書いたらどうなる?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- Visual Basic(VBA) FileSearch2007に変わる構文について 1 2022/12/16 16:57
- JavaScript 画像の表示位置 3 2022/12/23 08:25
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- JavaScript GoogleChart 階層ごとのブロックの長さを個別に設定したい 1 2022/07/06 14:27
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- UNIX・Linux iptablesを設定するとメール送信処理が遅くなる!? 6 2022/06/07 01:11
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
#if 1 #elseの意味について
-
構文エラー";"が型の前にあり...
-
for文の中にswitch文はいれられ...
-
配列を関数に渡す方法
-
計算結果がlong型以上になる場...
-
プログラミングで二番目に大き...
-
scanf関数を用いての加減乗除%...
-
getcの改行判定
-
C言語で電卓を作成する。
-
配列を使って魔方陣
-
C言語で勉強中(max,min)の出し方
-
C言語階乗の総和を求める
-
VHDLで、case文とwhen文のどち...
-
C言語でのトランプシャッフルに...
-
プログラム
-
while文について、c言語...
-
OpenCVを用いて任意の時間で静...
-
scanfが実行されません
-
C言語 数字以外を入力させない...
-
C言語です
おすすめ情報