版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、ping程序分析報告課程名稱:老 師:姓 名:班 級:學(xué) 號:日 期:目錄1、Ping功能簡介12、程序流程圖(1)主函數(shù)流程圖3(2)創(chuàng)立套接字流程圖 3(3)建立IP選項頭部流程圖 4 創(chuàng)立SockRav隙接字的接收/發(fā)送時限屬性流程圖 4(5)判斷終端的主機名獲取信息流程圖 5(6)分配堆內(nèi)存流程圖 5(7)接收/發(fā)送ICMF據(jù)包流程圖 6(8)清空Socket庫所占內(nèi)存 7(9)傳參解析函數(shù)流程圖 7(10)解析IP選項函數(shù)流程圖 83、源代碼清單84、心得體會 161、ping功能簡介Ping是DO騏令,一般用于檢測網(wǎng)絡(luò)通與不通,也叫時延,其值越大,速度越慢PING (Packet
2、Internet Grope) ,因特網(wǎng)包探索器,用于測試網(wǎng)絡(luò) 連接量的程序.Ping發(fā)送一個ICMP回聲請求消息給目的地并報告是否 收到所希望的ICMP回聲應(yīng)答.它是用來檢查網(wǎng)絡(luò)是否通暢或者網(wǎng)絡(luò)連接速度的命令.作為一個生活在網(wǎng)絡(luò)上的治理員或者黑客來說,ping命令是第一個必須掌握的DOS命令,它所利用的原理是這樣的:網(wǎng)絡(luò)上的機器都有唯一確定的IP地址,我們給目標(biāo)IP地址發(fā)送一個數(shù)據(jù)包,對方就要返回一個同樣大小 的數(shù)據(jù)包,根據(jù)返回的數(shù)據(jù)包我們可以確定目標(biāo)主機的存在,可以初步判斷目標(biāo)主機的操作系統(tǒng)等.Ping是Windows系列自帶的一個可執(zhí)行命令.利用它可以檢查網(wǎng) 絡(luò)是否能夠連通,用好它可以很
3、好地幫助我們分析判定網(wǎng)絡(luò)故障.應(yīng)用格式:Ping IP地址.該命令還可以加許多參數(shù)使用,具體是鍵入Ping按回車即可看到詳細說明.ping指的是端對端連通,通常用來作為可用性的檢查,但是某些病毒木馬會強行大量遠程執(zhí)行ping命令搶占你的網(wǎng)絡(luò)資源,導(dǎo)致系統(tǒng)變慢,網(wǎng)速變慢.2、程序流程圖圖2創(chuàng)立套接字流程圖調(diào)用memset()函數(shù)填充數(shù)據(jù)段圖3 建立IP選項頭部流程圖取得錯誤的進程號,輸出錯誤信息退出main函數(shù)圖4 創(chuàng)立SockRaw套接字的接收/發(fā)送時限屬性流程圖圖5判斷終端的主機名獲取信息流程圖圖6分配堆內(nèi)存流程圖圖7 接收/發(fā)送ICMP數(shù)據(jù)包流程圖圖8清空Socket庫所占內(nèi)存i=1i&l
4、t;agrc容數(shù)組argv第i行第1歹U / 廠字符轉(zhuǎn)化為小寫字/ 轉(zhuǎn)化后他字母、判斷數(shù)組argv第i行第0列/ 的字符是否為數(shù)字YESNObRecordRoute =TRUE ;退出;調(diào)用usage()函數(shù);退出;將數(shù)組argv第i行的字符轉(zhuǎn)化為長整型數(shù)賦給datasize將數(shù)組argv第i行的字符賦給Ipdesti+圖9傳參解析函數(shù)流程圖圖10解析IP首部函數(shù)流程圖3、源代碼清單/ Module Name: Ping.c#include "windows.h"#include "winsock.h"#include "stdio.h&quo
5、t;/IP記錄路由/ICMP回顯#define IP_RECORD_ROUTE0x7#define ICMP_ECHO8#define ICMP_ECHOREPLY#define ICMP_MIN8#define DEF_PACKET_SIZE32#define MAX_PACKET#define MAX_IP_HDR_SIZE600/ICMP回顯應(yīng)答/ICMP數(shù)據(jù)包最小長度過失報文長度0x10000/ ICMP包最大長度/IP首部最大字節(jié)數(shù)/IP頭文件定義typedef struct _iphdr unsigned intunsigned intunsigned char unsigned
6、short unsigned short unsigned short unsigned char unsigned char unsigned short unsigned intunsigned inth_len:4;/頭部長度 4字節(jié)version:4; /IP 版本號 IPv4tos; /效勞類型total_len; /數(shù)據(jù)包總長度ident; /ID 標(biāo)識frag_and_flags;/3位標(biāo)志,13位片偏移ttl; /生存期proto; /協(xié)議類型checksum; /IP頭部的檢驗和sourceIP; / 源地址destIP; /目的地址 IpHeader;/ICMP頭部定義ty
7、pedef struct _icmphdrBYTE i_type; /ICMP 類型8 位BYTE i_code;代碼類型8位USHORT i_cksum;/頭部及數(shù)據(jù)檢驗和16位USHORT i_id;ID/ 標(biāo)識USHORT i_seq; / 序歹 U 號ULONG timestamp; 時間戳 IcmpHeader;/IP選項首部定義typedef struct _ipoptionhdrunsigned char code; /IP 選項的類型unsigned char len; /RR選項總字節(jié)長度unsigned char ptr; /指針字段unsigned long addr9;
8、 / IP 地址清單 IpOptionHeader;BOOL bRecordRoute;int datasize;char *lpdest;定義3個全局變量使用信息void usage(char *progname)(printf("usage: ping -r data sizen");printf(" -r record routen");printf(" host remote machine to pingn");printf(" datasize can be up to 0x10000 Byten");
9、ExitProcess(-l); / 結(jié)束進程)/ICMP首部初始化void FillICMPData(char *icmp_data, int datasize)(IcmpHeader *icmp_hdr = NULL;char *datapart = NULL; /指針定義及初始化icmp_hdr = (IcmpHeader*)icmp_data;icmp_hdr->i_type = ICMP_ECHO; /ICMP 回顯請求icmp_hdr->i_code = 0;icmp_hdr->i_id = (USHORT)GetCurrentProcessId();/ 取得當(dāng)前
10、進程號icmp_hdr->i_cksum = 0; / 檢驗和字段置 0icmp_hdr->i_seq = 0;datapart = icmp_data + sizeof(IcmpHeader); /datapart 指針指向數(shù)據(jù)寸艮文開頭 memset(datapart, 'E', datasize - sizeof(IcmpHeader); / 填充數(shù)據(jù)段)計算檢驗和USHORT checksum(USHORT *buffer, int size)(unsigned long cksum = 0;/ 檢驗和字段置 0while (size > 1) (ck
11、sum += *buffer+;size -= sizeof(USHORT);) if (size)(cksum += *(UCHAR*)buffer;)cksum = (cksum >> 16) + (cksum & 0xffff);/ 將檢驗和字段高 16位右移16位再與低16位相加cksum += (cksum >>16);/將所加的檢驗和再與剩余低16位相加return (USHORT)(cksum);/檢驗和取反,并返回)/解析IP選項void DecodeIPOptions(char *buf, int bytes)(IpOptionHeader *
12、ipopt = NULL;IN_ADDR inaddr; 聲明結(jié)構(gòu)體int i;HOSTENT *host = NULL;ipopt = (IpOptionHeader *)(buf + 20); /去掉IP首部,指針指向數(shù)據(jù)選項首部printf("RR:");for(i = 0; i < (ipopt->ptr / 4) - 1; i+)(inaddr.S_un.S_addr = ipopt->addri;if (i != 0)(printf("");)host = gethostbyaddr(char *)&inaddr.S
13、_un.S_addr, sizeof(inaddr.S_un.S_addr), AF_INET);/ 通過 IP 地址獲得 主機信息if (host)(printf("(%-15s) %sn", inet_ntoa(inaddr), host->h_name);/打印IP地址和主機名)else(printf("(%-15s)n", inet_ntoa(inaddr); / 打印 IP 地址)return;)/解析ICMP首部函數(shù)void DecodeICMPHeader(char *buf, int bytes, struct sockaddr_i
14、n *from)(IpHeader *iphdr = NULL;IcmpHeader *icmphdr = NULL;unsigned short iphdrlen;DWORD tick; /毫秒級數(shù)static int icmpcount = 0;iphdr = (IpHeader *)buf;iphdrlen = iphdr->h_len * 4; /IP 首部實際長度tick = GetTickCount();/ 獲得毫秒級數(shù)if (iphdrlen = MAX_IP_HDR_SIZE) && (!icmpcount) /判斷是否為一個 IP 數(shù)據(jù)包(DecodeI
15、POptions(buf, bytes); 調(diào)用 IP 選項解析函數(shù) )if (bytes < iphdrlen + ICMP_MIN) 判斷 IP 數(shù)據(jù)包長度 (printf("Too few bytes from %sn", inet_ntoa(from->sin_addr);)icmphdr = (IcmpHeader*)(buf + iphdrlen); / 指針指向 ICMP 報文首部if (icmphdr->i_type != ICMP_ECHOREPLY) / 判斷 ICMP 類型是否為 ICMP 回顯應(yīng)答 (printf("non
16、echo type %d recvdn", icmphdr->i_type); / 輸出其類型 return;)if (icmphdr->i_id != (USHORT)GetCurrentProcessId()/ 獲得當(dāng)前進程的 ID,判斷是否為 ICMP 標(biāo)識 (printf("someone else's packet!n");return ;)printf("%d bytes from %s:", bytes, inet_ntoa(from->sin_addr);printf(" icmp_seq =
17、 %d. ", icmphdr->i_seq); / 輸出 ICMP 序列號printf(" time: %d ms", tick - icmphdr->timestamp); / 打印時間戳printf("n");icmpcount+;return;)傳參解析函數(shù)void ValidateArgs(int argc, char *argv)(int i;bRecordRoute = FALSE;賦初值lpdest = NULL;datasize = DEF_PACKET_SIZE; /初始化datasize,使其等于過失報文長度f
18、or(i = 1; i < argc; i+) (if (argvi0 = '-') | (argvi0 = '/') /判斷數(shù)組 argv 第 i 行第 0 列是否為-"或'/'(switch (tolower(argvi1) /將數(shù)組argv第i行第1列的字符轉(zhuǎn)化為小寫字母(case T: /記錄路由選項bRecordRoute = TRUE;break;default:usage(argv0);調(diào)用 usage函數(shù)break;)else if (isdigit(argvi0) /判斷數(shù)組argv第i行第0列是否為數(shù)字(dat
19、asize = atoi(argvi); /將數(shù)組argv第i行的字符轉(zhuǎn)化成長整型數(shù))else(Ipdest = argvi;)/main函數(shù)int main(int argc, char *argv) / argc 代表命令行中的參數(shù)個數(shù),* *argv 是指向字符串的指針(char *icmp_data = NULL;char *recvbuf = NULL;USHORT seq_no = 0;定義及初始化struct sockaddr_in dest = '0'struct sockaddr_in from= '0'struct hostent *hp =
20、 NULL;聲明結(jié)構(gòu)體int bread = 0;int ret = 0;int fromlen = sizeof(from);int timeout = 1000;unsigned int addr = 0;定義及初始化WSADATA wsaData; /聲明數(shù)據(jù)結(jié)構(gòu)SOCKET sockRaw = INVALID_SOCKET;IpOptionHeader ipopt = '0'if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)/指明程序請求使用的socket版本,返回請求的版本信息printf("WSAStart
21、up() failed: %dn", GetLastError();/ 獲得當(dāng)前的進程錯誤號,并輸出請求版本信息失敗return 2;VaIidateArgs(argc, argv);/ 調(diào)用傳參解析函數(shù)sockRaw = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);/ 創(chuàng)立 sockRaw 套接字 if (sockRaw = INV ALID_SOCKET)/ 創(chuàng)立失敗(printf("WSASocket() failed: %dn", WSAGetLastError(); return 3;/返回值3,并退出main函數(shù) )
22、 if (bRecordRoute) (ZeroMemory(&ipopt, sizeof(ipopt);ipopt.code = IP_RECORD_ROUTE;ipopt.ptr = 4; /指向第一個地址列表 ipopt.len = 39;ret = setsockopt(sockRaw, IPPROTO_IP, IP_OPTIONS, (char *)&ipopt, sizeof(ipopt);/ 設(shè)置 sockRaw 套接字屬性 if (ret = SOCKET_ERROR)/ 設(shè)置屬性失敗 (printf("setsockopt(IP_OPTIONS) f
23、ailed: %dn",WSAGetLastError();/取得當(dāng)前錯誤進程號,并輸出屬性設(shè)置失敗) ) bread = setsockopt(sockRaw, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout);/ 設(shè)置套接字接收時限屬性 if(bread = SOCKET_ERROR)/ 設(shè)置失敗 (printf("setsockopt(SO_RCVTIMEO) failed: %dn", WSAGetLastError();return -1;返回值-1 ,并退出main函數(shù) ) ti
24、meout = 1000;bread = setsockopt(sockRaw, SOL_SOCKET, SO_SNDTIMEO, (char*)&timeout, sizeof(timeout);/ 設(shè)置套接字發(fā)送時限屬性 if (bread = SOCKET_ERROR)/ 設(shè)置發(fā)送時限失敗 (printf("setsockopt(SO_SNDTIMEO) failed: %dn", WSAGetLastError();return -1;返回值-1,并退出main函數(shù))memset(&dest, 0, sizeof(dest);/ 填充數(shù)據(jù)段,dest
25、.sin_family = AF_INET;/ 指定地址族if (dest.sin_addr.s_addr = inet_addr(lpdest) = INADDR_NONE) 網(wǎng)絡(luò)地址是無效的地址( if (hp = gethostbyname(lpdest) != NULL) (memcpy(&(dest.sin_addr), hp->h_addr, hp->h_length);dest.sin_family = hp->h_addrtype;將 hp->h_addrtype 的類型賦給 dest.sin_family printf("dest.s
26、in_addr = %sn", inet_ntoa(dest.sin_addr);/ 輸出 IP 地址) else ( printf("gethostbyname() failed: %dn", WSAGetLastError();return -1;退出main函數(shù),并返回值-1 ) )datasize += sizeof(IcmpHeader);icmp_data = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY , MAX_PACKET);/ 分配堆內(nèi)存 recvbuf = HeapAlloc(GetProcess
27、Heap(), HEAP_ZERO_MEMORY , MAX_PACKET);if (!icmp_data)/ 分配失敗 (printf("HeapAlloc() failed: %dn", GetLastError();/獲得當(dāng)前錯誤進程號,輸出堆內(nèi)存分配失敗return -1; /退出main函數(shù),并返回值-1)memset(icmp_data,0,MAX_PACKET);/ 填充數(shù)據(jù)段FillICMPData(icmp_data,datasize);/ 調(diào)用 ICMP 初始化函數(shù) while(1) (static int nCount = 0; / 初始化int bw
28、rote;if (nCount+ = 4) (break;結(jié)束整個循環(huán) )(IcmpHeader*)icmp_data)->i_cksum = 0;(IcmpHeader*)icmp_data)->timestamp = GetTickCount();/ 設(shè)定時間戳 (IcmpHeader*)icmp_data)->i_seq = seq_no+;/ 設(shè)置 ICMP 頭部序列號 (IcmpHeader*)icmp_data)->i_cksum =checksum(USHORT*)icmp_data, datasize);/調(diào)用計算檢驗和函數(shù),將其返回值賦給i_cksum
29、bwrote = sendto(sockRaw, icmp_data, datasize, 0, (struct sockaddr*)&dest, sizeof(dest); / 發(fā)送 ICMP 數(shù)據(jù)包 if (bwrote = SOCKET_ERROR) / 發(fā)送失敗 (if (WSAGetLastError() = WSAETIMEDOUT) /當(dāng)前錯誤進程號為超時(printf("timed outn"); continue; /結(jié)束本次循環(huán) )printf("sendto() failed: %dn", WSAGetLastError()
30、;return -1; /退出main函數(shù),并返回值-1 )if (bwrote < datasize)/ 已發(fā)送字節(jié)數(shù)小于 datasize (printf("Wrote %d bytesn", bwrote);)bread = recvfrom(sockRaw, recvbuf, MAX_PACKET, 0, (struct sockaddr*)&from, &fromlen);/ 接收 ICMP 數(shù) 據(jù)包if (bread = SOCKET_ERROR) / 接收失敗 (if (WSAGetLastError() = WSAETIMEDOUT) /當(dāng)前錯誤進程號為超時(printf("timed outn");continue; /結(jié)束本次循環(huán) )printf("recvfrom() failed: %dn", WSAGetLastError();return -1;退出main函數(shù),并返回值-1 )DecodeICMPHeader(recvbuf, bread, &from); / 調(diào)用解析 ICMP 頭部函數(shù) Sleep(
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版高校科研成果轉(zhuǎn)化合同管理規(guī)定2篇
- 2025年度社區(qū)垃圾分類與回收處理服務(wù)合同范本2篇
- 2025年度智能交通系統(tǒng)技術(shù)改造合同2篇
- 二零二五年度房地產(chǎn)維修基金補充協(xié)議合同模板3篇
- 2025年度生鮮乳產(chǎn)業(yè)鏈上下游協(xié)同發(fā)展協(xié)議3篇
- 螞蟻運糧項目課程設(shè)計
- 2025年度汽車租賃合同糾紛調(diào)解協(xié)議書2篇
- 二零二五年度干掛石材研發(fā)與生產(chǎn)合作協(xié)議2篇
- 海南衛(wèi)生健康職業(yè)學(xué)院《植物學(xué)實驗》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025年度男方債務(wù)處理離婚協(xié)議示范書3篇
- 設(shè)立出國留學(xué)服務(wù)公司商業(yè)計劃書
- 2021火災(zāi)高危單位消防安全評估導(dǎo)則
- 法院安保工作管理制度
- 2023年簽證專員年度總結(jié)及下一年規(guī)劃
- 國培教師個人成長案例3000字
- 醫(yī)院保安服務(wù)方案(技術(shù)方案)
- 員工素質(zhì)教育課件
- 高效能人士的七個習(xí)慣:實踐應(yīng)用課程:高級版
- 中國馬克思主義與當(dāng)代思考題(附答案)
- ESD靜電防護檢測及管控標(biāo)準(zhǔn)
- 結(jié)核病診斷-TSPOT-實驗課件
評論
0/150
提交評論