wireshark开发者手册中文版——如何窃听协议

9.5如何窃听协议

  增加一个窃听接口到协议上可以让我们做一些有用得事情。尤其是可以从窃听接口上产生协议统计。

  一个窃听器基本上是一种让其他项目了解当一个协议被解析时发生了什么事情的方法。窃听器在主程序中被注册,然后在每一个解析器中被调用。一些被整个例程提供的确定的协议标识数据也可以被使用。

  要使用窃听器,必须首先注册。窃听器注册时返回一个整型句柄,使用例程register_tap注册,它带有一个字符串名称,注册之后我们可以通过这个字符串找到它。

例子9.19 初始化一个窃听器

#include <epan/packet.h>

#include <epan/tap.h>

static int foo_tap = -1;

struct FooTap {

    gint packet_type;

    gint priority;

       ...

};

void proto_register_foo(void)

{

       ...

    foo_tap = register_tap("foo");

  同时你也可以实现一个不带协议标识数据的窃听器,而这通常没有什么用!所以声明一个能被传递到窃听器的数据结构是个好主意。这个数据结构需要被声明为一个static数据结构,因为它将在解析过程返回后被使用。通常来说最好把协议解析后的常用部分导入到窃听器数据中。这可能是报文类型,优先级别后者一个状态码。这个结构体最好声明在一个头文件中,这样的话它可以被其他想要在窃听器中监听它的组件包含。

一旦你定义好了这些,那接下来就是一个简单的从协议标识数据结构结构中提取数据的过程,然后调用tap_queue_packet,可能的话在解析器最后部分调用。

例子9.20 调用协议窃听器

void dissect_foo(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)

{

       ...

    fooinfo = ep_alloc(sizeof(struct FooTap));

    fooinfo->packet_type = tvb_get_guint8(tvb, 0);

    fooinfo->priority = tvb_get_ntohs(tvb, 8);

       ...

    tap_queue_packet(foo_tap, pinfo, fooinfo);

}


版权所有:Jason Tu,转载请注明

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值