libnet_t结构体
libnet维护一个libnet_t结构,这个结构是理解整个libnet的关键。
第一步,在使用之前,必须包含#include <libnet.h>
然后是用 libnet_t * libnet_init(int injection_type, const char *device, char *err_buf);
去初始化一个libnet_t 结构体,该结构体内有一个libnet_pblock_t 结构体,
libnet_pblock_t则表述各个协议,维护各个协议给发送的数据包添加的数据块。
从libnet_t已经大概可以看出libnet的设计思想了:程序员决定一些参数,并且通过函数调用中的参数把相关的数据交给libnet.libnet则在程序员每要求购建一个协议包头的时候,为其创建一个libnet_pblock_t的结构保存这些数据,并将该结构入链表。当所有的准备工作完成,程序员一声令下,libnet就将协议块链(由protocol_blocks开始,终于pblock_end)中的协议包头以及数据组合成一个合乎规格的包,通过硬件发送出去。如果任何一个步骤出了差错,程序员都可以从errbuf中获取出错信息。最后,libnet从程序员手中接过一个指令,进行所有的善后工作。
下面给一个libnet使用的最小实例:
#include <stdlib.h>
#include <stdio.h>
#include <libnet.h>
int main (void)
{
char inf[MAX_INTERFACE_NAME] = {"eth0"};
libnet_t *lnet = NULL;
char errbuf[LIBNET_ERRBUF_SIZE] = {0};
int srcip;
struct libnet_ether_addr *ethaddr;
//分配并初始化libnet_t结构体
lnet = libnet_init(LIBNET_LINK, inf, errbuf);
if (!lnet)
{
printf("libnet_init error:%s\n", libnet_geterror(lnet));
return -1;
}
//获取eth0接口的IP地址
srcip = libnet_get_ipaddr4(lnet);
//获取eth0接口的mac地址
ethaddr = libnet_get_hwaddr(lnet);
//ip地址转换成字符串并打印出来
printf("IP:%s\n",libnet_addr2name4(srcip,LIBNET_DONT_RESOLVE));
//释放libnet_t结构体
libnet_destroy(lnet);
}