网络通信程序设计实验二路由跟踪文档格式.docx

上传人:b****3 文档编号:16923197 上传时间:2022-11-27 格式:DOCX 页数:12 大小:74.48KB
下载 相关 举报
网络通信程序设计实验二路由跟踪文档格式.docx_第1页
第1页 / 共12页
网络通信程序设计实验二路由跟踪文档格式.docx_第2页
第2页 / 共12页
网络通信程序设计实验二路由跟踪文档格式.docx_第3页
第3页 / 共12页
网络通信程序设计实验二路由跟踪文档格式.docx_第4页
第4页 / 共12页
网络通信程序设计实验二路由跟踪文档格式.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

网络通信程序设计实验二路由跟踪文档格式.docx

《网络通信程序设计实验二路由跟踪文档格式.docx》由会员分享,可在线阅读,更多相关《网络通信程序设计实验二路由跟踪文档格式.docx(12页珍藏版)》请在冰豆网上搜索。

网络通信程序设计实验二路由跟踪文档格式.docx

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_MAND(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、命令行窗口下运行:

tracertc:

\iknow\docshare\data\cur_work\.sohu.163.命令,记录运行结果和IP地址。

3、用RouteTrace程序执行到2中IP的路由跟踪,记录结果。

4、由于该程序在编制过程中没有考虑路由器不返回应答报文这一情况,因此程序在未收到报文的情况下执行处理流程存在显示错误,请找出问题所在的代码将其更正,正确显示为如下的结果:

四、实验要求及考前须知

代码主要容已经添加了注释,重点理解ICMP.cpp中接收数据局部的代码。

充分利用网络搜索,查找相关资料。

五、实验总结

此次实验主要是学习分析程序功能构造,在VisualC++6.0中调试通过,从而熟悉ICMP协议的工作原理和路由跟踪的原理。

同时还可以根据实际需要修改程序中的参数,通过这次学习对路由跟踪有了更深刻的认识。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1