我有一个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;
虽然My sniffer的局限性在于它只能解析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;
现在我遇到了问题。 因为我有两个不同的结构,所以我需要两个不同的函数来处理列表操作(head,search和tail)。
那么有谁可以帮我思考如何重新设计/重构上面的结构或者给我一点重构我的列表函数,做个好设计?
到目前为止,我有两种可能但不明确的方法:
#if
(第一个代码段)中使用类似struct node
的内容来容纳d_port和s_port。但我不认为这是可行的,因为嗅探器在运行时只知道TCP和UDP,但#if
指令需要在编译时修复。答案 0 :(得分:0)
我认为你的答案在于你的第二个问题,因为C不支持重载,所以你有两个选择之一:使用C ++支持的C子集,因为该子集允许重载。
或者,编写一个可以处理两种类型结构的函数。由于这在ANSI C中是不可能的,因此在结构定义中简单地支持这两种协议并确定它们会更好一点。正在使用哪一个。
第三个也是最后一个选项是使用库。如果这不是作业,我强烈建议使用为此目的而设计的库,以及研究类似的实现。
想到的是 tcpdump和libcap 库:
为什么要提出第三方建议?我并不是说听起来很迂腐,但除非是学术练习或主要是为了自学,否则在可能的情况下使用图书馆是个好兆头 - 而不是推出自己的图书馆(除非你有理由这样做)。时间是您最重要的资产。你应该高效率地使用它。
以下是一些示例,您可以查看tcpdump和libcap是否值得探索:http://eecs.wsu.edu/~sshaikot/docs/lbpcap/libpcap-tutorial.pdf http://simplestcodings.blogspot.com/2010/10/create-your-own-packet-sniffer-in-c.html?q=sniffer
祝你好运!