gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:49:46 30 4
gpt4 key购买 nike

我有一个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 对的未知协议(protocol)包数量。如您所见,现在端口字段(s_port 和 d_port)不适用于未知协议(protocol)。对我来说,简单的方法是定义一个新的结构,例如:

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

最佳答案

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

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

第三个也是最后一个选择是使用库。如果这不是为了作业,除了研究类似的实现之外,我强烈建议使用专为此目的而设计的库。 p>

我想到的是tcpdump 和 libcap 库:

http://www.tcpdump.org/

为什么需要第三方建议?我并不是想显得迂腐,但是,除非这是一项学术练习或主要是为了自学,否则最好尽可能使用图书馆 - 而不是推出自己的图书馆(除非你有理由这样做)。时间是你最重要的 Assets 。您应该高效地使用它。

您可以检查以下几个示例,看看 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

祝你好运!

关于c - 重构现有的 C 结构以容纳更多元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17667826/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com