流程
- 数据包内存初始化
- 构造数据包
- 发送数据
- 释放资源
相关API
#include <libnet.h>
/**
* [libnet_init 数据包内存初始化]
* @param injection_type [
* 构造类型
LIBNET_LINK,链路层
LIBNET_RAW4,网络接口层(网络层)
LIBNET_LINK_ADV,链路层高级版本
LIBNET_RAW4_ADV, 网络层高级版本
]
* @param device [发送设备接口名称]
* @param err_buf [返回错误消息]
* @return [成功返回数据包句柄,识别返回NULL]
*/
libnet_t *libnet_init(int injection_type, char *device, char *err_buf);
#include <libnet.h>
/**
* [libnet_build_ethernet 构建以太网数据包]
* @param dst [目的MAC]
* @param src [源MAC]
* @param type [报文类型]
* @param payload [负载,需要发送的数据包]
* @param payload_s [负载长度,或为 0]
* @param l [数据包的句柄]
* @param ptag [协议标记,使用0]
* @return [数据包结构体]
*/
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);
#include <libnet.h>
/**
* [libnet_build_ipv4 构建IP数据包]
* @param ip_len [IP数据包长度,设置为20+8+msg_len 20IP头部长度 + 8udp头部长度+msg_len数据长度]
* @param tos [服务类型]
* @param id [标识]
* @param flag [片偏移]
* @param ttl [生存时间]
* @param prot [协议类型]
* @param sum [头部校验和,用户使用0占位,由libnet自动填充校验和的值]
* @param src [源IP]
* @param dst [目的IP]
* @param payload [负载,需要发送的数据包]
* @param payload_s [负载长度,或为 0]
* @param l [数据包的句柄]
* @param ptag [协议标记,使用0]
* @return [数据包结构体]
*/
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);
#include <libnet.h>
/**
* [libnet_build_udp 构建UDP数据包]
* @param sp [源端口号]
* @param dp [目的端口]
* @param len [udp数据包长度(udp头长度+数据长度)]
* @param sum [udp数据包校验和(使用者填充0占位,有libnet自动校验填充)]
* @param payload [负载(需要发送的udp数据),可设置为 NULL]
* @param payload_s [负载长度,或为 0]
* @param l [表示数据包的句柄]
* @param ptag [协议标记,使用0]
* @return [数据包结构体]
*/
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);
#include <libnet.h>
/*发送数据包*/
int libnet_write(libnet_t * l);
#include <libnet.h>
/*释放数据包内存*/
void libnet_destroy(libnet_t *l);
实例
#include <stdio.h>
#include <libnet.h>
int main()
{
int ret;
libnet_t *mylibnet;
char err_buf[512];
libnet_ptag_t ptag;
char data[] = "hello libnet";
char send_msg[1024];
char msg_len;
char *src_ip = "10.7.181.31";
char *dest_ip = "10.7.181.123";
unsigned char src_mac[] = {0x00, 0x0c, 0x29, 0x84, 0x0e, 0x96};
unsigned char dest_mac[] = {0x00, 0xe0, 0x4c, 0x7b, 0x59, 0x17};
/* 初始化libnet句柄 */
mylibnet = libnet_init(LIBNET_LINK_ADV, "ens33", err_buf);
if (mylibnet == NULL) {
fprintf(stderr, "libnet_init fail\n");
return -1;
}
printf("libnet_init success\n");
/* 封装UDP数据包 */
msg_len = sprintf(send_msg, "%s", data);
ptag = libnet_build_udp(8888, 8080, 8+msg_len, 0, send_msg, msg_len, mylibnet, 0);
if (ptag == -1) {
fprintf(stderr, "libnet_build_udp fail\n");
return -1;
}
/* 封装IPV4数据包 */
ptag = libnet_build_ipv4(
20+8+msg_len, /* 20IP头部长度 + 8udp头部长度+msg_len数据长度 */
0,0,0, /* 服务类型,标识,片偏移 */
128, /* 生存时间 */
17, /* 协议类型:17 = UDP报文 */
0, /* 头部校验和 */
inet_addr(src_ip), /* 源IP */
inet_addr(dest_ip), /* 目的IP */
NULL, 0, /* 在IPV4中负载不能 设置 */
mylibnet,
0
);
if (ptag == -1) {
fprintf(stderr, "libnet_build_ipv4 fail\n");
return -1;
}
/* 封装以太网数据包 */
ptag = libnet_build_ethernet((u_int8_t *)dest_mac, (u_int8_t *)src_mac, 0x0800, NULL, 0, mylibnet, 0);
if (ptag == -1) {
fprintf(stderr, "libnet_build_ethernet fail\n");
return -1;
}
/* 发送数据包 */
ret = libnet_write(mylibnet);
if (ret == -1) {
fprintf(stderr, "libnet_write fail\n");
return -1;
}
/* 释放libnet数据包内存 */
libnet_destroy(mylibnet);
}
网友评论