最新公告
  • 欢迎您光临欧资源网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入我们
  • libnet的安装流程利用libnet函数库开发应用程序的基本步骤利用

    libnet是一个小型接口函数库,主要用C语言编写,提供底层网络数据包的构造、处理和发送功能。

    libnet的开发目的是建立一个简单统一的网络编程接口,屏蔽不同操作系统底层网络编程的差异,让程序员专注于解决关键问题。

    libnet 库提供的接口函数包括 15 个数据包生成器和两个数据包发送器(IP 层和数据链路层)。

    提供的接口函数包括:

    1)内存管理(分配和释放)函数

    2) 地理编码功能

    3)各种协议类型的包构造函数

    4)包发送功能(IP层和链路层)

    5)一些辅助功能,比如随机数生成、错误报告、端口列表管理等。

    有关详细信息,请参阅“libnet 函数列表”。

    安装libnet

    过程

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

    1)包内存初始化

    2)构造数据包

    3)发送数据

    4)释放资源

    以发送UDP数据包为例,流程图如下:

    这里需要注意的是包的顺序c语言流程图生成器,从上层到底层,这里是udp -> ip -> mac,而不是反过来。

    注:C/C++ Linux高级服务器架构师需私信“资料”学习资料(资料包括C/C++、Linux、golang技术、Nginx、ZeroMQ、MySQL、Redis、fastdfs、MongoDB、ZK、流媒体、CDN , P2P, K8S, Docker, TCP/IP, Coroutines, DPDK, ffmpeg等),免费分享

    常用功能介绍

    使用以下函数需要包含头文件:libnet.h

    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*类型的指针,后续所有操作都必须使用这个指针

    失败:空

    无效 libnet_destroy(libnet_t *l);

    特征:

    释放资源

    范围:

    l: libnet * libnet_init() 返回的指针

    返回值:

    没有任何

    char* libnet_addr2name4(u_int32_t in, u_int8_t use_name);

    特征:

    将网络字节顺序转换为点分十进制字符串

    范围:

    in:网络字节顺序的IP地址

    使用名称:

    LIBNET_RESOLVE,对应主机名

    LIBNET_DONT_RESOLVE,对应一个点分十进制的IPv4地址

    返回值:

    成功:点分十进制ip地址

    失败:空

    u_int32_t libnet_name2addr4(libnet_t *l, char *host_name, u_int8_t use_name);

    特征:

    按网络字节顺序将点分十进制数字字符串转换为 IP 地址

    范围:

    l: libnet * libnet_init() 返回的指针

    主机名:

    LIBNET_RESOLVE,对应主机名

    LIBNET_DONT_RESOLVE,对应一个点分十进制的IPv4地址

    返回值:

    成功:网络字节序ip地址

    失败:-1

    u_int32_t libnet_get_ipaddr4(libnet_t *l);

    特征:

    获取接口设备的ip地址

    范围:

    l: libnet * libnet_init() 返回的指针

    返回值:

    成功:网络字节顺序的IP地址

    失败:-1

    结构 libnet_ether_addr* libnet_get_hwaddr(libnet_t *l);

    特征:

    获取接口设备硬件地址

    范围:

    l: libnet * libnet_init() 返回的指针

    返回值:

    成功:指向 MAC 地址的指针

    失败:空

    libnet_ptag_t libnet_build_udp(

    u_int16_t sp,u_int16_t dp,

    u_int16_t len,u_int16_t 总和,

    u_int8_t *有效载荷,u_int32_t有效载荷_s,

    libnet_t *l, libnet_ptag_t ptag);

    特征:

    构造udp数据包

    范围:

    sp:源端口号

    dp:目的端口号

    len:udp包的总长度

    sum:校验和,设置为0,libnet自动填充

    payload:payload,发送给应用程序的文本内容,没有内容时可以设置为NULL

    payload_s:有效载荷长度,发送给应用的文本内容的长度,或者为0

    l: libnet * libnet_init() 返回的指针

    ptag:协议标签,第一次分组新包时,这里写0,同一个应用,下次分组新包时,写这个位置的值作为这个函数的返回值。

    返回值:

    成功:协议令牌

    失败:-1

    libnet_ptag_t libnet_build_tcp(

    u_int16_t sp,u_int16_t dp,

    u_int32_t seq,u_int32_t ack,

    u_int8_t 控制,u_int16_t 获胜

    u_int16_t 总和,u_int16_t urg,

    u_int16_t len,u_int8_t *有效载荷,

    u_int32_t payload_s, libnet_t *l,

    libnet_ptag_t ptag );

    特征:

    构造tcp数据包

    范围:

    sp:源端口号

    dp:目的端口号

    seq:序列号

    ack:确认令牌

    控制:控制标签

    赢:窗口大小

    sum:校验和,设置为0,libnet自动填充

    urg:紧急指针

    len:tcp数据包长度

    payload:payloadc语言流程图生成器,即发送给应用程序的文本内容,可以设置为NULL

    payload_s:有效载荷长度,或 0

    l: libnet * libnet_init() 返回的指针

    ptag:协议标签,第一次分组新包时,这里写0,同一个应用,下次分组新包时,写这个位置的值作为这个函数的返回值。

    返回值:

    成功:协议令牌

    失败:-1

    libnet_ptag_t libnet_build_tcp_options(

    u_int8_t *选项,

    u_int32_t options_s,

    libnet_t *l,

    libnet_ptag_t ptag );

    特征:

    构造 tcp 选项包

    范围:

    选项:tcp 选项字符串

    options_s:选项长度

    l:libnet句柄,libnet * libnet_init()返回的指针

    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 标志,

    u_int8_t ttl,u_int8_t prot,

    u_int16 总和,u_int32_t src,

    u_int32_t dst,u_int8_t *有效载荷,

    u_int32_t payload_s,libnet_t *l,

    libnet_ptag_t ptag );

    特征:

    构造一个 IPv4 数据包

    范围:

    ip_len:ip包总长度

    tos:服务类型

    id:ip标识符

    标志:切片偏移量

    ttl:活着的时间

    prot:上层协议

    sum:校验和,设置为0,libnet自动填充

    src:源IP地址

    dst:目的IP地址

    payload:有效载荷,可以设置为NULL(这里一般写NULL)

    payload_s:有效载荷长度,或者0(这里一般写0)

    l:libnet句柄,libnet * libnet_init()返回的指针

    ptag:协议标签,第一次分组新包时,这里写0,同一个应用,下次分组新包时,写这个位置的值作为这个函数的返回值。

    返回值:

    成功:协议令牌

    失败:-1

    libnet_ptag_t libnet_build_ipv4_options(

    u_int8_t*选项,u_int32_t 选项,

    libnet_t*l, libnet_ptag_t ptag);

    特征:

    构造 IPv4 选项包

    范围:

    选项:tcp 选项字符串

    options_s:选项长度

    l:libnet句柄,libnet * libnet_init()返回的指针

    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 *有效载荷,

    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 * libnet_init()返回的指针

    ptag:协议标签,第一次分组新包时,这里写0,同一个应用,下次分组新包时,写这个位置的值作为这个函数的返回值。

    返回值:

    成功:协议令牌

    失败:-1

    libnet_ptag_t libnet_build_ethernet(

    u_int8_t*dst,u_int8_t *src,

    u_int16_ttype,u_int8_t*有效载荷,

    u_int32_tpayload_s、libnet_t*l、

    libnet_ptag_t ptag );

    特征:

    构造以太网数据包

    范围:

    dst:目标mac

    src:源mac

    type:上层协议类型

    payload:payload,也就是附加的数据,可以设置为NULL(这里一般写NULL)

    payload_s:有效载荷长度,或者0(这里一般写0)

    l:libnet句柄,libnet * libnet_init()返回的指针

    ptag:协议标签,第一次分组新包时,这里写0,同一个应用,下次分组新包时,写这个位置的值作为这个函数的返回值。

    返回值:

    成功:协议令牌

    失败:-1

    int libnet_write(libnet_t *l);

    特征:

    发送数据包

    范围:

    l:libnet句柄,libnet * libnet_init()返回的指针

    返回值:

    成功:发送数据包的长度

    失败:返回-1

    使用示例

    #include 
    #include 
    #include 
    #include 
    #include 
    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;
    编译代码时,需要加上 -lnet:

    站内大部分资源收集于网络,若侵犯了您的合法权益,请联系我们删除!
    欧资源网 » libnet的安装流程利用libnet函数库开发应用程序的基本步骤利用

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    欧资源网
    一个高级程序员模板开发平台

    发表评论