欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    网络编程课程设计-网路嗅探器.doc

    • 资源ID:56402608       资源大小:310.50KB        全文页数:12页
    • 资源格式: DOC        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    网络编程课程设计-网路嗅探器.doc

    目 录1 设计目的12 设计内容23 程序流程24 设计步骤35 设计总结101 设计目的网络通信课程设计是网络工程专业的大型作业课。是培养计算机领域从事网络技术及应用工作的高级工程技术人才的必修课程。本课的主要任务是使学生队所学的计算机网络知识从实践上有一个较清晰的了解。对当前计算机网络的主要种类和常用的网络协议有更进一步的深入认识。学会计算机网络设计和日常管理及维护的最基本方法。网络编程简单的理解就两台计算机相互通讯数据,通过使用套接字来达到进程通信目的编程就是网络编程。网络编程最主要工作就是在发送端把信息通过规定好的协议进行组包,在接收端按照规定好的协议把包进行解析,从而提取出相应的信息,达到通信的目的。中间最主要的就是数据包的组装,数据包的过滤,数据包的捕获,数据包的分析,当然最后再做一些处理。本次实验运用C+的网络编程相关知识,通过学习了解了TCP和UDP协议的基本知识和SOCKET编程的基本概念,完成tracert程序,实现ping功能和路由追踪功能。2 设计内容一、学习实践要求 1对计算机网络的物理构成有清晰的了解; 2理解计算机网络体系结构的内涵; 3熟悉计算机网络的分类及常用的网络协议;4基于掌握计算机网络软件的开发方法;5具备管理计算机网络的基本知识及技能。二、模块功能(1)pin功能:发送ICMP数据包到计算机,如有返回,显示相应时间等。(2)路由探测功能:依次ping途经的路由器或网关设备,依次显示途经路由器的响应时间。3 程序流程超时,打印星号解析命令行参数中的IP地址或主机名开始是预期数据报?解析数据报并显示输出有数据报到达?填充ICMP回显请求数据报并发送TTL+(初始为1)目的主机回应答或达到最大跳站值?初始化winsock2环境结束释放分钟资源打印结束信息NYYYNN图1 流程图4 设计步骤一、程序运行结果相关截图图2 运行结果图3 运行结果图4 运行结果图5 运行结果二、程序源代码#include <iostream>#include <winsock2.h>#include <ws2tcpip.h>using namespace std;#pragma comment(lib, "Ws2_32.lib")/IP报头typedef struct unsigned char hdr_len:4; /4位头部长度 unsigned char version:4; /4位版本号 unsigned char tos; /8位服务类型 unsigned short total_len; /16位总长度 unsigned short identifier; /16位标识符 unsigned short frag_and_flags; /3位标志加13位片偏移 unsigned char ttl; /8位生存时间 unsigned char protocol; /8位上层协议号 unsigned short checksum; /16位校验和 unsigned long sourceIP; /32位源IP地址 unsigned long destIP; /32位目的IP地址 IP_HEADER;/ICMP报头typedef struct BYTE type; /8位类型字段 BYTE code; /8位代码字段 USHORT cksum; /16位校验和 USHORT id; /16位标识符 USHORT seq; /16位序列号 ICMP_HEADER;/报文解码结构typedef struct USHORT usSeqNo; /序列号 DWORD dwRoundTripTime; /往返时间 in_addr dwIPaddr; /返回报文的IP地址DECODE_RESULT;/计算网际校验和函数USHORT checksum(USHORT *pBuf,int iSize) unsigned long cksum=0; while(iSize>1) cksum+=*pBuf+; iSize-=sizeof(USHORT); if(iSize) cksum+=*(UCHAR *)pBuf; cksum=(cksum>>16)+(cksum&0xffff); cksum+=(cksum>>16); return (USHORT)(cksum);/对数据包进行解码BOOL DecodeIcmpResponse(char * pBuf,int iPacketSize,DECODE_RESULT &DecodeResult,BYTE ICMP_ECHO_REPLY,BYTE ICMP_TIMEOUT) /检查数据报大小的合法性 IP_HEADER* pIpHdr = (IP_HEADER*)pBuf; int iIpHdrLen = pIpHdr->hdr_len * 4; if (iPacketSize < (int)(iIpHdrLen+sizeof(ICMP_HEADER) return FALSE; /根据ICMP报文类型提取ID字段和序列号字段 ICMP_HEADER *pIcmpHdr=(ICMP_HEADER *)(pBuf+iIpHdrLen); USHORT usID,usSquNo; if(pIcmpHdr->type=ICMP_ECHO_REPLY) /ICMP回显应答报文 usID=pIcmpHdr->id; /报文ID usSquNo=pIcmpHdr->seq; /报文序列号 else if(pIcmpHdr->type=ICMP_TIMEOUT) /ICMP超时差错报文 char * pInnerIpHdr=pBuf+iIpHdrLen+sizeof(ICMP_HEADER); /载荷中的IP头 int iInnerIPHdrLen=(IP_HEADER *)pInnerIpHdr)->hdr_len*4; /载荷中的IP头长 ICMP_HEADER * pInnerIcmpHdr=(ICMP_HEADER *)(pInnerIpHdr+iInnerIPHdrLen);/载荷中的ICMP头 usID=pInnerIcmpHdr->id; /报文ID usSquNo=pInnerIcmpHdr->seq; /序列号 else return false; /检查ID和序列号以确定收到期待数据报 if(usID!=(USHORT)GetCurrentProcessId()|usSquNo!=DecodeResult.usSeqNo) return false; /记录IP地址并计算往返时间 DecodeResult.dwIPaddr.s_addr=pIpHdr->sourceIP; DecodeResult.dwRoundTripTime=GetTickCount()-DecodeResult.dwRoundTripTime; /处理正确收到的ICMP数据报 if (pIcmpHdr->type = ICMP_ECHO_REPLY |pIcmpHdr->type = ICMP_TIMEOUT) /输出往返时间信息 if(DecodeResult.dwRoundTripTime) cout<<" "<<DecodeResult.dwRoundTripTime<<"ms"<<flush; else cout<<" "<<"<1ms"<<flush; return true;void main() /初始化Windows sockets网络环境 WSADATA wsa; WSAStartup(MAKEWORD(2,2),&wsa); char IpAddress255; cout<<"请输入一个IP地址或域名:" cin>>IpAddress; /得到IP地址 u_long ulDestIP=inet_addr(IpAddress); /转换不成功时按域名解析 if(ulDestIP=INADDR_NONE) hostent * pHostent=gethostbyname(IpAddress); if(pHostent) ulDestIP=(*(in_addr*)pHostent->h_addr).s_addr; else cout<<"输入的IP地址或域名无效!"<<endl; WSACleanup(); return; cout<<"Tracing roote to "<<IpAddress<<" with a maximum of 30 hops.n"<<endl; /填充目地端socket地址 sockaddr_in destSockAddr; ZeroMemory(&destSockAddr,sizeof(sockaddr_in); destSockAddr.sin_family=AF_INET; destSockAddr.sin_addr.s_addr=ulDestIP; /创建原始套接字 SOCKET sockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,WSA_FLAG_OVERLAPPED); /超时时间 int iTimeout=3000; /接收超时 setsockopt(sockRaw,SOL_SOCKET,SO_RCVTIMEO,(char *)&iTimeout,sizeof(iTimeout); /发送超时 setsockopt(sockRaw,SOL_SOCKET,SO_SNDTIMEO,(char *)&iTimeout,sizeof(iTimeout); /构造ICMP回显请求消息,并以TTL递增的顺序发送报文 /ICMP类型字段 const BYTE ICMP_ECHO_REQUEST=8; /请求回显 const BYTE ICMP_ECHO_REPLY=0; /回显应答 const BYTE ICMP_TIMEOUT=11; /传输超时 /其他常量定义 const int DEF_ICMP_DATA_SIZE=32; /ICMP报文默认数据字段长度 const int MAX_ICMP_PACKET_SIZE=1024;/ICMP报文最大长度(包括报头) const DWORD DEF_ICMP_TIMEOUT=3000; /回显应答超时时间 const int DEF_MAX_HOP=30; /最大跳站数 /填充ICMP报文中每次发送时不变的字段 char IcmpSendBufsizeof(ICMP_HEADER)+DEF_ICMP_DATA_SIZE; /发送缓冲区 memset(IcmpSendBuf, 0, sizeof(IcmpSendBuf); /初始化发送缓冲区 char IcmpRecvBufMAX_ICMP_PACKET_SIZE; /接收缓冲区 memset(IcmpRecvBuf, 0, sizeof(IcmpRecvBuf); /初始化接收缓冲区 ICMP_HEADER * pIcmpHeader=(ICMP_HEADER*)IcmpSendBuf; pIcmpHeader->type=ICMP_ECHO_REQUEST; /类型为请求回显 pIcmpHeader->code=0; /代码字段为0 pIcmpHeader->id=(USHORT)GetCurrentProcessId(); /ID字段为当前进程号 memset(IcmpSendBuf+sizeof(ICMP_HEADER),'E',DEF_ICMP_DATA_SIZE);/数据字段 USHORT usSeqNo=0; /ICMP报文序列号 int iTTL=1; /TTL初始值为1 BOOL bReachDestHost=FALSE; /循环退出标志 int iMaxHot=DEF_MAX_HOP; /循环的最大次数 DECODE_RESULT DecodeResult; /传递给报文解码函数的结构化参数 while(!bReachDestHost&&iMaxHot-) /设置IP报头的TTL字段 setsockopt(sockRaw,IPPROTO_IP,IP_TTL,(char *)&iTTL,sizeof(iTTL); cout<<iTTL<<flush; /输出当前序号 /填充ICMP报文中每次发送变化的字段 (ICMP_HEADER *)IcmpSendBuf)->cksum=0; /校验和先置为0 (ICMP_HEADER *)IcmpSendBuf)->seq=htons(usSeqNo+); /填充序列号 (ICMP_HEADER *)IcmpSendBuf)->cksum=checksum(USHORT *)IcmpSendBuf,sizeof(ICMP_HEADER)+DEF_ICMP_DATA_SIZE); /计算校验和 /记录序列号和当前时间 DecodeResult.usSeqNo=(ICMP_HEADER*)IcmpSendBuf)->seq; /当前序号 DecodeResult.dwRoundTripTime=GetTickCount(); /当前时间 /发送TCP回显请求信息 sendto(sockRaw,IcmpSendBuf,sizeof(IcmpSendBuf),0,(sockaddr*)&destSockAddr,sizeof(destSockAddr); /接收ICMP差错报文并进行解析处理 sockaddr_in from; /对端socket地址 int iFromLen=sizeof(from); /地址结构大小 int iReadDataLen; /接收数据长度 while(1) /接收数据 iReadDataLen=recvfrom(sockRaw,IcmpRecvBuf,MAX_ICMP_PACKET_SIZE,0,(sockaddr*)&from,&iFromLen); if(iReadDataLen!=SOCKET_ERROR) /有数据到达 /对数据包进行解码 if(DecodeIcmpResponse(IcmpRecvBuf,iReadDataLen,DecodeResult,ICMP_ECHO_REPLY,ICMP_TIMEOUT) /到达目的地,退出循环 if(DecodeResult.dwIPaddr.s_addr=destSockAddr.sin_addr.s_addr) bReachDestHost=true; /输出IP地址 cout<<'t'<<inet_ntoa(DecodeResult.dwIPaddr)<<endl; break; else if(WSAGetLastError()=WSAETIMEDOUT) /接收超时,输出*号 cout<<" *"<<'t'<<"Request timed out."<<endl; break; else break; iTTL+; /递增TTL值 5 设计总结通过这次课程设计,让我受益匪浅,使我掌握了网络通信编程的基本思想。实习的时候遇到很多不会的东西,通过问老师同学,上网自己搜索得到答案,解决问题。画流程图,刚开始怎么都不会,画好后每次改动上面的文字流程图就会动,最后才知道要先新建绘图画布才解决了这个问题,繁琐的实习步骤要一步步来,不急不躁、细心认真才能得到程序的结果。不断出现错误,遇到问题,解决困难,让我更加深切理解做的这个程序,感觉自己学会了这个知识,没想到在实际操作时会遇到各种自己解决不了的困难,但是也是这些困难的出现与解决让自己对知识的理解更深一步。

    注意事项

    本文(网络编程课程设计-网路嗅探器.doc)为本站会员(飞****2)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开