本文用于记录libnet 1.1核心功能及常用函数,主要内容来源于Libnet 1.1 tutorial(https://repolinux.wordpress.com/2011/09/18/libnet-1-1-tutorial/)和libnet_functions.h。
1、libnet如何工作:
(1)通过libnet_init()函数进行初始化,建立libnet context;
(2)从高层到低层建立报头。例如,建立UDP数据包时,调用函数的顺序如下:libnet_build_udp()
, libnet_build_ipv4()
, libnet_build_ethernet()
;
(3)调用libnet_write()写入数据包,发送;
(4)准备发送新的数据包,一般而言,有以下两种方式:
(4.1)调用libnet_clear_packet()清除之前发送的数据包,回到第(2)步;
(4.2)接着上次发送的数据包继续发送:即回到第(2)步,并使用相同函数更新数据包,但是现在所使用的数据包tag是上次发送数据包后所返回的tag;
(5)完成所有数据包发送工作,调用libnet_destroy()清除libnet context,退出。
2、libnet中的主要函数:
(1)初始化及注销
// libnet context初始化,injection_type包括(LIBNET_LINK, LIBNET_LINK_ADV, LIBNET_RAW4, LIBNET_RAW4_ADV, LIBNET_RAW6, LIBNET_RAW6_ADV)
libnet_t *libnet_init(int injection_type, const char *device, char *err_buf);
// 注销libnet context
void libnet_destroy(libnet_t *l);
// 清除上次发送的封包
void libnet_clear_packet(libnet_t *l);
(2)生成随机数
// 通常用于为第一个封包生成随机的ID number