重构现有的C结构以容纳更多元素

时间:2013-07-16 04:04:08

标签: c data-structures refactoring

我有一个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)。

那么有谁可以帮我思考如何重新设计/重构上面的结构或者给我一点重构我的列表函数,做个好设计?


到目前为止,我有两种可能但不明确的方法:

  1. 一个是在#if(第一个代码段)中使用类似struct node的内容来容纳d_port和s_port。但我不认为这是可行的,因为嗅探器在运行时只知道TCP和UDP,但#if指令需要在编译时修复。
  2. 第二个是考虑如何实现“重载”功能以兼容“struct tu_node”和“struct unknown_node”。但似乎C语言不能。

1 个答案:

答案 0 :(得分:0)

我认为你的答案在于你的第二个问题,因为C不支持重载,所以你有两个选择之一:使用C ++支持的C子集,因为该子集允许重载。

或者,编写一个可以处理两种类型结构的函数。由于这在ANSI C中是不可能的,因此在结构定义中简单地支持这两种协议并确定它们会更好一点。正在使用哪一个。

第三个也是最后一个选项是使用库。如果这不是作业,我强烈建议使用为此目的而设计的库,以及研究类似的实现。

想到的是 tcpdump和libcap 库:

http://www.tcpdump.org/

为什么要提出第三方建议?我并不是说听起来很迂腐,但除非是学术练习或主要是为了自学,否则在可能的情况下使用图书馆是个好兆头 - 而不是推出自己的图书馆(除非你有理由这样做)。时间是您最重要的资产。你应该高效率地使用它。

以下是一些示例,您可以查看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

祝你好运!