首页 > 编程知识 正文

libnet windows,lib..net

时间:2023-05-06 05:21:20 阅读:215845 作者:4543

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 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;}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。