#include <fstream>
#include <iostream>
#include <iomanip>           //I/O流控制头文件
#include <WINSOCK2.H>
using namespace std;
struct eth_header            //帧头
{
unsigned char eth_dst[6];
unsigned char eth_src[6];
unsigned short upper_pro; //上层协议    0800表示是ip数据包
};
struct ip_header              //ip报头
{
union
{
unsigned char version;  //版本
unsigned char ihl;      //报头长度
};
unsigned char tos;          //服务类型
unsigned short total_len;   //总长度
unsigned short identifer;   //标识
union
{
unsigned short flags;    //标志
unsigned short offset;   //片偏移
};
unsigned char TTL;           //生存周期
unsigned char protocol;      //协议
unsigned short checksum;     //头部校验和
unsigned char ip_src[4];     //源ip地址
unsigned char ip_dst[4];     //目的ip地址
unsigned int option;         //选项+填充
//数据
};
void main()
{
int temp[38];               //? why 38?
ifstream infile("D:\\data"); //打开文件
int i;
for (i=0;i<38;i++)
{
infile>>hex>>temp[i];    //hex 格式化为十六进制数值数据 输入和输出
}
infile.close();
struct eth_header eth;
struct ip_header ip;
for (i=0;i<6;i++)
{
eth.eth_dst[i]=(unsigned char)temp[i];
}
for (i=6;i<12;i++)
{
eth.eth_src[i-6]=(unsigned char)temp[i];
}
eth.upper_pro = (temp[12]<<8)|temp[13];         //? why 左移8位
//以下给ip头部变量赋值
ip.version = (unsigned char)temp[14];
ip.tos = (unsigned char)temp[15];
ip.total_len=(temp[16]<<8)|temp[17];
ip.identifer = (temp[18]<<8)|temp[19];
ip.flags = (unsigned short)(temp[20]<<8)|(temp[21]);
ip.TTL = (unsigned char)temp[22];
ip.protocol = (unsigned char)temp[23];
ip.checksum = (temp[24]<<8)|temp[25];
for (i=26;i<30;i++)
{
ip.ip_src[i-26]=(unsigned char)temp[i];
}
for (i=30;i<34;i++)
{
ip.ip_dst[i-30]=(unsigned char)temp[i];
}
//以下输出mac头部信息
cout<<"输出mac帧头部信息(十六进制):"<<endl;
cout<<"目的mac地址为:";
for (i=0;i<5;i++)
{
//setfill是设置填充字符,setw设置输出的宽度,它们的作用表现在紧接着输入的字符串上
cout<<setfill('0')<<setw(2)<<hex<<(int)eth.eth_dst[i]<<"-";//空的地方填充0,宽度为2
}
cout<<setfill('0')<<setw(2)<<hex<<(int)eth.eth_dst[5]<<endl;
cout<<"源mac地址为:";
for (i=0;i<5;i++)
{
cout<<setfill('0')<<setw(2)<<hex<<(int)eth.eth_src[i]<<"-";
}
cout<<setfill('0')<<setw(2)<<hex<<(int)eth.eth_src[5]<<endl;
cout<<"上层协议类型为:";
cout<<setfill('0')<<setw(4)<<hex<<eth.upper_pro<<endl;
cout<<"-----------------------------"<<endl;
//以下输出ip头部信息
cout<<"输出ip头部信息(十进制):"<<endl;
cout<<"版本:"<<dec<<(ip.version>>4)<<endl;    //dec十进制 oct八进制 hex十六进制
ip.ihl=ip.version&0x0f;
cout<<"ip头部长度(ihl):"<<(ip.ihl*4)<<endl;
cout<<"服务类型:"<<(int)ip.tos<<"("<<"优先权子字段"
<<(ip.tos>>5)<<"tos子字段:"<<((ip.tos>>1)&0x0f)<<")"<<endl;
cout<<"总长度:"<<(int)ip.total_len<<endl;
cout<<"标识符:"<<(int)ip.identifer<<endl;
cout<<"片偏移:"<<(ip.offset&0x1fff)<<endl;
cout<<"生存期:"<<(int)ip.TTL<<endl;
cout<<"协议:"<<(int)ip.protocol<<endl;
cout<<"首部检校和:"<<(int)ip.checksum<<endl;
cout<<"源ip地址:";
for(i=0;i<3;i++)
{
cout<<(int)ip.ip_src[i]<<".";
}
cout<<(int)ip.ip_src[3]<<endl;
cout<<"目的ip地址:";
for (i=0;i<3;i++)
{
cout<<(int)ip.ip_dst[i]<<".";
}
cout<<(int)ip.ip_dst[3]<<endl;
//以下验证有没有选项字段
if (ip.ihl==5)
{
cout<<"没有选项字段"<<endl;
for (i=34;i<38;i++)
{
temp[i]=0;
}
}
else
{
ip.option=(unsigned int)(temp[34]<<24)|(temp[35]<<16)|(temp[36]<<8)|temp[37];
cout<<"选项:"<<(int)ip.option<<endl;//如果有选项字段 将选项和填充一起输出
}
cout<<"-----------------------------"<<endl;
//以下验证ip数据包头部的正确性
unsigned short m1,m2,sum;
unsigned int sum1=0;
for (i=14;i<38;i=i+2)
{
m1 = (unsigned short)(temp[i]<<8);
m2 = (unsigned short)temp[i+1];
sum = m1|m2;
sum1+=sum;
}
sum1 = (sum1>>16)+(sum1&0xffff);   //oxffff截掉进位那一位
sum1 = (sum1>>16)+(sum1&0xffff);
sum1 = (unsigned short)~sum1;
if (sum1==0)
{
cout<<"ip数据包是正确的"<<endl;
}
else
{
cout<<"ip数据包是错误的"<<endl;
}
cout<<"-----------------------------"<<endl;
cin.get();
}

读取网络抓包文件data得到参数相关推荐

  1. 网络抓包方式复现Tomcat- AJP协议文件读取/命令执行漏洞(CVE-2020-1938 / CNVD-2020-10487)

    目录 测试是否安装成功​编辑 基础简介 Tomcat Connector(连接器) ​编辑Servlet(服务程序) Tomcat内部处理请求流程 文件读取漏洞 抓包复现 需要将下图中抓取到的数据包修 ...

  2. 【学习点滴】linux调试工具、cmake和网络抓包

    目录 gdb 多进程调试 多线程调试: gdb底层原理 Linux下查看服务器端的并发连接个数: Valgrind memcheck strace Linux下,绑定1024以下的端口需要root权限 ...

  3. iOS系统网络抓包方法

    转自:http://www.cnblogs.com/ydhliphonedev/archive/2011/10/27/2226935.html 在进行iOS开发过程中,经常会遇到各种各样的网络访问问题 ...

  4. 如何在 Kubernetes Pod 内进行网络抓包

    作者 | Addo Zhang 来源 | 云原生指北 使用 Kubernetes 时,经常会遇到一些棘手的网络问题需要对 Pod 内的流量进行抓包分析.然而所使用的镜像一般不会带有 tcpdump 命 ...

  5. 超详细的网络抓包神器 tcpdump 使用指南

    tcpdump 是一款强大的网络抓包工具,它使用 libpcap 库来抓取网络数据包,这个库在几乎在所有的 Linux/Unix 中都有.熟悉 tcpdump 的使用能够帮助你分析调试网络数据,本文将 ...

  6. 关于fi dd ler 手机抓包 网卡地址地址_超详细的网络抓包神器 tcpdump 使用指南

    tcpdump 是一款强大的网络抓包工具,它使用 libpcap 库来抓取网络数据包,这个库在几乎在所有的 Linux/Unix 中都有.熟悉 tcpdump 的使用能够帮助你分析调试网络数据,本文将 ...

  7. 查看docker与宿主机网卡的对应关系,tcpdump在容器外网络抓包

    通过iflink找到网卡对应关系 1. 在宿主机上执行命令ip link $ ip link ...... 13: veth56ecf40@if12: <BROADCAST,MULTICAST, ...

  8. 网络抓包技术:libcap

    简介 Linux 下几乎所有的抓包技术都是基于libcap的,包括可以兼容DPDK 的pcaplusplus. libpcap 是一个网络数据包捕获函数库,功能非常强大,Linux 下著名的 tcpd ...

  9. C++ winpcap网络抓包代码实现,以及抓包内容解析。

    c++实现抓包代码 1.安装winpcap(windows packet capture)是windows平台下一个免费,公共的网络访问系统.开发winpcap这个项目的目的在于为win32应用程序提 ...

最新文章

  1. MySQL登录时ERROR 1045:Access denied for user ‘root’@’localhost’ (using password: YES)
  2. 人工智能 MIT 博士系列讲课
  3. selenium webdriver之eclipse java开发环境搭建
  4. win10商店打不开_PS打不开Raw格式?更新ACR新方式!【第05期 三分钟聊摄影】
  5. oracle date类型,向Oracle中插入date数据类型
  6. python3+opencv+tkinter开发简单的人脸识别小程序
  7. mysql的util_JDBC连接mysql工具类Util供大家参考
  8. (ContrastiveCrop)Crafting Better Contrastive Views for Siamese Representation Learning
  9. 老外看中国:本土移动应用差异在哪?
  10. 洛谷P2617 Dynamic Rankings
  11. html5 音乐转盘,HTML5 幸运大转盘
  12. 2021年房地产经纪行业发展研究报告
  13. 无人机倾斜摄影详解,三维实景建模应用
  14. 英特尔 back,全新架构 coming
  15. [C++] printf pitfall
  16. 微信小程序信息授权获取(头像,昵称,等)
  17. 【布局优化】基于粒子群求解物流选址matlab源码
  18. 如何卸载有密码保护的symantec客户端
  19. 图像的二值化和灰度化
  20. 《大学章句集注》-读书笔记之一

热门文章

  1. 03-22 H5 性能分析
  2. windows安装python2.7_Windows下安装python2.7及科学计算套装
  3. activate tensorflow_“量子固件”来了!利用 TensorFlow 提升量子计算硬件性能
  4. 接口不能被实例化的吗?接口引用是什么?
  5. 分段函数怎么用神经网络进行拟合_Tensoflow简单神经网络实现非线性拟合
  6. linux运维项目redis简历,redis简介
  7. 图像有用区域(广搜)
  8. 在STM8单片机中自己实现 printf()函数功能
  9. 机器学习理论基础 集成学习前期基础--分类决策树与回归决策树
  10. (五)Qt实现自定义模型基于QAbstractItemModel