※ ChatGPTを利用し、要約された質問です(原文:for文が機能しません。どなたか原因を指摘して頂けますか。)
for文が機能せず、looplistが常にNULLになる原因を指摘してください
このQ&Aのポイント
プログラム内のfor文が機能せず、ループをスキップしてしまっている可能性があります。
looplistが常にNULLになる原因として、ループの条件記述がおかしい可能性があります。
解決策として、ループの条件を正しく設定し、ループの中でのアクションを適切に行う必要があります。
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なのは何故なのか。
この二つが解決出来ればなんとか出来ると思うのですが力不足でそれに及びません。何か気が付かれた事等ありましたらご教授頂けないでしょうか。どうぞよろしくお願いします。
お礼
上で言った事は忘れてください・・。 助かりました。有難う御座いました。
補足
ご回答有難う御座います。 >・if()の構成が間違っている(どのprintf()にも到達しないパターンがある) 私の力不足でどんなパターンがあるのか予測がつきません。 お手数ですが、どんなパターンがあるのか教えて頂いてもよろしいでしょうか。if文の最後にelse文をつけているのでいずれかのprintf()には辿り着くのではと思えてしまうのですが・・。