IT培训网 - IT职场人学IT技术上IT培训网
深度剖析C++高级应用之libnet应用宝典
时间:2018-09-12 14:48:55 来源:电脑培训网 作者:IT培训网 已有:名学员访问该课程
C++网络编程高级应用语言,通常被称为贵族编程语言,很多人可望而不可及,有着高贵血统的C++语言,并非触不可及,今天IT培训网小编给大家分享有关libet应用指南,供大家学习参考,详细分析如下:
功能:
构造 tcp 数据包
参数:
sp:源端口号
dp:目的端口号
seq:序号
ack:ack 标记
control:控制标记
win:窗口大小
sum:校验和,设为 0,libnet 自动填充
urg:紧急指针
len:tcp包长度
payload:负载,为给应用程序发送的文本内容,可设置为 NULL
payload_s:负载长度,或为 0
l:libnet_init() 返回的 libnet * 指针
ptag:协议标记,第一次组新的发送包时,这里写 0,同一个应用程序,下一次再组包时,这个位置的值写此函数的返回值。
返回值:
成功:协议标记
失败:-1
libnet_ptag_t libnet_build_tcp_options(
u_int8_t *options,u_int32_t options_s,libnet_t *l,libnet_ptag_t ptag );
功能:
构造 tcp 选项数据包
参数:
options:tcp 选项字符串
options_s:选项长度
l:libnet 句柄,libnet_init() 返回的 libnet * 指针
ptag:协议标记,第一次组新的发送包时,这里写 0,同一个应用程序,下一次再组包时,这个位置的值写此函数的返回值。
返回值:
成功:协议标记
失败:-1
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(这里通常写 NULL)
payload_s:负载长度,或为 0(这里通常写 0 )
l:libnet 句柄,libnet_init() 返回的 libnet * 指针
ptag:协议标记,第一次组新的发送包时,这里写 0,同一个应用程序,下一次再组包时,这个位置的值写此函数的返回值。
返回值:
成功:协议标记
失败:-1
libnet_ptag_t libnet_build_ipv4_options(
u_int8_t*options, u_int32_t options,libnet_t*l, libnet_ptag_t ptag);
功能:
构造 IPv4 选项数据包
参数:
options:tcp 选项字符串
options_s:选项长度
l:libnet 句柄,libnet_init() 返回的 libnet * 指针
ptag:协议标记,若为 0,建立一个新的协议
返回值:
成功:协议标记
失败:-1
libnet_ptag_t libnet_build_arp(
u_int16_t hrd, u_int16_t pro,
u_int8_t hln, u_int8_t pln,
u_int16_t op, u_int8_t *sha,
u_int8_t *spa, u_int8_t *tha,
u_int8_t *tpa, u_int8_t *payload,
u_int32_t payload_s, libnet_t *l,
libnet_ptag_t ptag );
功能:
构造 arp 数据包
参数:
hrd:硬件地址格式,ARPHRD_ETHER(以太网)
pro:协议地址格式,ETHERTYPE_IP( IP协议)
hln:硬件地址长度
pln:协议地址长度
op:ARP协议操作类型(1:ARP请求,2:ARP回应,3:RARP请求,4:RARP回应)
sha:发送者硬件地址
spa:发送者协议地址
tha:目标硬件地址
tpa:目标协议地址
payload:负载,可设置为 NULL(这里通常写 NULL)
payload_s:负载长度,或为 0(这里通常写 0 )
l:libnet 句柄,libnet_init() 返回的 libnet * 指针
ptag:协议标记,第一次组新的发送包时,这里写 0,同一个应用程序,下一次再组包时,这个位置的值写此函数的返回值。
返回值:
成功:协议标记
失败:-1
libnet_ptag_t libnet_build_ethernet(
u_int8_t*dst, u_int8_t *src,
u_int16_ttype, u_int8_t*payload,
u_int32_tpayload_s, libnet_t*l,
libnet_ptag_t ptag );
功能:
构造一个以太网数据包
参数:
dst:目的 mac
src:源 mac
type:上层协议类型
payload:负载,即附带的数据,可设置为 NULL(这里通常写 NULL)
payload_s:负载长度,或为 0(这里通常写 0 )
l:libnet 句柄,libnet_init() 返回的 libnet * 指针
ptag:协议标记,第一次组新的发送包时,这里写 0,同一个应用程序,下一次再组包时,这个位置的值写此函数的返回值。
返回值:
成功:协议标记
失败:-1
int libnet_write(libnet_t * l);
功能:
发送数据包
参数:
l:libnet 句柄,libnet_init() 返回的 libnet * 指针
返回值:
成功:发送数据包的长度
失败:返回 -1
使用实例
这里是在 ubuntu 下通过原始套接字组一个 udp 数据包,给 PC 机的网络调试助手发送信息(对比:《原始套接字实例:发送 UDP 数据包》):
-
#include <stdio.h>
-
#include <stdlib.h>
-
#include <string.h>
-
#include <unistd.h>
-
#include <libnet.h>
-
-
int main(int argc, char *argv[])
-
{
-
char send_msg[1000] = "";
-
char err_buf[100] = "";
-
libnet_t *lib_net = NULL;
-
int lens = 0;
-
libnet_ptag_t lib_t = 0;
-
unsigned char src_mac[6] = {0x00,0x0c,0x29,0x97,0xc7,0xc1};//发送者网卡地址00:0c:29:97:c7:c1
-
unsigned char dst_mac[6] = {0x74,0x27,0xea,0xb5,0xff,0xd8};//接收者网卡地址74-27-EA-B5-FF-D8
-
char *src_ip_str = "192.168.31.163"; //源主机IP地址
-
char *dst_ip_str = "192.168.31.248"; //目的主机IP地址
-
unsigned long src_ip,dst_ip = 0;
-
-
lens = sprintf(send_msg, "%s", "this is for the udp test");
-
-
lib_net = libnet_init(LIBNET_LINK_ADV, "eth0", err_buf); //初始化
-
if(NULL == lib_net)
-
{
-
perror("libnet_init");
-
exit(-1);
-
}
-
-
src_ip = libnet_name2addr4(lib_net,src_ip_str,LIBNET_RESOLVE); //将字符串类型的ip转换为顺序网络字节流
-
dst_ip = libnet_name2addr4(lib_net,dst_ip_str,LIBNET_RESOLVE);
-
-
lib_t = libnet_build_udp( //构造udp数据包
-
8080,
-
8080,
-
8+lens,
-
0,
-
send_msg,
-
lens,
-
lib_net,
-
0
-
);
-
-
lib_t = libnet_build_ipv4( //构造ip数据包
-
20+8+lens,
-
0,
-
500,
-
0,
-
10,
-
17,
-
0,
-
src_ip,
-
dst_ip,
-
NULL,
-
0,
-
lib_net,
-
0
-
);
-
-
lib_t = libnet_build_ethernet( //构造以太网数据包
-
(u_int8_t *)dst_mac,
-
(u_int8_t *)src_mac,
-
0x800, // 或者,ETHERTYPE_IP
-
NULL,
-
0,
-
lib_net,
-
0
-
);
-
int res = 0;
-
res = libnet_write(lib_net); //发送数据包
-
if(-1 == res)
-
{
-
perror("libnet_write");
-
exit(-1);
-
}
-
-
libnet_destroy(lib_net); //销毁资源
-
-
printf("----ok-----\n");
-
return 0;
-
}
-
复制代码
每期开班座位有限.0元试听抢座开始!
温馨提示 : 请保持手机畅通,咨询老师为您
提供专属一对一报名服务。
- 上一篇:细数最新软件测试工程师面试题及答案
- 下一篇:最好的IT技术请带走 最美的微笑请留下