亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? tracer.cpp

?? 路由實現(xiàn),計算機網(wǎng)絡(luò)課程做的一個實驗,希望各位指導(dǎo),謝謝!
?? CPP
字號:
// Tracer.cpp: implementation of the CTracer class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "TraceRoute.h"
#include "Tracer.h"
#include "TraceRouteDlg.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CTracer::CTracer()
{
	m_nSeq=1;
	icmpData=NULL;
	icmpRcvBuf=NULL;
    m_hSocket=INVALID_SOCKET;

	//初始化socket
    WSADATA wsaData;
    if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
    {
	    AfxMessageBox("WSAStartup()出錯!");
    }
  
}

CTracer::~CTracer()
{
	//關(guān)閉Socket
	if (m_hSocket!=NULL)
		closesocket(m_hSocket);
	WSACleanup();
}

//填充ICMP報文首部

void CTracer::FillICMPData(char* icmpData,int size)
{
	memset(icmpData,0,size);
	ICMPHEADER* icmpHeader=NULL;
	icmpHeader=(ICMPHEADER*)icmpData;

	icmpHeader->i_type =ICMP_ECHO;
	icmpHeader->i_code =0;
	icmpHeader->i_id =(USHORT)GetCurrentProcessId();
	icmpHeader->i_seq =m_nSeq++; 
	//GetTickCount返回從0點到現(xiàn)在的毫秒數(shù),作時間戳
	icmpHeader->timestamp=GetTickCount();
	char* datapart=icmpData+sizeof(ICMPHEADER);
    memset(datapart,'*',size-sizeof(ICMPHEADER));
	//填充校驗和
    icmpHeader->i_cksum =CheckSum(icmpData,size);
}

//由字符串轉(zhuǎn)化為地址

BOOL CTracer::FillAddress(char *addrDest)
{
	memset(&m_addrDest,0,sizeof(m_addrDest));
	m_addrDest.sin_family =AF_INET;
	if(inet_addr(addrDest)==INADDR_NONE)
	{
		//輸入的地址為計算機名字
		HOSTENT* hp=NULL;
		hp=gethostbyname(addrDest);
		if(hp)
		{
		    memcpy(&(m_addrDest.sin_addr),hp->h_addr,hp->h_length);
			m_addrDest.sin_family =hp->h_addrtype ;
		}
		else
		{
			AfxMessageBox("獲取地址失敗!");
			return FALSE;
		}
	}
	else
	{
		m_addrDest.sin_addr.s_addr=inet_addr(addrDest);
	}
	return TRUE;
}

void CTracer::Trace(char *destAddress)
{
	 int size=DEF_PACKET_SIZE+sizeof(ICMPHEADER);
	 //轉(zhuǎn)換地址
     if (!FillAddress(destAddress)) return ;

	 //分配必要的內(nèi)存空間
	 icmpData=(char*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,MAX_PACKET);
	 icmpRcvBuf=(char*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,MAX_PACKET);
	 if(!icmpData||!icmpRcvBuf)
	 {
		 AfxMessageBox("分配內(nèi)存空間失敗!");
		 TerminateProcess(GetCurrentProcess(),-1);
	 }
	 memset(icmpData,0,MAX_PACKET);
	 memset(icmpRcvBuf,0,MAX_PACKET);
	 


     //初始化套接字
	 m_hSocket=WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,WSA_FLAG_OVERLAPPED);
	 if(m_hSocket==INVALID_SOCKET)
	 {   
		 AfxMessageBox("套接字初始化失敗!");
		 TerminateProcess(GetCurrentProcess(),-1);
	 }
	
	 //設(shè)置超時選項
	 int nTimeOut=1000;
	 int result;
	 result=setsockopt(m_hSocket,SOL_SOCKET,SO_RCVTIMEO,(char*)&nTimeOut,sizeof(nTimeOut));
	 if(result==SOCKET_ERROR)
	 { 
		 AfxMessageBox("設(shè)置接收超時選項失敗!");
		 TerminateProcess(GetCurrentProcess(),-1);
	 }
	 result=setsockopt(m_hSocket,SOL_SOCKET,SO_SNDTIMEO,(char*)&nTimeOut,sizeof(nTimeOut));
	 if(result==SOCKET_ERROR)
	 {
		 AfxMessageBox("設(shè)置發(fā)送超時選項失敗!");
		 TerminateProcess(GetCurrentProcess(),-1);
	 }
	 //設(shè)置路由不查詢路由表選項
	 BOOL bDontRoute=TRUE;
	 result=setsockopt(m_hSocket,SOL_SOCKET,SO_DONTROUTE,(char*)&bDontRoute,sizeof(BOOL));
	 if(result==SOCKET_ERROR)
	 {
		 AfxMessageBox("設(shè)置不查詢路由表選項失敗!");
		 TerminateProcess(GetCurrentProcess(),-1);
	 }

	 for(int ttl=1;ttl<MAX_NOTES;ttl++)
	 {
		 //設(shè)定數(shù)據(jù)報的壽命
		 SetTTL(m_hSocket,ttl);
		 //發(fā)送數(shù)據(jù)報
		 if(SendData(icmpData,size)) continue; 
		 //接收數(shù)據(jù)報
		 if(RecvData(icmpRcvBuf,&result)) continue; 
		 //處理接收到的數(shù)據(jù)報
		 if (DecodeICMP(icmpRcvBuf,result,ttl)) break;
	 }
	 
	HeapFree(GetProcessHeap(), 0, icmpData);
    HeapFree(GetProcessHeap(), 0, icmpRcvBuf);

}

//設(shè)置數(shù)據(jù)報的壽命
BOOL CTracer::SetTTL(SOCKET hSocket, int ttl)
{
	int result;
	result=setsockopt(hSocket,IPPROTO_IP,IP_TTL,(LPSTR)&ttl,sizeof(ttl));
	if(result==SOCKET_ERROR)
	{
		AfxMessageBox("設(shè)置數(shù)據(jù)報壽命失敗!");
		TerminateProcess(GetCurrentProcess(),-1);
	}
	return TRUE;
}

//校驗和算法
USHORT CTracer::CheckSum(char* pBuffer,int size)
{   

	USHORT* buffer=(USHORT*)pBuffer;
	unsigned long cksum=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);
}

//處理接收到的數(shù)據(jù)報
BOOL CTracer::DecodeICMP(char* pBuffer,int bytes,int ttl)
{
    IPHEADER       *ipHeader=NULL;
    ICMPHEADER     *icmpHeader=NULL;
    unsigned short  ipHeaderLen;
    HOSTENT *ph=NULL;
    in_addr inaddr=m_addrFrom.sin_addr;

    ipHeader=(IPHEADER*)pBuffer;
	ipHeaderLen=20;

    if (bytes<ipHeaderLen+ICMP_MIN) 
		AfxMessageBox("接收數(shù)據(jù)報長度不正確!");
	
	icmpHeader=(ICMPHEADER*)(pBuffer+20);
    
    switch (icmpHeader->i_type)
    {
		//目的站點的返回
        case ICMP_ECHOREPLY:     
            ph=gethostbyaddr((const char *)&inaddr,AF_INET, sizeof(in_addr));
            if (ph != NULL)
			{
				CString report;
				report.Format("%2d  %s (%s)",ttl,ph->h_name,inet_ntoa(inaddr));
				((CTraceRouteDlg*)m_pWnd)->InfoAdd(report);
			}
			return TRUE;
            break;
		//中途路由器的返回
        case ICMP_TIMEOUT:     
            {
				CString report;
				report.Format("%2d  %s", ttl, inet_ntoa(inaddr));
				((CTraceRouteDlg*)m_pWnd)->InfoAdd(report);
				return FALSE;
				break;
			}
		//錯誤 主機不可達
        case ICMP_DESTUNREACH:  
            {
				CString report;
				report.Format("%2d  %s   主機不可達",ttl,inet_ntoa(inaddr));
				((CTraceRouteDlg*)m_pWnd)->InfoAdd(report);
				return TRUE;
				break;
			}
		//收到一個不是回應(yīng)的報文
        default:
			{
				CString report;
				report.Format("非回應(yīng)報文");
				((CTraceRouteDlg*)m_pWnd)->InfoAdd(report);
				return TRUE;
			}
           
    }
    return FALSE;
}

//發(fā)送數(shù)據(jù)報
BOOL CTracer::SendData(char* icmpData,int size)
{
	//填充ICMP報頭
    FillICMPData(icmpData,size);

	//發(fā)送數(shù)據(jù)報
	int result;
	result=sendto(m_hSocket,icmpData,size,0,(SOCKADDR*)&m_addrDest,sizeof(m_addrDest));
		 
	if(result==SOCKET_ERROR)
	{
		if(WSAGetLastError()==WSAETIMEDOUT)
		{
			((CTraceRouteDlg*)m_pWnd)->InfoAdd ("發(fā)送超時");
			return TRUE;
		}
		AfxMessageBox("發(fā)送報文失敗!");
		TerminateProcess(GetCurrentProcess(),-1);
	}
	return FALSE;
}

BOOL CTracer::RecvData(char* icmpRcvBuf,int* presult)
{
	static int count=0;
	//總共6次出現(xiàn)接收超時,判斷存在連接問題。
	if(count>5)            
	{
		AfxMessageBox("連接存在問題!");
		TerminateProcess(GetCurrentProcess(),-1);
	}

	int fromlen=sizeof(SOCKADDR);
	*presult=SOCKET_ERROR;
	*presult=recvfrom(m_hSocket,icmpRcvBuf,MAX_PACKET,0,(SOCKADDR*)&m_addrFrom,&fromlen);
		 
	if(*presult==SOCKET_ERROR)
	{
		if(WSAGetLastError()==WSAETIMEDOUT)
		{
			((CTraceRouteDlg*)m_pWnd)->InfoAdd ("接收超時!");
			count++;
			return TRUE;
		}
		AfxMessageBox("接收數(shù)據(jù)報失敗!");
		TerminateProcess(GetCurrentProcess(),-1);
	}
	return FALSE;
}

void CTracer::SetWnd(CDialog *pWnd)
{
	//設(shè)置窗口指針。
	m_pWnd=pWnd;
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一级日韩免费不卡| 久久精品人人做人人综合 | 欧美精品一卡两卡| 一本色道久久综合亚洲精品按摩| 丁香亚洲综合激情啪啪综合| 国模娜娜一区二区三区| 免费精品视频在线| 蜜桃视频在线观看一区| 久久er99精品| 粉嫩13p一区二区三区| 欧美一区二区三区四区久久| 中文字幕av资源一区| 亚洲色图视频网| 亚洲午夜影视影院在线观看| 亚洲国产精品久久不卡毛片| 成人国产电影网| 92精品国产成人观看免费| 色噜噜狠狠一区二区三区果冻| 欧美日韩免费一区二区三区视频| 欧美另类久久久品| 亚洲线精品一区二区三区| 91污片在线观看| 3d动漫精品啪啪一区二区竹菊| 久久精品亚洲麻豆av一区二区| 久久精品国产成人一区二区三区| 欧美二区乱c少妇| 亚洲成人黄色影院| 国产在线看一区| 日韩视频免费观看高清在线视频| 欧美激情综合五月色丁香| 韩国av一区二区三区在线观看| 91精品国产91久久综合桃花 | 国产成人精品一区二区三区四区| 91蜜桃视频在线| 亚洲欧美激情在线| 狠狠色丁香久久婷婷综合丁香| 欧美一区二区三区小说| 麻豆精品久久久| 精品粉嫩aⅴ一区二区三区四区| 18成人在线观看| 久久精品国产秦先生| 精品乱人伦小说| 一区二区成人在线观看| 国产夫妻精品视频| 中文在线免费一区三区高中清不卡| 狠狠色丁香久久婷婷综| 国产区在线观看成人精品| 天天综合网天天综合色| 成人免费视频网站在线观看| 正在播放一区二区| 免费国产亚洲视频| 久久久久久99久久久精品网站| 亚洲成人av资源| 日韩一二三区视频| 国产老妇另类xxxxx| 日韩天堂在线观看| 国产成人夜色高潮福利影视| 国产精品国产馆在线真实露脸| 国产美女精品一区二区三区| 欧美精品在线观看一区二区| 黄页网站大全一区二区| 亚洲欧美怡红院| 欧美一区二区三区播放老司机 | 夜夜嗨av一区二区三区网页| 91精品国产入口| 国产成人久久精品77777最新版本| 亚洲私人影院在线观看| 日韩欧美国产一区二区在线播放| 亚洲综合999| 一本色道综合亚洲| 久久国产精品露脸对白| 亚洲日本在线天堂| 精品久久久久久亚洲综合网| 色综合久久久久综合99| 麻豆国产欧美日韩综合精品二区 | 国产欧美精品在线观看| 色又黄又爽网站www久久| 久久er精品视频| 亚洲综合视频在线观看| 欧美成人a在线| 在线观看亚洲精品| 亚洲综合另类小说| 国产欧美日韩久久| 日韩一区二区三区在线| 91老司机福利 在线| 久久99国产精品麻豆| 久久综合999| www.日韩在线| 一区二区三区在线视频免费观看| 精品欧美乱码久久久久久| 欧美午夜不卡视频| 天天av天天翘天天综合网| 91福利社在线观看| 粉嫩aⅴ一区二区三区四区| 日本中文字幕不卡| 久久久久97国产精华液好用吗| 欧美日韩中文国产| 日本韩国一区二区| 国产精品一二三区在线| 免费观看一级特黄欧美大片| 亚洲第一久久影院| 一片黄亚洲嫩模| 亚洲欧美在线另类| 国产精品三级av| 欧美日韩精品一区二区天天拍小说| 日本中文字幕一区| 日日摸夜夜添夜夜添精品视频 | 99精品国产视频| 国产成人在线影院| 国产成a人亚洲精品| 国内成人免费视频| 韩国女主播成人在线| 麻豆国产精品视频| 精品在线观看视频| 日本vs亚洲vs韩国一区三区二区| 亚洲bt欧美bt精品| 亚洲成人福利片| 日韩高清在线电影| 日韩国产一二三区| 美女视频网站久久| 激情综合网激情| 国产在线播放一区三区四| 国产精品一区在线观看你懂的| 激情国产一区二区| 国产91丝袜在线18| 9人人澡人人爽人人精品| 91亚洲永久精品| 欧美性生活一区| 欧美一卡二卡三卡| 精品日韩99亚洲| 国产精品美女一区二区在线观看| 中文字幕av一区二区三区免费看 | 精品一区二区三区免费播放| 国产真实精品久久二三区| 国产精品乡下勾搭老头1| av在线综合网| 精品视频在线免费看| 日韩美女视频在线| 国产视频一区在线观看 | 99麻豆久久久国产精品免费| 色综合 综合色| 日韩一区二区中文字幕| 国产日韩欧美a| 亚洲精选视频在线| 国产精品白丝在线| 亚洲成人激情自拍| 国产精品99久久久久久久vr| 91毛片在线观看| 欧美一区日本一区韩国一区| 久久亚洲综合色一区二区三区| 国产片一区二区三区| 一区二区三区蜜桃| 精品午夜久久福利影院| 色综合婷婷久久| 成人激情免费视频| 欧美日韩卡一卡二| 国产亚洲一区二区三区| 亚洲最大成人综合| 国产高清不卡一区| 欧美日韩视频在线一区二区| 国产视频一区二区在线观看| 亚洲高清免费观看高清完整版在线观看| 美国十次了思思久久精品导航| 成人av网址在线观看| 91精选在线观看| 亚洲人成网站在线| 国产寡妇亲子伦一区二区| 欧美日韩高清影院| 国产精品久久久久久久浪潮网站 | 日韩欧美一卡二卡| 自拍av一区二区三区| 久久成人免费电影| 欧美日韩成人综合在线一区二区| 国产日韩欧美电影| 久草热8精品视频在线观看| 日本韩国精品在线| 亚洲国产成人午夜在线一区 | 国产一区二区三区| 欧美精品粉嫩高潮一区二区| 亚洲欧美经典视频| 成人教育av在线| 久久蜜桃av一区二区天堂| 日韩精品福利网| 欧美日韩mp4| 亚洲一二三四区| 色8久久人人97超碰香蕉987| 欧美国产1区2区| 国产.欧美.日韩| 久久精品视频网| 国产一区二区三区观看| 欧美sm美女调教| 日韩av电影天堂| 欧美日韩国产一二三| 亚洲国产精品一区二区www在线| av在线不卡免费看| 国产精品福利一区| av不卡免费在线观看| 国产精品黄色在线观看| 豆国产96在线|亚洲| 国产精品久久久久久久久搜平片 |