当前位置: 首页 > news >正文

网络报文分析程序的设计与实现(2024)

1.题目描述

在上一题的基础上,参照教材中各层报文的头部结构,结合使用 wireshark 软件(下载地址 https://www.wireshark.org/download.html#releases)观察网络各层报文捕获,解析和分析的过程(如下 图所示),尝试编写一个网络报文的解析程序。


2.演示Demo

设备选择


3.导入WinPcap三方库到项目

(博主用的是Clion,若是VC,CodeBlocks,Dev-C等导入方式大同小异)

首先下载: 文件https://www.winpcap.org/install/bin/WpdPack_4_1_2.zip

解压到项目路径下:

在CMakeLists.txt修改成下面代码:(连接第三方库WinPcap):

cmake_minimum_required(VERSION 3.27)
project(Problem08)
set(CMAKE_CXX_STANDARD 17)include_directories("./Include")  #导入.h头文件link_directories("./Lib/x64")     #导入.a库文件(./Lib/x64是64位  ./Lib 是32位机器使用)link_libraries(Packet wpcap  ws2_32)  #导入wpcap,ws2_32库文件add_executable(Problem08 main.cpp)target_link_libraries(Problem08 Packet wpcap) #连接wpcap,ws2_32库文件

刷新项目 :

成功运行 


4.参考代码

#define HAVE_REMOTE
#define LINE_LEN 16
#define IPPROTO_ICMP 1 /* control message protocol */
#define IPPROTO_TCP  6 /* tcp */
#define IPPROTO_UDP 17 /* user datagram protocol */#include <WinSock2.h>
#include <algorithm>
#include <string>
#include <cstdio>
#include <pcap.h>
#include <sys/time.h>
#include <iostream>
#pragma comment(lib, "ws2_32.lib")using namespace std;typedef struct ip_address { //ip地址u_char b1;u_char b2;u_char b3;u_char b4;
} ip_address;typedef struct mac_address {//mac地址u_char b1;u_char b2;u_char b3;u_char b4;u_char b5;u_char b6;
} mac_address;typedef struct ethe_header { //mac帧首部mac_address mac_dest_address;mac_address mac_source_address;u_short ether_type;
} ethe_header;typedef struct ip_header { //ip地址首部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 saddr;ip_address daddr;u_int op_pad;
} ip_header;typedef struct udp_header { //UPD首部u_short sport;u_short dport;u_short len;u_short crc;
} udp_header;typedef struct tcp_header { //TCP首部u_short sport;u_short dport;u_int num;u_int ack;u_short sum;u_short windonw;u_short crc;u_short ugr;
} tcp_header;//------------------------------------------------
void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data);void cls();void Sync_NetData();
void GotoXY(int x, int y) ; // 移动
//-----------------------------------------------
char judge;
int length;
long NeedPacket = 999;
long NowPacket = 0;
//变量--------------------------------------------long Now_Y=10;long Tcp_Num = 0;
long Udp_Num = 0;
long ICMP_Num = 0;
long Tcp_Size = 0;
long ICMP_Size = 0;
long Udp_Size = 0;//-----------------------------------------------
int main() {cout << " *============网络报文分析程序的设计与实现Demo============*" << endl << endl;pcap_if_t *alldevs, *device;int i = 0;int iNum;u_int netmask;struct bpf_program fcode;pcap_t *adhandle;char errbuf[PCAP_ERRBUF_SIZE];//修改这里可以更改捕获的数据包使用的协议类型char packet_filter[] = "(ip and udp) or (ip and tcp) or (ip and icmp)";//获取设备列表if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1) {fprintf(stderr, "无法打开网络设备:%s\n", errbuf);return 1;}for (device = alldevs; device != NULL; device = device->next) { //打印列表if (i == 0) {printf("------------------------------网络设备-------------------------------\n");}if (device->description)printf(" 序号:%d (%s)\n", ++i, device->description);else {i++;printf("没有设备描述信息!");}}printf("-------------------------------------------------------------------\n");if (i == 0) {printf("\n请先安装WinPcap!");return -1;}printf("\n #请选择网络设备接口:(1 - %d):", i);scanf("%d", &iNum);getchar();if (iNum < 1 || iNum > i) {printf("设备不存在!\n");pcap_freealldevs(alldevs);return -1;}//跳转到已选设备for (device = alldevs, i = 0; i < iNum - 1; device = device->next, i++);// 打开适配器if ((adhandle = pcap_open(device->name,  // 设备名65536,     // 要捕捉的数据包的部分// 65535保证能捕获到不同数据链路层上的每个数据包的全部内容PCAP_OPENFLAG_PROMISCUOUS,         // 混杂模式1000,      // 读取超时时间NULL,      // 远程机器验证errbuf     // 错误缓冲池)) == NULL) {fprintf(stderr, "\n不能打开适配器!\n");/* 释放设备列表 */pcap_freealldevs(alldevs);return -1;}if (pcap_datalink(adhandle) != DLT_EN10MB) { //检查数据链路层,为了简单,只考虑以太网fprintf(stderr, "\n系统网卡链路出错!\n");pcap_freealldevs(alldevs); //释放设备列表return -1;}if (device->addresses != NULL) //获得接口第一个地址的掩码netmask = ((struct sockaddr_in *) (device->addresses->netmask))->sin_addr.S_un.S_addr;else //如果接口没有地址,那么我们假设一个C类的掩码netmask = 0xffff00;if (pcap_compile(adhandle, &fcode, packet_filter, 1, netmask) < 0) { //编译过滤器fprintf(stderr, "不能监听过滤该数据报!\n");pcap_freealldevs(alldevs);return -1;}if (pcap_setfilter(adhandle, &fcode) < 0) { //设置过滤器fprintf(stderr, "过滤设置错误!\n");pcap_freealldevs(alldevs);return -1;}cout << " #请输入抓包数量:";cin >> NeedPacket;printf("\n\n 正在监听%s的数据报...\n\n", device->description);pcap_freealldevs(alldevs); //释放设备列表system("cls");pcap_loop(adhandle, NeedPacket, packet_handler, NULL); //开始捕捉GotoXY(0,Now_Y);cout << endl << " * 嗅探结束 " << endl << endl;system("pause");return 0;
}void packet_handler(u_char *dumpfile, const struct pcap_pkthdr *header,const u_char *pkt_data) { //回调函数,当收到每一个数据包时会被libpcap所调用if (header->caplen > 400) return;int len;struct tm *ltime;char timestr[16];ip_header *ip_hd,ip_hd_ok;udp_header *udp_hd;tcp_header *tcp_hd;ethe_header *ethe_hd;int ip_len, tcp_len, start;u_short sport, dport;string  Type_net;char now[64];struct tm *ttime;time_t tt;tt = header->ts.tv_sec;ttime = localtime(&tt);strftime(now, 64, "%Y-%m-%d %H:%M:%S", ttime);// printf("时间:%s\n", now);ethe_hd = (ethe_header *) pkt_data;ip_hd = (ip_header *) (pkt_data + 14);ip_hd_ok=*ip_hd;ip_len = (ip_hd_ok.ver_ihl & 0xf) * 4; //ip首部长度udp_hd = (udp_header *) ((u_char *) ip_hd + ip_len);sport = ntohs(udp_hd->sport);dport = ntohs(udp_hd->dport);if (ip_hd_ok.proto == IPPROTO_UDP) {Type_net="UDP";start = ip_len + 8;Udp_Num++;Udp_Size += header->caplen;} else if (ip_hd_ok.proto == IPPROTO_TCP) {Type_net="TCP";Tcp_Num++;Tcp_Size += header->caplen;tcp_hd = (tcp_header *) ((u_char *) ip_hd + ip_len);tcp_len = ntohs(tcp_hd->sum) >> 12;start = ip_len + tcp_len * 4;} else if (ip_hd_ok.proto == IPPROTO_ICMP) {Type_net="ICMP";start = ip_len + 23;ICMP_Num++;ICMP_Size += header->caplen;}GotoXY(0,Now_Y);printf("数据类型: %s\t""源IP地址: %d.%d.%d.%d:%d\t""目的IP地址: %d.%d.%d.%d:%d\t""目的物理地址: %x-%x-%x-%x-%x-%x\n",Type_net.c_str(),ip_hd->saddr.b1, ip_hd->saddr.b2, ip_hd->saddr.b3, ip_hd->saddr.b4,sport,ip_hd->daddr.b1, ip_hd->daddr.b2, ip_hd->daddr.b3, ip_hd->daddr.b4, dport,ethe_hd->mac_dest_address.b1, ethe_hd->mac_dest_address.b2, ethe_hd->mac_dest_address.b3,ethe_hd->mac_dest_address.b4, ethe_hd->mac_dest_address.b5, ethe_hd->mac_dest_address.b6);Now_Y++;Sync_NetData();//更新网络
}//更新数据
void Sync_NetData() {cls();cout << " *==========网络报文分析程序的设计与实现Demo==========*" << endl;cout << endl << " 捕获网络报文分析:------------------------" << endl;cout << "\tTCP包数量:" << Tcp_Num << " 个" << endl;cout << "\tUDP包数量:" << Udp_Num << " 个" << endl;cout << "\tICMP包数量:" << ICMP_Num << " 个" << endl;cout << "\t捕获TCP包的总大小:" << Tcp_Size / 1024 << "KB" << endl;cout << "\t捕获UDP包的总大小:" << Udp_Size / 1024 << "KB" << endl;cout << "\t捕获ICMP包的总大小:" << ICMP_Size / 1024 << "KB" << endl;cout << " -------------------------------------" << endl;}//清屏函数
void cls() {COORD pos;HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);pos.Y = pos.X = 0;SetConsoleCursorPosition(hOut, pos);
}
void GotoXY(int x, int y)  // 移动
{COORD pos;HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);pos.Y =y; pos.X = x;SetConsoleCursorPosition(hOut, pos);
}

 2024 HNUST计算机网络课程设计-(ᕑᗢᓫ∗)˒芒果酱-参考文章

代码可以参考,૮₍ ˃ ⤙ ˂ ₎ა 但同学们要认真编写哦
-------------------------------------------------------------------------
1、网络聊天程序的设计与实现
C++ Socket 多线程 网络聊天室 支持用户端双向交流(2023)-CSDN博客
2、Tracert 与 Ping 程序设计与实现
Tracert 与 Ping 程序设计与实现(2024)-CSDN博客
3、滑动窗口协议仿真
滑动窗口协议仿真(2024)-CSDN博客
4、OSPF 路由协议原型系统设计与实现
OSPF 路由协议原型系统设计与实现-CSDN博客
5、基于 IP 多播的网络会议程序
基于 IP 多播的网络会议程序(2024)-CSDN博客
6、编程模拟 NAT 网络地址转换
编程模拟 NAT 网络地址转换(2024)-CSDN博客
7、网络嗅探器的设计与实现
网络嗅探器的设计与实现(2024)-转载-CSDN博客
8、网络报文分析程序的设计与实现
网络报文分析程序的设计与实现(2024)-CSDN博客
9、简单 Web Server 程序的设计与实现
简单 Web Server 程序的设计与实现 (2024)-CSDN博客
10、路由器查表过程模拟

计算机网络 - 路由器查表过程模拟 C++(2024)-CSDN博客

相关文章:

网络报文分析程序的设计与实现(2024)

1.题目描述 在上一题的基础上&#xff0c;参照教材中各层报文的头部结构&#xff0c;结合使用 wireshark 软件&#xff08;下载地址 https://www.wireshark.org/download.html#releases&#xff09;观察网络各层报文捕获&#xff0c;解析和分析的过程&#xff08;如下 图所示&a…...

贯穿设计模式-享元模式思考

写享元模式的时候&#xff0c;会想使用ConcurrentHashMap来保证并发&#xff0c;没有使用双重锁会不会有问题&#xff1f;但是在synchronize代码块里面需要尽量避免throw异常&#xff0c;希望有经验的同学能够给出解答&#xff1f; 1月6号补充&#xff1a;没有使用双重锁会有问…...

牛客刷题:BC45 小乐乐改数字(中等)

自我介绍&#xff1a;一个脑子不好的大一学生&#xff0c;c语言接触还没到半年&#xff0c;若涉及到效率等问题&#xff0c;各位都可以在评论区提出见解&#xff0c;谢谢啦。 该账号介绍&#xff1a;此帐号会发布游戏&#xff08;目前还只会简单小游戏&#xff09;&#xff0c…...

设计模式学习2

代理模式&#xff1a;Proxy 动机 “增加一层间接层”是软件系统中对许多复杂问题的一种常见解决方案。在面向对象系统中&#xff0c;直接食用某些对象会带来很多问题&#xff0c;作为间接层的proxy对象便是解决这一问题的常见手段。 2.伪代码&#xff1a; class ISubject{ pu…...

Rust:如何判断位置结构的JSON串的成员的数据类型

如何判断位置结构的JSON串的成员的数据类型&#xff0c;给一个Rust的例子&#xff0c;其中包含对数组的判断&#xff1f; 在Rust中&#xff0c;你可以使用serde_json库来处理JSON数据&#xff0c;并通过serde_json::Value类型的方法来判断JSON串中成员的数据类型。以下是一个示…...

Kafka(五)生产者

目录 Kafka生产者1 配置生产者bootstrap.serverskey.serializervalue.serializerclient.id""acksallbuffer.memory33554432(32MB)compression.typenonebatch.size16384(16KB)max.in.flight.requests.per.connection5max.request.size1048576(1MB)receive.buffer.byte…...

【Leetcode】242.有效的字母异位词

一、题目 1、题目描述 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。 示例1: 输入: s = "anagram", t = "nagaram" 输出: true示例2: 输入: …...

【数据库原理】(16)关系数据理论的函数依赖

一.函数依赖的概念 函数依赖是关系数据库中核心的概念&#xff0c;它指的是在属性集之间存在的一种特定的关系。这种关系表明&#xff0c;一个属性集的值可以唯一确定另一个属性集的值。 属性子集&#xff1a;在关系模式中&#xff0c;X和Y可以是单个属性&#xff0c;也可以是…...

脆弱的SSL加密算法漏洞原理以及修复方法

漏洞名称&#xff1a;弱加密算法、脆弱的加密算法、脆弱的SSL加密算法、openssl的FREAK Attack漏洞 漏洞描述&#xff1a;脆弱的SSL加密算法&#xff0c;是一种常见的漏洞&#xff0c;且至今仍有大量软件支持低强度的加密协议&#xff0c;包括部分版本的openssl。其实&#xf…...

SVN迁移至GitLab,并附带历史提交记录(二)

与《SVN迁移至GitLab&#xff0c;并附带历史提交记录》用的 git svn clone不同&#xff0c;本文使用svn2git来迁移项目代码。 一、准备工作 安装Git环境&#xff0c;配置本地git账户信息&#xff1a; git config --global user.name "XXX" git config --global us…...

如何创建容器搭建节点

1.注册Discord账号 https://discord.com/这是登录网址: https://discord.com/ 2.点击startnow注册,用discord注册或者邮箱注册都可,然后登录tickhosting Tick Hosting这是登录网址:Tick Hosting 3.创建servers 4.点击你创建的servers,按照图中步骤进行...

微众区块链观察节点的架构和原理 | 科普时间

践行区块链公共精神&#xff0c;实现更好的公众开放与监督&#xff01;2023年12月&#xff0c;微众区块链观察节点正式面向公众开放接入功能。从开放日起&#xff0c;陆续有多个观察节点在各地运行&#xff0c;同步区块链数据&#xff0c;运行区块链浏览器观察检视数据&#xf…...

React Admin 前端脚手架之ant-design-pro

文章目录 一、React Admin 前端脚手架选型二、React Admin 前端脚手架之ant-design-pro三、ant-design-pro使用步骤四、调试主题五、常用总结(持续更新)EditableProTable组件 常用组件EditableProTable组件 编辑某行后,保存时候触发发送请求EditableProTable组件,添加记录提…...

向爬虫而生---Redis 基石篇1 <拓展str>

前言: 本来是基于scrapy-redis进行讲解的,需要拓展一下redis; 包含用法,设计,高并发,阻塞等; 要应用到爬虫开发中,这些基础理论我觉得还是有必要了解一下; 所以,新开一栏! 把redis这个环节系统补上,再转回去scrapy-redis才好深入; 正文: Redis是一种内存数据库&#xff0c…...

【野火i.MX6ULL开发板】利用microUSB线烧入Debian镜像

0、前言 烧入Debian镜像有两种方式&#xff1a;SD卡、USB SD卡&#xff1a;需要SD卡&#xff08;不是所有型号都可以&#xff0c;建议去了解了解&#xff09;、SD卡读卡器 USB&#xff1a;需要microUSB线 由于SD卡的网上资料很多了&#xff0c;又因为所需硬件&#xff08;SD卡…...

“我在大A炒自己”

嘻嘻嘻&#xff0c;大伙儿好像还挺喜欢我闲聊&#xff0c;今天太忙&#xff0c;没得空精进技术&#xff0c;那咱还是接着闲聊吧&#x1f602;&#x1f602; 看到标题点进来的各位大A真爱粉&#xff0c;请先收下我的崇高敬意&#xff01;&#xff01;别误会&#xff0c;标题说的…...

js 颜色转换,RGB颜色转换为16进制,16进制颜色转为RGB格式

颜色转换&#xff0c;RGB颜色转换为16进制,16进制颜色转为RGB格式&#xff0c;可以自己设置透明度。 //十六进制颜色值的正则表达式 var reg /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/; /*RGB颜色转换为16进制*/ String.prototype.colorHex function () {var that this;if (/^…...

uniapp中用户登录数据的存储方法探究

Hello大家好&#xff01;我是咕噜铁蛋&#xff01;作为一个博主&#xff0c;我们经常需要在应用程序中实现用户登录功能&#xff0c;并且需要将用户的登录数据进行存储&#xff0c;以便在多次使用应用程序时能够方便地获取用户信息。铁蛋通过科技手段帮大家收集整理了些知识&am…...

引导过程与服务控制

文章目录 一、Linux操作系统引导过程1、开机启动的完整过程1.1 开机自检&#xff08;BIOS&#xff09;1.2 MBR引导1.3 GRUB菜单1.4 加载内核&#xff08;kernel&#xff09;1.5 init进程初始化 2、系统初始化进程2.1 init进程2.2 systemdinit与systemd区别 3、Systemd单元类型4…...

《矩阵分析》笔记

来源&#xff1a;【《矩阵分析》期末速成 主讲人&#xff1a;苑长&#xff08;5小时冲上90&#xff09;】https://www.bilibili.com/video/BV1A24y1p76q?vd_sourcec4e1c57e5b6ca4824f87e74170ffa64d 这学期考矩阵论&#xff0c;使用教材是《矩阵论简明教程》&#xff0c;因为没…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

STM32HAL库USART源代码解析及应用

STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 &#xff1a;主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 &#xff1a;确保数据的完整性&#xff0c;便于数据的查询和管理。 示例 &#xff1a;在学生信息表中&#xff0c;学号可以作为主键&#xff…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言&#xff1a; 双亲委派机制对于面试这块来说非常重要&#xff0c;在实际开发中也是经常遇见需要打破双亲委派的需求&#xff0c;今天我们一起来探索一下什么是双亲委派机制&#xff0c;在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言&#xff1a; 类加载器 1. …...

JDK 17 序列化是怎么回事

如何序列化&#xff1f;其实很简单&#xff0c;就是根据每个类型&#xff0c;用工厂类调用。逐个完成。 没什么漂亮的代码&#xff0c;只有有效、稳定的代码。 代码中调用toJson toJson 代码 mapper.writeValueAsString ObjectMapper DefaultSerializerProvider 一堆实…...

Java并发编程实战 Day 11:并发设计模式

【Java并发编程实战 Day 11】并发设计模式 开篇 这是"Java并发编程实战"系列的第11天&#xff0c;今天我们聚焦于并发设计模式。并发设计模式是解决多线程环境下常见问题的经典解决方案&#xff0c;它们不仅提供了优雅的设计思路&#xff0c;还能显著提升系统的性能…...

SQL注入篇-sqlmap的配置和使用

在之前的皮卡丘靶场第五期SQL注入的内容中我们谈到了sqlmap&#xff0c;但是由于很多朋友看不了解命令行格式&#xff0c;所以是纯手动获取数据库信息的 接下来我们就用sqlmap来进行皮卡丘靶场的sql注入学习&#xff0c;链接&#xff1a;https://wwhc.lanzoue.com/ifJY32ybh6vc…...