pcap ファイルから抽出したフロー情報を保存するために stl マップを使用しています。パケットが来ると、map.find を使用して、パケットが属するフローが存在するかどうかを調べます。A から B へのパケットと B から A へのパケットは同じフローに属しているため、map.find を 2 回使用する必要があります。
struct FiveTuple
{
unsigned short source_port;
unsigned short dest_port;
unsigned int source_ip_addr;
unsigned int dest_ip_addr;
unsigned char transport_proto_type;
};
FiveTuple はフローを識別します。マップのキー要素として FiveTuple を使用します。
map は map< FiveTuple, Flow, FlowCmp> です。FlowCmp は memcmp を使用して、operator< のように、FiveTuple a が FiveTuple b より小さいかどうかを確認する構造体です。パケットのフローが存在するかどうかを確認するために、次のようなコードを記述しました。ここで、m はマップの名前、five_tuple はパケットから抽出された情報を含む FiveTuple です。
auto it = m.find(five_tuple);
if( it == m.end())
{
//swap source and dest ip/port in five_tuple,
it = m.find(five_tuple);
if(it == m.end())
{
//do something
}
}
vs2010 のデバッグ バージョンでは、結果は妥当です。これをリリース バージョンに変更したところ、ほとんどの場合、2 番目の m.find が正しいイテレータを返す代わりに m.end を返すだけであることがわかりました。そして、初期化の問題がないことがわかりました。リリース バージョンの問題を修正するにはどうすればよいですか?