Qt开发网络嗅探器03

数据包分析

想要知道如何解析IP数据包,就要知道不同的IP数据包的包头结构,于是我们上⽹查查资料:

以太网数据包

ARP数据包

在这里插入图片描述

IPv4

IPv6

在这里插入图片描述

TCP

在这里插入图片描述

UDP

在这里插入图片描述

ICMP

在这里插入图片描述

ICMPv6

在这里插入图片描述
根据以上数据包头结构,我们就有了我们的protocol.h文件,声明各种数据包:

#ifndef PROTOCOL_H
#define PROTOCOL_H
#define HAVE_REMOTE
#define PROTO_ICMP 1
#define PROTO_TCP 6
#define PROTO_UDP 17
#include <iostream>
#include <QObject>
#include "_bsd_types.h"
#include "pcap.h"
using namespace std;
//IPV4
typedef struct ip_address{
    u_char byte1;
    u_char byte2;
    u_char byte3;
    u_char byte4;
}ip_address;

typedef struct ipv6_address
{
    u_char byte1;
    u_char byte2;
    u_char byte3;
    u_char byte4;
    u_char byte5;
    u_char byte6;
    u_char byte7;
    u_char byte8;
}ipv6_address;

typedef struct ipv4_header{
    u_char ver_ihl;
    u_char tos;
    u_short tlen;
    u_short Identification;
    u_short flags_fo;
    u_char ttl;
    u_char proto;
    u_short crc;
    ip_address srcaddr;
    ip_address dstaddr;
    u_int op_pad;
}ipv4_header;

typedef struct ipv6_header{
    u_int ver:4,
        flowtype:8,
        flowtip:20;
    u_short len;
    u_char pnext;
    u_char lim;
    ipv6_address srcaddr;
    ipv6_address dstaddr;
}ipv6_header;

typedef struct tcp_header{
    u_short srcport;
    u_short dstport;
    u_int seq;
    u_int ack_seq;
    u_short resl:4,
        doff:4,
        fin:1,
        syn:1,
        pst:1,
        psh:1,
        ack:1,
        urg:1,
        ece:1,
        cwr:1;
    u_short window;
    u_short check;
    u_short urg_ptr;
    u_int opt;
}tcp_header;

typedef struct udp_header{
    u_short srcport;
    u_short dstport;
    u_short tlen;
    u_short crc;
}udp_header;

typedef struct icmp_header{
    u_char type;
    u_char code;
    u_char seq;
    u_char crc;
}icmp_header;

typedef struct icmp6_header{
    u_char type;
    u_char code;
    u_char seq;
    u_char crc;
    u_char op_type;
    u_char op_len;
    u_char op_ethaddr[6];
}icmp6_header;

typedef struct pkg_count{
    int n_tcp;
    int n_udp;
    int n_icmp;
    int n_icmp6;
    int n_http;
    int n_arp;
    int n_ipv4;
    int n_ipv6;
    int n_other;
    int n_ttl;
}pkg_count;

typedef struct arp_header{
    u_short hardware;
    u_short proto;
    u_char ml;
    u_char ipl;
    u_short opt;
    u_char sm[6];
    ip_address sip;
    u_char dm[6];
    ip_address dip;
}arp_hearder;

typedef struct eth_header{
    u_char smac[6];
    u_char dmac[6];
    u_short type;
}eth_header;

typedef struct pkg_data
{
    QString pkgtype;
    int time[6];
    int len;
    
    eth_header *ethh;
    
    ipv4_header *ipv4h;
    ipv6_header *ipv6h;
    arp_header *arph;
    
    udp_header *udph;
    tcp_header *tcph;
    icmp_header *icmph;
    icmp6_header *icmp6;

    void *apph;
    
}pkg_data;




#endif // PROTOCOL_H

再对数据包的结构进行了解后,我们就需要对这些包进行解析,所以我们需要一个packettools类,里面用静态函数写出包的解析,供我们在别的地方调用:

#ifndef PACKETTOOLS_H
#define PACKETTOOLS_H
#include <QObject>
#include <QTextEdit>
#include "protocol.h"
#include "iostream"

using namespace std;

class PacketTools
{
public:
    static int unpcak_Frame(const u_char *pkg,
                             pkg_data *data,
                             pkg_count *pkgCnts);


    static int unpcak_Arp(const u_char *pkg,
                           pkg_data *data,
                           pkg_count *pkgCnts);

    static int unpack_Ip(const u_char *pkg,
                          pkg_data *data,
                          pkg_count *pkgCnts);

    static int unpack_Ipv6(const u_char *pkg,
                           pkg_data *data,
                           pkg_count *pkgCnts);

    static int unpack_Icmp(const u_char *pkg,
                            pkg_data *data,
                            pkg_count *pkgCnts);

    static int unpack_Icmp6(const u_char *pkg,
                            pkg_data *data,
                            pkg_count *pkgCnts);

    static int unpack_Tcp(const u_char *pkg,
                           pkg_data *data,
                           pkg_count *pkgCnts);

    static int unpack_Udp(const u_char *pkg,
                           pkg_data *data,
                           pkg_count *pkgCnts);

    static int pack_Print(u_char *pkg,
                           int size,
                          QTextEdit *edit);
};

#endif // PACKETTOOLS_H

主要一点就是要知道父类数据包的type字段对子类数据包的分类,然后将数据包拷贝储存到全局容器里面。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/842869.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

node解析Excel中的考试题并实现在线做题功能

1、背景 最近公司安排业务技能考试&#xff0c;下发excel文件的题库&#xff0c;在excel里查看并不是很方便&#xff0c;就想着像学习驾考题目一样&#xff0c;一边看一边做&#xff0c;做完之后可以查看正确答案。 2、开始分析需求 题目格式如下图 需求比较简单&#xff0c;…

配置RIPv2的认证

目录 一、配置IP地址、默认网关、启用端口 1. 路由器R1 2. 路由器R2 3. 路由器R3 4. Server1 5. Server2 二、搭建RIPv2网络 1. R1配置RIPv2 2. R2配置RIPv2 3. Server1 ping Server2 4. Server2 ping Server1 三、模拟网络攻击&#xff0c;为R3配置RIPv2 四、在R…

ExoPlayer架构详解与源码分析(15)——Renderer

系列文章目录 ExoPlayer架构详解与源码分析&#xff08;1&#xff09;——前言 ExoPlayer架构详解与源码分析&#xff08;2&#xff09;——Player ExoPlayer架构详解与源码分析&#xff08;3&#xff09;——Timeline ExoPlayer架构详解与源码分析&#xff08;4&#xff09;—…

拖拽上传(预览图片)

需求 点击上传图片&#xff0c;或直接拖拽图片到红色方框里面也可上传图片&#xff0c;上传后预览图片 效果 实现 <!DOCTYPE html> <html lang"zh-cn"><head><meta charset"UTF-8"><meta name"viewport" content&…

【safari】react在safari浏览器中,遇到异步时间差的问题,导致状态没有及时更新到state,引起传参错误。如何解决

在safari浏览器中&#xff0c;可能会遇到异步时间差的问题&#xff0c;导致状态没有及时更新到state&#xff0c;引起传参错误。 PS&#xff1a;由于useState是一个普通的函数&#xff0c; 定义为() > void;因此此处不能用await/async替代setTimeout&#xff0c;只能用在返…

价格较低,功能最强?OpenAI 推出 GPT-4o mini,一个更小、更便宜的人工智能模型

OpenAI美东时间周四推出“GPT-4o mini”&#xff0c;入局“小而精”AI模型竞争&#xff0c;称这款新模型是“功能最强、成本偏低的模型”&#xff0c;计划今后整合图像、视频、音频到这个模型中。 OpenAI表示&#xff0c;GPT-4o mini 相较于 OpenAI 目前最先进的 AI 模型更加便…

51单片机(STC8H8K64U/STC8051U34K64)_RA8889驱动TFT大屏_I2C_HW参考代码(v1.3) 硬件I2C方式

本篇介绍单片机使用硬件I2C方式控制RA8889驱动彩屏。 提供STC8H8K64U和STC8051U34K64的参考代码。 【硬件部份】STC8H8K64U/STC8051U34K64 RA8889开发板 7寸TFT 800x480 1. 实物连接图&#xff1a;STC8H8K64URA8889开发板&#xff0c;使用P2口I2C接口&#xff1a; 2.实物连…

ISP代理和双ISP代理:区别和优势

随着互联网技术的不断发展和普及&#xff0c;网络代理服务成为众多用户保护隐私、提高网络性能、增强安全性的重要工具。其中&#xff0c;ISP代理和双ISP代理是两种常见的网络代理服务形式。本文将详细探讨ISP代理和双ISP代理的区别和优势&#xff0c;以便用户更好地了解并选择…

【LeetCode】填充每个节点的下一个右侧节点指针 II

目录 一、题目二、解法完整代码 一、题目 给定一个二叉树&#xff1a; struct Node { int val; Node *left; Node *right; Node *next; } 填充它的每个 next 指针&#xff0c;让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点&#xff0c;则将 next 指针设置为 NUL…

MySQL学习作业二

作业描述 SQL语言 建库&#xff0c;使用库 mysql> create database mydb8_worker;#新建库mysql> use mydb8_worker; 建表&#xff0c;查看表 #建表 mysql> create table t_worker(department_id int(11) not null comment部门号,worker_id int(11) primary key no…

Flink History Server配置

目录 问题复现 History Server配置 HADOOP_CLASSPATH配置 History Server配置 问题修复 启动flink集群 启动Histroty Server 问题复现 在bigdata111上执行如下命令开启socket&#xff1a; nc -lk 9999 如图&#xff1a; 在bigdata111上执行如下命令运行flink应用程序 …

使用IDEA编写lua脚本并运行

下载lua https://github.com/rjpcomputing/luaforwindows/releases 是否创建桌面快捷方式&#xff1a;我们的目标是使用IDEA编写lua脚本&#xff0c;所以不需要勾选。后面需要的话&#xff0c;可以到安装目录下手动创建快捷方式 环境变量自动配置 安装后会自动配置好环境变量…

影响转化率的多元因素分析及定制开发AI智能名片S2B2C商城系统小程序的应用案例

摘要&#xff1a;在互联网时代&#xff0c;转化率是衡量营销活动成功与否的关键指标。本文首先分析了影响转化率的多种因素&#xff0c;包括活动页面的设计、活动的限时性、主题文案的吸引力、从众心理的运用&#xff0c;以及最核心的产品质量与优惠力度。接着&#xff0c;本文…

PyTorch深度学习实战——使用深度Q学习进行Pong游戏

PyTorch深度学习实战——使用深度Q学习进行Pong游戏 0. 前言1. 结合固定目标网络的深度 Q 学习模型1.1 模型输入1.2 模型策略 2. 实现深度 Q 学习进行 Pong 游戏相关链接 0. 前言 我们已经学习了如何利用深度 Q 学习来进行 Gym 中的 CartPole 游戏。在本节中&#xff0c;我们将…

Redis之List列表

目录 一.列表讲解 二.列表命令 三.内部编码 四.应用场景 Redis的学习专栏&#xff1a;http://t.csdnimg.cn/a8cvV 一.列表讲解 列表类型是用来存储多个有序的字符串&#xff0c;如下所示&#xff0c;a、b、c、d、e五个元素从左到右组成了一个有序的列表&#xff0c;列表中的…

git使用、git与idea结合、gitee、gitlab

本文章基于黑马程序javase模块中的"git"部分 先言:git在集成idea中,不同版本的idea中页面显示不同,操作时更注重基于选项的文字;git基于命令操作参考文档实现即可,idea工具继承使用重点掌握 1.git概述 git是目前世界上最先进的分布式文件版本控制系统 分布式:将…

快手矩阵系统全解析:功能、优势与特点一网打尽

在数字化时代&#xff0c;短视频已成为连接创作者与观众的重要媒介。快手矩阵系统以其独特的功能和优势&#xff0c;为短视频的创作、管理和发布提供了一站式解决方案&#xff0c;极大地提升了内容运营的效率和效果。 功能概览 智能创作&#xff1a;AI技术的应用使得快手矩阵…

ELK日志管理与应用

目录 一.ELK收集nginx日志 二.收集tomcat日志 三.Filebeat 一.ELK收集nginx日志 1.搭建好ELKlogstashkibana架构 2.关闭防火墙和selinux systemctl stop firewalld setenforce 0 3.安装nginx [rootlocalhost ~]# yum install epel-release.noarch -y [rootlocalhost …

因果推断 | 双重机器学习(DML)算法原理和实例应用

文章目录 1 引言2 DML算法原理2.1 问题阐述2.2 DML算法 3 DML代码实现3.1 策略变量为0/1变量3.2 策略变量为连续变量 4 总结5 相关阅读 1 引言 小伙伴们&#xff0c;好久不见呀。 距离上次更新已经过去了一个半月&#xff0c;上次发文章时还信誓旦旦地表达自己后续目标是3周更…

elementUI在手机端使用遇到的问题总结

之前的博客有写过用vue2elementUI封装手机端选择器picker组件&#xff0c;支持单选、多选、远程搜索多选&#xff0c;最终真机调试的时候发现有很多细节样式需要调整。此篇博客记录下我调试过程中遇到的问题和解决方法。 一、手机真机怎么连电脑本地代码调试&#xff1f; 1.确…