Chinaunix

标题: 请教strcut设计的问题 [打印本页]

作者: brantc    时间: 2013-07-16 10:49
标题: 请教strcut设计的问题
小弟有个程序是抓包的,有一个链表是根据source ip和dest ip进行统计有多少包被抓到。
所以我的包的数据结构是这样的:
  1. struct node {
  2.   u_char s_ip[16];        //source IP
  3.   u_char d_ip[16];        //destination IP
  4.   u_int32_t package_amount;   //总共抓到的包数量,会被累加
  5.   struct node *next;
  6. };
  7. struct node *head;      
  8. struct node *search;      //(1)标识找到的位置 (2)用于开辟新节点的变量
  9. struct node *tail;           //尾指针始终指向最后一个节点
复制代码
但是呢,因为TCP和UDP是有端口的,我上面的结构就无法体现,而且我要在打印统计时把端口也打印出来,于是我就把上面的node修改成:
  1. struct node {
  2.   u_char s_ip[16];        //source IP
  3.   u_char d_ip[16];        //destination IP
  4.   u_int32_t s_port;      //source port
  5.   u_int32_t d_port;      //destination port
  6.   u_int32_t package_amount;   //总共抓到的包数量,会被累加
  7.   struct node *next;
  8. };
  9. struct node *tu_head;         // tu表示tcp和udp
  10. struct node *tu_search;      //(1)标识找到的位置 (2)用于开辟新节点的变量
  11. struct node *tu_tail;           //尾指针始终指向最后一个节点
复制代码
但是呢,我的程序只做了抓TCP和UDP,我还想在遇到不认识的协议时,仍然能输出该s_ip和d_ip的统计数量,当然此时就没有端口的信息,这时最简单的方法就是再增加一个struct,例如:
  1. struct unknown_node {
  2.   u_char s_ip[16];        //source IP
  3.   u_char d_ip[16];        //destination IP
  4.   u_int32_t package_amount;   //总共抓到的包数量,会被累加
  5.   struct node *next;
  6. };
复制代码
同理,就需要增加一个相关struct的链表处理,如下:
  1. struct unknown_node *unknown_head;      
  2. struct unknown_node *unknown_search;      //(1)标识找到的位置 (2)用于开辟新节点的变量
  3. struct unknown_node *unknown_tail;           //尾指针始终指向最后一个节点
复制代码
这样就很麻烦了。
因为我首先要判断是不是TCP或者UDP,如果是,用一个函数进行struct node 类型的tu_head/tu_search/tu_tail的处理;
如果不是,我就需要另一个函数进行struct unknown_node类型的unknown_head/unknown_search/unknown_tail的处理。

有没有什么办法,可以让我只用一个函数就处理两种struct的链表的处理(C++的用法参考,比如用什么继承呀之类的,就可以在函数用父类的类型,不用管传进来的参数的类型。而C语言就必须传进的参数和函数声明的参数一致(用强制转换相当不好))?

或者,有没有办法让两种strcut变成一种(这样我原来的处理链表的程序和程序流程就可以都不用大改)?比如在struct里面用#ifdef等控制语句控制或者用union类型?我只是大概有点印象好像见过,但是具体不知道怎么操作。

请指教!
谢谢!

作者: brantc    时间: 2013-07-16 13:04
好嘛,没人回我。
我帖stackoverflow去了,有大佬已经回答了。
链接付这里,供大家参考:http://stackoverflow.com/questio ... odate-more-elements
作者: mightofcode    时间: 2013-07-16 16:57
继续用原来那个node啊
加个int说明是那种包,不就可以满足你的需求了么

就是有点冗余数据

作者: wk_g7    时间: 2013-07-16 17:01
我喜欢这样做

u_int32_t package_amount;   //总共抓到的包数量,会被累加
u_int32_t package_tcp_amount;   //总共抓到的tcp or udp包数量,会被累加

struct 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

  int protocol_type;
  struct node *next;
  struct node * next_tcp;
  struct node * next_not_tcp;
};

struct node *head;      
struct node *search;      //(1)标识找到的位置 (2)用于开辟新节点的变量

struct node *tail;           //尾指针始终指向最后一个节点
作者: brantc    时间: 2013-07-18 11:13
回复 3# mightofcode


    嗯,就是不想有冗余的。
作者: brantc    时间: 2013-07-18 11:16
回复 4# wk_g7


    感谢回复。
你的办法不错,但是还是会有冗余的数据。
看起来,如果只用一个结构体,就始终会有冗余的。。。。
小弟最后还是用的一个结构体
不是TCP或者UDP,port就置-1。。。。自己都觉得太傻了 。。。
空了再参考下其他的类似问题的好设计吧





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2