libnet(libnet库的安装与使用)

发布时间:2025-12-10 19:14:16 浏览次数:19

libnet库的安装与使用-libnetfilter_queue

libnet库的安装与使用1安装sudoapt-getinstalllibnet1-dev2使用头文件:#include<libnet.h>编译时加:-lnet利用libnet函数库开发应用程序的基本步骤:数据包内存初始化构造数据包发送数据释放资源相关函数:libnet_t*libnet_init(intinjection_type,char*device,char*err_buf)功能:数据包内存初始化及环境建立参数:injection_type

libnet库的组包顺序是从应用层–>链路层

1 安装

sudo apt-get install libnet1-dev

2 使用

头文件:#include <libnet.h>
编译时加:-lnet

利用libnet函数库开发应用程序的基本步骤:

数据包内存初始化 构造数据包 发送数据 释放资源

相关函数:

libnet_init
libnet_t *libnet_init(int injection_type, char *device, char *err_buf)功能:    数据包内存初始化及环境建立参数:    injection_type: 构造的类型    (LIBNET_LINK,LIBNET_RAW4,LIBNET_LINK_ADV(推荐),LIBNET_RAW4_ADV)    device:网络接口,如"eth0",或IP地址,亦可为NULL(自动查询搜索)    err_buf: 存放出错的信息返回值:成功返回一个libnet句柄;失败返回NULL

是否还在为Ide开发工具频繁失效而烦恼,来吧关注以下公众号获取最新激活方式。亲测可用!

为防止网络爬虫,请关注公众号回复”口令”

激活idea 激活CLion DataGrip DataSpell dotCover dotMemory dotTrace GoLand PhpStorm PyCharm ReSharper ReShaC++ Rider RubyMine WebStorm 全家桶 刷新

【正版授权,激活自己账号】:Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】:官方授权 正版激活 自己使用,支持Jetbrains家族下所有IDE…

libnet_destroy
void libnet_destroy(libnet_t *l);功能:    释放资源参数:  l: libnet句柄返回值:
libnet_build_udp
libnet_ptag_t libnet_build_udp(u_int16_t sp,u_int16_t dp,u_int16_t len,u_int16_t sum,u_int8_t *payload,u_int32_t payload_s,libnet_t *l,libnet_ptag_t ptag)功能:    构造udp数据包返回值:    成功返回协议标记;失败返回-1参数:    sp: 源端口号    dp:目的端口号    len:udp包总长度    sum:校验和,设为0,libnet自动填充    payload:负载,可设置为NULL    payload_s:负载长度,或为0    l: libnet句柄    ptag:协议标记(其值为0创建一个新的协议数据,不为0,修改由ptag表示的协议数据)
libnet_build_ipv4
libnet_ptag_t libnet_build_ipv4(u_int16_t ip_len,u_int8_t tos,u_int16_t id,u_int16_t flag,u_int8_t ttl,u_int8_t prot,u_int16 sum,u_int32_t src,u_int32_t dst,u_int8_t *payload,u_int32_t payload_s,libnet_t *l,libnet_ptag_t ptag)功能:    构造一个IPv4数据包参数:    ip_len:ip包总长    tos:服务类型    id:ip标识    flag:片偏移    ttl:生存时间    prot:上层协议    sum:校验和,设为0,libnet自动填充    src: 源ip地址    dst:目的ip地址    payload:负载,可设置为NULL    payload_s:负载长度,或为0    l: libnet句柄    ptag:协议标记返回值:    成功返回协议标记;失败返回-1
libnet_build_ethernet
libnet_ptag_t libnet_build_ethernet(u_int8_t *dst,u_int8_t *src,u_int16_t type,u_int8_t *payload,u_int32_t payload_s,libnet_t *l,libnet_ptag_t ptag)功能:    构造一个以太网数据包参数:    dst:目的mac    src:源mac    type:上层协议类型    payload:负载,即附带的数据    payload_s:负载长度    l:libnet句柄    ptag:协议标记返回值:    成功返回协议标记;失败返回-1
libnet_write
int libnet_write(libnet_t * l)功能:    发送数据到网络参数:  l:libnet句柄返回值:    失败返回-1,成功返回其他

2 例子

#include <iostream>#include <libnet.h>using namespace std;int main(){ //初始化操作libnet_t *nethd = libnet_init(LIBNET_LINK_ADV,"ens33",NULL);if(nethd == NULL){ cout << "nethd eroor" << endl;return -1;}//应用层数据cout << "请输入要发送的内容:" << endl;char data[256] = "";cin.getline(data,sizeof(data));int dataLen = strlen(data) + strlen(data)%2;//传输层libnet_ptag_t udp = libnet_build_udp(8000,9000,8+dataLen,0,(uint8_t*)data,dataLen,nethd,0);//网络层libnet_ptag_t ipv4 =  libnet_build_ipv4(20+8+dataLen,0,0,0,128,17,0,inet_addr("192.168.243.128"),inet_addr("192.168.243.1"),NULL,0,nethd,0);//链路层unsigned char dstMac[6] = { 0x00,0x50,0x56,0xc0,0x00,0x08};unsigned char srcMac[6] = { 0x00,0x0c,0x29,0xee,0x18,0x53};libnet_build_ethernet(dstMac,srcMac,0x0800,NULL,0,nethd,0);//发送libnet_write(nethd);/*********连续多次发送数据时************/for(int i = 0; i < 6; ++i){ cout << "请输入要发送的内容:" << endl;cin.getline(data,sizeof(data));fflush(stdin);dataLen = strlen(data) + strlen(data)%2;//由于上面已经构建过一次各层格式了,这里改变的是dataLen,影响的是传输层和网络层,所有只需要再次构建这两层即可,//最后一个参数协议标记 值为0时创建一个新的协议数据,不为0,修改为由ptag表示的协议数据,代表还是在刚才那块内存上构建udp = libnet_build_udp(8000,9000,8+dataLen,0,(uint8_t*)data,dataLen,nethd,udp);ipv4 = libnet_build_ipv4(20+8+dataLen,0,0,0,128,17,0,inet_addr("192.168.243.128"),inet_addr("192.168.243.1"),NULL,0,nethd,ipv4);libnet_write(nethd);}/************************************///释放资源libnet_destroy(nethd);return 0;}
需要做网站?需要网络推广?欢迎咨询客户经理 13272073477