免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2328 | 回复: 5
打印 上一主题 下一主题

[C] 请教strcut设计的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-07-16 10:49 |只看该作者 |倒序浏览
小弟有个程序是抓包的,有一个链表是根据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类型?我只是大概有点印象好像见过,但是具体不知道怎么操作。

请指教!
谢谢!

论坛徽章:
0
2 [报告]
发表于 2013-07-16 13:04 |只看该作者
好嘛,没人回我。
我帖stackoverflow去了,有大佬已经回答了。
链接付这里,供大家参考:http://stackoverflow.com/questio ... odate-more-elements

论坛徽章:
0
3 [报告]
发表于 2013-07-16 16:57 |只看该作者
继续用原来那个node啊
加个int说明是那种包,不就可以满足你的需求了么

就是有点冗余数据

论坛徽章:
0
4 [报告]
发表于 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;           //尾指针始终指向最后一个节点

论坛徽章:
0
5 [报告]
发表于 2013-07-18 11:13 |只看该作者
回复 3# mightofcode


    嗯,就是不想有冗余的。

论坛徽章:
0
6 [报告]
发表于 2013-07-18 11:16 |只看该作者
回复 4# wk_g7


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

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP