基于ICMP的主機存活性探測原理與實現_第1頁
基于ICMP的主機存活性探測原理與實現_第2頁
基于ICMP的主機存活性探測原理與實現_第3頁
基于ICMP的主機存活性探測原理與實現_第4頁
基于ICMP的主機存活性探測原理與實現_第5頁
已閱讀5頁,還剩2頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

基于ICMP的主機存活性探測原理與實現1. 工作原理 ICMP是“InternetControlMessageProtocol(Internet控制消息協議)的縮寫它是TCP/IP協議族的一個子協議,用于在IP主機路由器之間傳遞控制消息控制消息是指網絡通不通主機是否可達路由是否可用等網絡本身的消息這些控制消息雖然并不傳輸用戶數據,但是對于用戶數據的傳遞起著重要的作用2.程序設計(1)設計要求 通過這次設計,要求了解TCP/IP的基本協議的工作原理和基本的網絡編程知識,利用單(多)線程技術、API函數等編寫服務和客戶端應用程序,利用MFC提供的類編寫較為復雜網絡應用程序。同時,在程序設計方法以及上機操作等基本技能和科學作風方面受到比較系統和嚴格的訓練。 (2) 主要代碼 /定義ICMP結構體。typedef struct icmp_hdr unsigned char icmp_type; / 消息類型 unsigned char icmp_code; / 代碼 unsigned short icmp_checksum; / 校驗和 / 下面是回顯頭 unsigned short icmp_id; / 用來惟一標識此請求的ID號,通常設置為進程ID unsigned short icmp_sequence; / 序列號 unsigned long icmp_timestamp; / 時間戳 ICMP_HDR, *PICMP_HDR;typedef struct _iphdr unsigned int h_len:4; /頭長度 unsigned int version:4;/IP版本 unsigned char tos; /服務類型 unsigned short total_len;/包的總長度 unsigned short ident; /包標識身份 unsigned short frag_and_flags;/標志 unsigned char ttl; /包生命周期 unsigned char proto; /協議類型 unsigned short checksum; /IP校驗 unsigned int sourceIP; /源IP unsigned int destIP; /目標IP IPHeader; /設置最長存活期 BOOLCICMPDlg:SetTTL(SOCKETs,intnValue)intret=setsockopt(s,IPPROTO_IP,IP_TTL,(char*)&nValue,sizeof(nValue);returnret!=SOCKET_ERROR;/設置超時時間BOOLCICMPDlg:SetTimeout(SOCKETs,intnTime,BOOLbRecv)intret=setsockopt(s,SOL_SOCKET,bRecv?SO_RCVTIMEO:SO_SNDTIMEO,(char*)&nTime,sizeof(nTime);returnret!=SOCKET_ERROR;/檢查校驗和USHORTCICMPDlg:checksum(USHORT*buff,intsize)unsignedlongcksum=0;while(size1)cksum+=*buff+;size-=sizeof(USHORT);/是奇數if(size)cksum+=*(UCHAR*)buff;/將32位的chsum高16位和低16位相加,然后取反cksum=(cksum16)+(cksum&0xffff);cksum+=(cksum16);return(USHORT)(cksum); UpdateData(true);intcount=m_list.GetItemCount();charszDestIp=10.0.0.2;/127.0.0.1WSADATAWSAData;if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0)MessageBox(WSAStartup初始化失敗。);return;/發送一個ICMP包,接受到返回的包之后開始解析。/創建原始套節字SOCKETsRaw=socket(AF_INET,SOCK_RAW,IPPROTO_ICMP);/設置接收超時SetTimeout(sRaw,1000,TRUE);intIpAddress;IpAddress=inet_addr(m_Address);/IpAddress=inet_addr(10.0.0.2);if(IpAddress=INADDR_NONE)MessageBox(IP地址錯誤!);hostent*pHostent=gethostbyname(m_Address);if(pHostent)IpAddress=(*(in_addr*)pHostent-h_addr).s_addr;/設置目的地址SOCKADDR_INdest;memset(&dest,0,sizeof(dest);dest.sin_family=AF_INET;dest.sin_port=htons(0);dest.sin_addr.S_un.S_addr=IpAddress;/創建ICMP封包charbuffsizeof(ICMP_HDR)+32;memset(buff,0,sizeof(buff);memset(&buffsizeof(ICMP_HDR),E,32);/USHORTnSeq=0;charrecvBuf1024;SOCKADDR_INfrom;intnLen=sizeof(from);intnRet;ICMP_HDR*pIcmp=(ICMP_HDR*)buff;pIcmp-icmp_type=8;/請求一個ICMP回顯pIcmp-icmp_code=0;pIcmp-icmp_id=(USHORT)GetCurrentProcessId();pIcmp-icmp_timestamp=GetTickCount();pIcmp-icmp_sequence=1;pIcmp-icmp_checksum=checksum(USHORT*)buff,sizeof(ICMP_HDR)+32);nRet=sendto(sRaw,buff,sizeof(ICMP_HDR)+32,0,(SOCKADDR*)&dest,sizeof(dest);if(nRet=SOCKET_ERROR)MessageBox(發送錯誤!);return;nRet=recvfrom(sRaw,recvBuf,1024,0,(sockaddr*)&from,&nLen);if(nRet=SOCKET_ERROR)if(WSAGetLastError()=WSAETIMEDOUT)m_list.InsertItem(count,m_Address);m_list.SetItemText(count,1,關閉);return;return;/下面開始解析接收到的ICMP封包if(nReticmp_type!=0)/回顯 m_list.InsertItem(count,m_Address);m_list.SetItemText(count,1,關閉);return;if(pRecvIcmp-icmp_id!=GetCurrentProcessId()m_list.InsertItem(count,m_Address);m_list.SetItemText(count,1,關閉);ret

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論