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