网络通信程序设计实验二路由跟踪Word文档格式.docx
- 文档编号:19458651
- 上传时间:2023-01-06
- 格式:DOCX
- 页数:12
- 大小:74.73KB
网络通信程序设计实验二路由跟踪Word文档格式.docx
《网络通信程序设计实验二路由跟踪Word文档格式.docx》由会员分享,可在线阅读,更多相关《网络通信程序设计实验二路由跟踪Word文档格式.docx(12页珍藏版)》请在冰豆网上搜索。
RouteTrace.cpp
//RouteTrace.cpp:
Definestheclassbehaviorsfortheapplication.
#include"
stdafx.h"
RouteTrace.h"
RouteTraceDlg.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//CRouteTraceApp
BEGIN_MESSAGE_MAP(CRouteTraceApp,CWinApp)
//{{AFX_MSG_MAP(CRouteTraceApp)
//NOTE-theClassWizardwilladdandremovemappingmacroshere.
//DONOTEDITwhatyouseeintheseblocksofgeneratedcode!
//}}AFX_MSG
ON_COMMAND(ID_HELP,CWinApp:
:
OnHelp)
END_MESSAGE_MAP()
//CRouteTraceAppconstruction
CRouteTraceApp:
CRouteTraceApp()
{
//TODO:
addconstructioncodehere,
//PlaceallsignificantinitializationinInitInstance
}
//TheoneandonlyCRouteTraceAppobject
CRouteTraceApptheApp;
//CRouteTraceAppinitialization
BOOLCRouteTraceApp:
InitInstance()
AfxEnableControlContainer();
//Standardinitialization
//Ifyouarenotusingthesefeaturesandwishtoreducethesize
//ofyourfinalexecutable,youshouldremovefromthefollowing
//thespecificinitializationroutinesyoudonotneed.
#ifdef_AFXDLL
Enable3dControls();
//CallthiswhenusingMFCinasharedDLL
#else
Enable3dControlsStatic();
//CallthiswhenlinkingtoMFCstatically
CRouteTraceDlgdlg;
m_pMainWnd=&
dlg;
intnResponse=dlg.DoModal();
if(nResponse==IDOK)
{//TODO:
Placecodeheretohandlewhenthedialogis
//dismissedwithOK
}
elseif(nResponse==IDCANCEL)
{
//TODO:
//dismissedwithCancel
//Sincethedialoghasbeenclosed,returnFALSEsothatweexitthe
//application,ratherthanstarttheapplication'
smessagepump.
returnFALSE;
ICMP.cpp
//ICMP.cpp:
implementationoftheCICMPclass.
ICMP.h"
ws2tcpip.h"
staticcharTHIS_FILE[]=__FILE__;
//////////////////////////////////////////////////////////////////////
//Construction/Destruction
CICMP:
CICMP()
{winsock=0;
m_pIp=NULL;
m_pIcmp=NULL;
m_pIp=(IP_HEAD*)newBYTE[MAX_PACKET];
m_pIcmp=(ICMP_HEAD*)newBYTE[MAX_PACKET];
~CICMP()
{delete[]m_pIp;
delete[]m_pIcmp;
BOOLCICMP:
Initialize()
{WSADATAwsadata;
if(WSAStartup(MAKEWORD(2,1),&
wsadata))
{AfxMessageBox("
WSAStartup初始化失败!
"
);
returnFALSE;
}
winsock=WSASocket(AF_INET,//建立socket
SOCK_RAW,
IPPROTO_ICMP,
NULL,0,0);
if(!
winsock){
AfxMessageBox("
Socket创建失败!
inttimeout=5000;
setsockopt(winsock,SOL_SOCKET,SO_RCVTIMEO,(char*)&
timeout,// 设置接收超时
sizeof(timeout));
timeout=5000;
setsockopt(winsock,SOL_SOCKET,SO_SNDTIMEO,(char*)&
timeout,//设置发送超时
returnTRUE;
voidCICMP:
Uninitialize()//释放Socket
if(winsock)
closesocket(winsock);
WSACleanup();
USHORTCICMP:
CheckSum(USHORT*buffer,intsize)//计算校验和
unsignedlongcksum=0;
while(size>
1){
cksum+=*buffer++;
size-=sizeof(USHORT);
if(size){
cksum+=*(UCHAR*)buffer;
cksum=(cksum>
>
16)+(cksum&
0xffff);
cksum+=(cksum>
16);
return(USHORT)(~cksum);
SendICMPPack(char*pAddr)
{sockaddr_insockAddr;
memset((void*)&
sockAddr,0,sizeof(sockAddr));
sockAddr.sin_family=AF_INET;
sockAddr.sin_port=0;
sockAddr.sin_addr.S_un.S_addr=inet_addr(pAddr);
returnSendICMPPack(&
sockAddr);
//----------------设置TTL--------------------
intCICMP:
SetTTL(intTTL)
{intnRet=setsockopt(winsock,IPPROTO_IP,IP_TTL,(LPSTR)&
TTL,sizeof(int));
if(nRet==SOCKET_ERROR)
{CStringttlerr;
ttlerr.Format("
设置TTL错误!
AfxMessageBox(ttlerr);
return0;
return1;
//--------------------发送---------------------------
SendICMPPack(sockaddr_in*pAddr)
{//填充ICMP数据各项
intstate;
char*p_data;
m_pIcmp->
type=ICMP_ECHO;
code=0;
ID=(USHORT)GetCurrentProcessId();
number=0;
time=GetTickCount();
cksum=0;
//填充数据
p_data=((char*)m_pIcmp+sizeof(ICMP_HEAD));
memset((char*)p_data,'
0'
DEF_PACKET);
//检查和
cksum=CheckSum((USHORT*)m_pIcmp,
DEF_PACKET+sizeof(ICMP_HEAD));
//发送数据
state=sendto(winsock,(char*)m_pIcmp,
DEF_PACKET+sizeof(ICMP_HEAD),
NULL,(structsockaddr*)pAddr,sizeof(sockaddr));
if(state==SOCKET_ERROR){
if(GetLastError()==WSAETIMEDOUT)
m_strInfo="
连接超时!
(发送)"
;
else
m_strInfo="
出现未知发送错误!
if(state<
DEF_PACKET){
m_strInfo="
发送数据错误!
memcpy((void*)&
m_sockAddr,(void*)pAddr,
sizeof(sockaddr_in));
//----------------------接收数据----------------------------
RecvICMPPack()
intlen=sizeof(sockaddr_in);
char*addr;
structhostent*lpHostent=NULL;
intMaxfd=1;
//监视的最大的文件描述符值+1
fd_setreadFdSet;
//设置文件描述符
structtimevalTimeout;
addr=inet_ntoa(m_sockAddr.sin_addr);
FD_ZERO(&
readFdSet);
FD_SET(winsock,&
Maxfd=max(Maxfd,winsock)+1;
Timeout.tv_sec=10;
//设置响应时间限制
Timeout.tv_usec=0;
inte=:
select(Maxfd,&
readFdSet,NULL,NULL,&
Timeout);
//获取多路复用套接字的响应结果
if(e<
=0){
routeaddr="
****"
routestate=1;
RouteState="
超时未知"
FD_ISSET(winsock,&
readFdSet))
state=recvfrom(winsock,(char*)m_pIp,MAX_PACKET,0,(structsockaddr*)&
m_sockAddr,&
len);
if(state==SOCKET_ERROR){
if(WSAGetLastError()==WSAETIMEDOUT)
{
m_strInfo.Format("
接收超时,路由跟踪失败!
routestate=0;
路由跟踪失败!
}
未知接收错误!
//分析数据
intipheadlen;
ipheadlen=m_pIp->
HeadLen*4;
if(state<
(ipheadlen+MIN_PACKET)){
目的地址的响应数据不正确"
ICMP_HEAD*p_icmprev;
p_icmprev=(ICMP_HEAD*)((char*)m_pIp+ipheadlen);
switch(p_icmprev->
type)
{
caseICMP_ECHOREPLY:
//收到正常回显
接收到%s%d字节响应数据,响应时间:
%dms."
inet_ntoa(m_sockAddr.sin_addr),len,GetTickCount()-p_icmprev->
time);
routeaddr=addr;
RouteState="
到达目的主机!
break;
caseICMP_TTLOUT:
//TTL超时
{
routeaddr=inet_ntoa(m_sockAddr.sin_addr);
routestate=1;
RouteState="
测试到路由器!
returnTRUE;
}
caseICMP_DESUNREACH:
//目的不可达
{m_strInfo="
目的不可达!
routestate=0;
目的不可达"
default:
{routestate=0;
routeaddr="
***"
m_strInfo="
未知错误!
RouteState="
不明状态!
}
returnTRUE;
2、命令行窗口下运行:
tracert命令,记录运行结果和网站IP地址。
3、用RouteTrace程序执行到2中网站IP的路由跟踪,记录结果。
4、由于该程序在编制过程中没有考虑路由器不返回应答报文这一情况,因此程序在未收到报文的情况下执行处理流程存在显示错误,请找出问题所在的代码将其更正,正确显示为如下的结果:
四、实验要求及注意事项
代码主要内容已经添加了注释,重点理解ICMP.cpp中接收数据部分的代码。
充分利用网络搜索,查找相关资料。
五、实验总结
此次实验主要是学习分析程序功能结构,在VisualC++6.0中调试通过,从而熟悉ICMP协议的工作原理和路由跟踪的原理。
同时还可以根据实际需要修改程序中的参数,通过这次学习对路由跟踪有了更深刻的认识。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络 通信 程序设计 实验 路由 跟踪