发布时间:2025-12-10 19:14:16 浏览次数:19
libnet库的安装与使用1安装sudoapt-getinstalllibnet1-dev2使用头文件:#include<libnet.h>编译时加:-lnet利用libnet函数库开发应用程序的基本步骤:数据包内存初始化构造数据包发送数据释放资源相关函数:libnet_t*libnet_init(intinjection_type,char*device,char*err_buf)功能:数据包内存初始化及环境建立参数:injection_type
libnet库的组包顺序是从应用层–>链路层
sudo apt-get install libnet1-dev
头文件:#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开发工具频繁失效而烦恼,来吧关注以下公众号获取最新激活方式。亲测可用!
【正版授权,激活自己账号】: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,成功返回其他 #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;}