0

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

现在我有一个问题。因为我有两种不同的结构,所以我需要两个不同的函数来处理列表操作(头部、搜索和尾部)。

那么任何人都可以帮助我考虑如何重新设计/重构上述结构或给我一点重构我的列表函数,成为一个好的设计吗?


到目前为止,我得到了两种可能但不清楚的方法:

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

1 回答 1

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

祝你好运!

于 2013-07-16T04:27:06.163 回答