首页 > 编程语言 > 网际检验和算法,以接收方计算IP首部检验和为例

网际检验和算法,以接收方计算IP首部检验和为例

时间:2022-12-18 14:34:22浏览次数:43  
标签:string 为例 int IP 16 pri 检验 include cout

#include<iostream> #include <fstream> #include<string> #include<cstring> #include <algorithm> using namespace std;//非遂爻辞 string h="0123456789abcdef";//16进制 string HexAdd(string pri,string now){//实现字符串的16进制循环加法     int cf=0;//进位标识符     for(int i=3;i>=0;--i){//从低位开始         int ph,nh;//设置pri和now第i位分别对应于h的标号,可以通过标号之和取模16作为标号,从h里找到对应符号,实现加法         for(int j=0;j<16;++j){//pri开找             if(pri[i]==h[j]){ph=j;break;}         }         for(int j=0;j<h.length();++j){//now开找             if(now[i]==h[j]){nh=j;break;}         }         int pnch=ph+nh+cf;//标号求和         cf=0;//重置cf         if(pnch>=16)cf=1;//若产生进位,cf置1         pri[i]=h[pnch%16];//取模获得对应符号     }     if(cf!=0)pri=HexAdd(pri,"0001");//最高位有进位,通过递归保证循环加法     return pri;//返回结果 } int main(){     string fname;//打开的文件名     //路径有:     //.\\testfile\\icmp.txt     //.\\testfile\\udp.txt     //.\\testfile\\tcp.txt     string temp;//获取文件内容于temp字符串     cout<<"请输入想要打开的文件:"<<endl;//静态提示路径     cout<<".\\testfile\\icmp.txt"<<endl;     cout<<".\\testfile\\udp.txt"<<endl;     cout<<".\\testfile\\tcp.txt"<<endl;     cin>>fname;     fstream fs(fname);//打开文件     if(fs.is_open()){//判断是否成功打开         fs>>temp;         cout<<"原始内容为:"<<temp<<endl;//输出原始内容         //接下来进行网际校验,因为都是ip数据报,本算法仅计算ip首部校验,至于icmp、udp、tcp的算法相同,取的数据部分不同罢了,下面是算法步骤:         //取ip首部,每两个字节为一组,每组循环加法,和取反         //需要注意的是,发送方的校验位先置为0x0000,算出后再赋值;接收方不用,直接算,若最终结果为0x0000,则接收,否则丢弃         //这算法具体实现,结合实际,就当咱是接收方好了         string pri="0000";//记录累加信息,初始为零         for(int i=28;i<68;i+=4){//测试文件是通过wireshark导出后加工而成的数据,其前14个字节记录着源mac、目的mac和ip协议版本,并不是ip首部,所以跳过             string now=temp.substr(i,4);//每两个字节为单位             pri=HexAdd(pri,now);//开加             cout<<"pri "<<i<<" = "<<pri<<endl;//输出每次加后的结果,做到流程清晰         }         for(int i=3;i>=0;--i){//结果取反             int cpn;//pri每位反值的序号             for(int j=0;j<h.length();++j)if(pri[i]==h[j]){cpn=h.length()-1-j;break;}//找到反值序号             pri[i]=h[cpn];//将pri每位取反         }         cout<<"接收方的ip首部检验和结果为:0x"<<pri<<endl;         fs.close();//关闭文件流     }else cout<<"文件打开失败!";cout<<endl;     return 0; }

标签:string,为例,int,IP,16,pri,检验,include,cout
From: https://www.cnblogs.com/vusblog/p/16990355.html

相关文章

  • Windows给pip换源极大提高pip install速度
    1.打开appdata文件夹,在资源管理器的地址栏输入%appdata%后回车,  或者win+r打开命令运行,然后输入%appdata%也可以到该文件目录2.新建文件夹和文件新建一个名为pip的......
  • 【电力系统】基于YALMIP+CPLEX求解带储能的微电网优化调度问题附matlab代码
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • RNA-seq 详细教程:似然比检验(13)
    学习内容应用似然比检验(LRT)进行假设检验将LRT生成的结果与使用Wald检验获得的结果进行比较从LRT显著基因列表中识别共享表达谱似然比检验在评估超过两个......
  • [ABC282D] Make Bipartite 2 题解
    题目描述给定一个无向简单图\(G\),统计有多少个点对\((u,v)\)满足:\(u,v\)之间没有边直接连接:\((u,v)\notin\textE\)连接\((u,v)\)后\(G\)是二分图......
  • 折腾系列:利用好光猫,实现IPv6外网访问内网网站
    一、场景最近刚好免费的宽带到期了,中国移动提供了优惠,可以以优惠价升级光纤1000M。很好,家里的网络体验感有所提升。刚好最近以白菜价买了华为云的服务器,也搭建了自己的个人......
  • NOIP2022 游记(by Fy5Fengye)
    Day-x,11.?马上就是联赛了,不紧张是不现实的。每天都是模拟赛,每天都被爆锤……但是只要我没有心,就莫得心态问题!=)Day-7~-1,11.18~11.24联赛前一周。已经很难学进去什么......
  • JavaScript中的防抖与节流-图文版
    01、防抖还是节流防抖与节流目的都是避免一定时间内,大量重复的操作造成的性能损耗。因此原理也类似,都是阻止过多的事件执行,只保留一部分来执行。适用场景略有不同,也有......
  • 源码解读之TypeScript类型覆盖检测工具type-coverage
    因为团队内部开启了一个持续的前端代码质量改进计划,其中一个专项就是TS类型覆盖率,期间用到了type-coverage这个仓库,所以借这篇文章分享一下这个工具,并顺便从源码阅读的角......
  • Playable API - 多个Animation Clip间切换播放
    #用到的脚本usingSystem.Collections.Generic;usingUnityEngine;usingUnityEngine.Animations;usingUnityEngine.Playables;publicclassPlayAnimClipOneByO......
  • Playable API - 简单播放Animation Clip
    用到的资源:GitHub-unity3d-jp/unitychan-crs:Unity-Chan"CandyRockStar"LiveDemo这边直接在他提供的Scene上修改PlayableAPI来播放AnimationClip的脚本:usin......