アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんにちは。質問させて頂きます。

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なのは何故なのか。
この二つが解決出来ればなんとか出来ると思うのですが力不足でそれに及びません。何か気が付かれた事等ありましたらご教授頂けないでしょうか。どうぞよろしくお願いします。

A 回答 (3件)

ざっと見た感じですが……



・flow_headがローカル変数なので関数呼び出しごとに初期化される
・if()の構成が間違っている(どのprintf()にも到達しないパターンがある)
・リストが構築されてない(malloc()で確保したメモリのアドレスをnextに入れる処理がない)
・追加で確保した要素のnextをNULLにしてない(このままリストに入れたら終端判定ができなくなる)
・関数脱出直前のfree(looplist)は不要というかここでやってはいけない(ヒットした要素、もしくは作ったばかりの新要素を壊してしまうことになる)

とりあえずこんなところで。
ループは一回は入ってると思いますが、ステップ実行で追ってみましたか?

この回答への補足

ご回答有難う御座います。

>・if()の構成が間違っている(どのprintf()にも到達しないパターンがある)

私の力不足でどんなパターンがあるのか予測がつきません。
お手数ですが、どんなパターンがあるのか教えて頂いてもよろしいでしょうか。if文の最後にelse文をつけているのでいずれかのprintf()には辿り着くのではと思えてしまうのですが・・。

補足日時:2008/11/26 00:21
    • good
    • 0
この回答へのお礼

上で言った事は忘れてください・・。
助かりました。有難う御座いました。

お礼日時:2008/11/26 04:15

>for (looplist = &flow_head; looplist ; looplist = looplist->next)


>{

ここのすぐ下でlooplistの値をprintf()で出力してみましたか?
いわゆる「printfデバッグ」の基本です。
    • good
    • 0
この回答へのお礼

ご回答有難うございました。

お礼日時:2008/11/26 04:16

>for (looplist = &flow_head; looplist ; looplist = looplist->next)


・・・ ループ条件 *looplist って書いたらどうなる?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!