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,转载请注明

你可能感兴趣的:(数据结构,tree)