我有一个 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;
现在我有一个问题。因为我有两种不同的结构,所以我需要两个不同的函数来处理列表操作(头部、搜索和尾部)。
那么任何人都可以帮助我考虑如何重新设计/重构上述结构或给我一点重构我的列表函数,成为一个好的设计吗?
到目前为止,我得到了两种可能但不清楚的方法:
- 一个是使用类似
#if
instruct node
(第一个代码片段)的东西来容纳 d_port 和 s_port。但我认为这是不可行的,因为嗅探器在运行时只知道 TCP 和 UDP,但#if
指令需要在编译时修复。 - 第二个是考虑如何实现“重载”功能以兼容“struct tu_node”和“struct unknown_node”两者。但似乎C语言不能。