网络报文分析程序的设计与实现(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博客

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux基础】Linux主要指令的详解(指令补充)

1.cp指令&#xff08;重要&#xff09; 语法&#xff1a; cp [选项] 源文件或目录 目标文件或目录 功能: 复制文件或目录 说明: cp指令用于复制文件或目录&#xff0c;如同时指定两个以上的文件或目录&#xff0c;且最后的目的地是一个已经存在的目录&#xff0c;则它会把前面指…

pytorch集智-2单车预测器

完整代码在个人主页简介链接pytorch路径下可找到 1 单车预测器1.0 1.1 人工神经元 对于sigmoid函数来说&#xff0c;w控制函数曲线的方向&#xff0c;b控制曲线水平方向位移&#xff0c;w控制曲线在y方向的幅度 1.2 多个人工神经元 模型如下 数学上可证&#xff0c;有限神经…

Linux查找命令@which、find

目录 which概念语法作用 find概念语法按文件名查找按文件大小查找 作用演示一演示二演示三 通配符 which 概念 which 是一个常用的 Linux/Unix 命令&#xff0c;用于查找并显示指定命令的绝对路径。 语法 which 要查找的命令 》无参数。 》 which后面&#xff0c;跟要查找绝对…

【CentOS 7.9】死机卡住如何处理

一、解决办法 1.打开tty2 按下组合键&#xff1a;ctrl alt F2 进入 tty2 2.进入 root 权限 su root3.杀死该用户的所有进程&#xff08;相当于 windows 里面的注销用户&#xff09; 请注意&#xff0c;用户名应该全部使用小写字母&#xff0c;如我的用户名叫 Ragdoll&am…

摄像头视频录制程序使用教程(Win10)

摄像头视频录制程序-Win10 &#x1f957;介绍&#x1f35b;使用说明&#x1f6a9;config.json 说明&#x1f6a9;启动&#x1f6a9;关闭&#x1f6a9;什么时候开始录制&#xff1f;&#x1f6a9;什么时候触发录制&#xff1f;&#x1f6a9;调参 &#x1f957;介绍 检测画面变化…

Javaweb之Mybatis的基础操作之查询操作的详细解析

1.6 查询 1.6.1 根据ID查询 在员工管理的页面中&#xff0c;当我们进行更新数据时&#xff0c;会点击 “编辑” 按钮&#xff0c;然后此时会发送一个请求到服务端&#xff0c;会根据Id查询该员工信息&#xff0c;并将员工数据回显在页面上。 SQL语句&#xff1a; select id,…

大型语言模型的幻觉问题

1.什么是大模型幻觉&#xff1f; 在语言模型的背景下&#xff0c;幻觉指的是一本正经的胡说八道&#xff1a;看似流畅自然的表述&#xff0c;实则不符合事实或者是错误的。 幻觉现象的存在严重影响LLM应用的可靠性&#xff0c;本文将探讨大型语言模型(LLMs)的幻觉问题&#x…

求两个数之间的最小公约数

目录 前言 方法&#xff1a;求两个数之间的最小公约数 1.欧几里得算法 2.枚举法 3.公共因子积 4.更相减损术 5.Stein算法 解题&#xff1a;在链表中插入最大公约数 总结 前言 今天刷每日一题&#xff1a;2807. 在链表中插入最大公约数 - 力扣&#xff08;LeetCode&#xff09;…

基于X86的助力智慧船载监控系统

船载综合监控系统结合雷达、AIS、CCTV、GPS等探测技术&#xff0c;以及高度融合的实时态势与认知技术&#xff0c;实现对本船以及范围内船舶的有效监控&#xff0c;延伸岸基监控中心监管范围&#xff0c;保障行船安全&#xff0c;为船舶安全管理部门实现岸基可控的数据通信和动…

第 121 场 LeetCode 双周赛题解

A 大于等于顺序前缀和的最小缺失整数 模拟&#xff1a;先求最长顺序前缀的和 s s s &#xff0c;然后从 s s s 开始找没有出现在 n u m s nums nums 中的最小整数 class Solution { public:int missingInteger(vector<int> &nums) {unordered_set<int> vis(…

如何批量自定义视频画面尺寸

在视频制作和编辑过程中&#xff0c;对于视频画面尺寸的调整是一项常见的需求。有时候&#xff0c;为了适应不同的播放平台或满足特定的展示需求&#xff0c;我们需要对视频尺寸进行批量调整。那么&#xff0c;如何实现批量自定义视频画面尺寸呢&#xff1f;本文将为您揭示这一…

LLM之RAG实战(十三)| 利用MongoDB矢量搜索实现RAG高级检索

想象一下&#xff0c;你是一名侦探&#xff0c;身处庞大的信息世界&#xff0c;试图在堆积如山的数据中找到隐藏的一条重要线索&#xff0c;这就是检索增强生成&#xff08;RAG&#xff09;发挥作用的地方&#xff0c;它就像你在人工智能和语言模型世界中的可靠助手。但即使是最…

小心JDK20 ZipOutputStream

Oracle 團隊竟然這麽粗心&#xff0c;編譯JDK 20 時ZipOutputStream沒有編譯成功就發佈了。 所以這個20版本不可以使用ZipOutputStream。 GZIPInputStream 只能做最後的壓縮&#xff0c;不能添加多個附件ZipEntry。 下一個版本21不存在這個問題。 try(var zipOut new ZipOu…

数据分析——火车信息

任务目标 任务 1、整理火车发车信息数据&#xff0c;结果的表格形式为&#xff1a; 2、并输出最终的发车信息表 难点 1、多文件 一个文件夹&#xff0c;多个月的发车信息&#xff0c;一个excel&#xff0c;放一天的发车情况 2、数据表的格式特殊 如何分析表是一个难点 数…

案例102:基于微信小程序的旅游社交管理系统设计与实现

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

解决VMware 虚拟机 ubuntu 20.04 异常关闭导致虚拟网卡 ens33 无法工作问题

问题描述 由于经常使用 SSH 远程链接 VMware 中的虚拟机 ubuntu&#xff0c;每次关闭都是挂起&#xff0c;时间久了&#xff0c;虚拟机运行有些卡顿了&#xff0c;此时可以通过 Linux 命令重启或者关闭 ubuntu&#xff0c;也可以之间使用 VMWare 中的【虚拟机】-- 【电源】-&g…

SiC电机控制器(逆变器)发展概况及技术方向

SiC电机控制器&#xff08;逆变器&#xff09;发展概况及技术方向 1.概述2.电动汽车动力系统设计趋势3.栅极驱动器和驱动电源配置4.结论 tips&#xff1a;资料来自网上搜集&#xff0c;仅供学习使用。 1.概述 2022年到2023年&#xff0c;第三代半导体碳化硅被推上了新的热潮。…

前端uniapp的tab选项卡for循环切换、开通VIP实战案例【带源码/最新】

目录 效果图图1图2 源码最后 这个案例是uniapp&#xff0c;同样也适用Vue项目&#xff0c;语法一样for循环&#xff0c;点击切换 效果图 图1 图2 源码 直接代码复制查看效果 <template><view class"my-helper-service-pass"><view class"tab…

第14课 利用openCV快速数豆豆

除了检测运动&#xff0c;openCV还能做许多有趣且实用的事情。其实openCV和FFmpeg一样都是宝藏开源项目&#xff0c;貌似简单的几行代码功能实现背后其实是复杂的算法在支撑。有志于深入学习的同学可以在入门后进一步研究算法的实现&#xff0c;一定会受益匪浅。 这节课&#…

(Python + Selenium4)Web自动化测试自学Day1

目录 文章声明⭐⭐⭐让我们开始今天的学习吧&#xff01;自动打开Chrome浏览器实现自动搜索元素定位常用的元素定位方式By.IDBy.CLASS_NAMEBy.TAG_NAMEBy.NAMEBy.LINK_TEXTBy.PARTIAL_LINK_TEXTBy.CSS_SELECTOR根据id定位根据class定位根据属性定位组合定位 By.XPATH 文章声明⭐…