C言語のスニファプログラムがあります。ソース IP と宛先 IP のペアごとにキャッチされたパッケージ (パケット) の数を記録するリストがあります。私がそのようなパッケージを手に入れたように:
[192.168.1.1] -> [192.168.1.2] Total package amount:[100]
[192.168.1.3] -> [192.168.1.4] Total package amount:[100]
[192.168.1.4] -> [192.168.1.3] Total package amount:[100]
私の構造は次のとおりです。
struct node {
u_char s_ip[16]; //source IP
u_char d_ip[16]; //destination IP
u_int32_t package_amount; //Would be sum
struct node *next;
};
struct node *head;
struct node *search; //(1)position (2)for new malloc
struct node *tail;
しかし、ご存じのように、TCP と UDP にはポートがあるため、構造体にポート フィールドを追加すると、次のようになります。
struct tu_node {
u_char s_ip[16]; //source IP
u_char d_ip[16]; //destination IP
u_int32_t s_port; //source port
u_int32_t d_port; //destination port
u_int32_t package_amount;
struct node *next;
};
struct tu_node *tu_head; // tu means tcp and udp
struct tu_node *tu_search;
struct tu_node *tu_tail;
私のスニファーは TCP と UDP しか解析できないという制限がありますが、s_ip と d_ip のペアごとに不明なプロトコル パッケージの量を出力したいと考えています。ご覧のとおり、ポート フィールド (s_port および d_port) は未知のプロトコルには適用されません。私にとって簡単な方法は、次のような新しい構造体を定義することです。
struct unknown_node {
u_char s_ip[16]; //source IP
u_char d_ip[16]; //destination IP
u_int32_t package_amount;
struct node *next;
};
struct unknown_node *unknown_head;
struct unknown_node *unknown_search;
struct unknown_node *unknown_tail;
今、私は問題を抱えています。私は 2 つの異なる構造を持っているので、基本的にリスト操作 (head、search、tail) を処理するには 2 つの異なる関数が必要です。
では、構造を再設計/リファクタリングする方法について考えるのを手伝ってくれる人や、リスト関数をリファクタリングして良い設計にするポイントを教えてくれる人はいますか?
これまでのところ、可能性が高いが不明な方法が 2 つあります。
- 1 つは、d_port と s_port に対応するため
#if
に(最初のコード スニペット) のようなものを使用することです。struct node
しかし、スニファーは実行時に TCP と UDP しか認識していないため、実現可能ではないと思いますが、#if
ディレクティブはコンパイル時に修正する必要があります。 - 2 つ目は、互換性のある「struct tu_node」と「struct unknown_node」の両方に「overload」機能を実装する方法を考えることです。しかし、C言語はできないようです。