




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、課 程 設 計 課程名稱題目名稱學生學院專業班級學 號學生姓名指導教師2015 年 12月 28日目錄一、課程設計目的與意義二、課程設計的要求三、設計說明3.1、設計思路3.2、設計方案3.3、運行環境3.4、設計重點四、詳細設計 4.1、主程序流程圖 4.2、校驗和函數、釋放資源函數流程圖 4.3、ICMP報首部函數流程圖五、程序的結果與分析六、課程設計心得體會附錄一:參考文獻附錄二:程序源代碼一、 課程設計的目的與意義利用ICMP數據包、C語言實現Ping命令程序,能實現基本的Ping操作,發送ICMP回顯請求報文,用于測試個主機到只一個主機之間的連通情況。通過本程序的訓練,熟悉ICMP報
2、文結構,對ICMP有更深的理解,掌握Ping程序的設計方法,掌握網絡編程的方法和技巧,從而編寫出功能更強大的程序。二、課程設計的要求1.已知參數:目的節點IP地址或主機名2.設計要求:通過原始套接字編程,實現Ping的基本功能2.1初始化Windows Sockets網絡環境;2.2解析命令行參數,構造目的端socket地址;2.3定義IP、ICMP報文;2.4接收ICMP差錯報文并進行解析。三、設計說明1設計思路由于Ping程序是面向用戶的應用程序,該程序使用ICMP的封裝機制,通過IP協議來工作。為了實現直接對IP和ICMP包進行操作,實驗中使用RAW模式的socket編程。首先定義IP數
3、據報首部,在IP數據報的基礎上定義ICMP數據報首部,并初始化一些全局變量。接著自定義填充ICMP數據報字段函數FillICMPData()、校驗和函數checksum()、解讀ICMP報首部函數DecodeICMPHeader()、釋放資源函Cleanup()。最后主函數通過調用這些函數來實現Ping命令功能。2. 設計方案IP頭與ICMP頭的設置分別參照RFC791及RFC792的標準,包含所有必要信息。主程序設置main()函數,主函數用庫函數實現套接字編程用于數據包發送及接收,其中,數據包發送調用sendto(),數據包接收調用recvfrom( ),由于發送數據包時可能會遇到阻塞或者
4、目標主機不通,造成超時,因此需要在發送數據包后調用一個函數判斷是否超時,此處調用庫函數setsockopt()來實現超時判斷;其次,校驗和函數采用移位方法進行計算。3. 系統運行環境:VC+ 6.0, Window 7操作系統平臺4. 設計中的重點首先遇到的問題就是套接字文件的問題。套接字所需要的文件有頭文件Winsocket2.h、庫文件WS2_32.LIB、動態庫W32_32.DLL。創建套接字的時候參數的以及在創建套接字之前必須首先使用WSAStartup函數、在使用完套接字之后要釋放內存資源,關閉套接字這些問題都是以前未接觸過的。所以在寫程序的時候需要查閱大量的資料,弄懂這些問題。其次
5、,在套接字問題解決之后,遇到的難題,也是比較重要的問題就是如何實現ICMP報文的發送和接受,以及怎樣判斷發送、接收超時或者找不到目的主機。最后在程序調試的時候總是出現這樣或那樣的錯誤,比如頭文件錯誤、動態庫無法導入、編輯器環境不匹配等。四、詳細設計 1、本程序主要是通過main()函數調用自定義函數以及其本身的一些功能,例如:打開socket動態庫、設置接收和發送超時值、域名地址解析、分配內存、創建及初始化ICMP報文、發送ICMP請求報文、接收ICMP 應答報文以及解讀應答報文和輸出Ping結果。程序流程圖如下:開始 定義及初始化各個全局變量判斷WSAStartup函數是否調用成功 否 輸出
6、調用失敗 是創建套接字以及設置socket接收超時,發送超時選項輸入PING的IP地址解析輸入內容,設置PING參數創建及填充ICMP數據報文判斷輸入的ip地址沒有-t并且已發四次 是Break 否 清除殘余 否發送,接收以及解析數據包結束輸出PIING結果2、校驗和函數、釋放資源函數流程圖如下:cleanup開始Checksu開始 if (m_hSocket != INVALID_SOCKE定義初始化cksum(size > 1) 是關閉套接字 否 是 否定cksum及size大小釋放占用資源清除ICMP包數據以及接受緩沖區if (size)WSACleanup(); 是cksum+=
7、*(UCHAR*)buffer; 否 結束計算校驗cksum,獲得結果結束3、ICMP報首部函數流程圖如下:DecodeICMPHeader定義相關變量以及初始化tick = GetTickCount()我們所要的回應報文輸出不是我們所要tick0icmpcount=tick -icmphdr->timestamp結束判斷時間是否小于1msprintf("Reply from %s: dytes=%d time=%d icmp_seq = %dn",inet_ntoa(from->sin_addr)printf("Reply from %s: dyte
8、s=%d time<1ms icmp_seq = %dn",inet_ntoa(from->sin_addr)icmpcount+結束五、程序的結構與分析 運行結果截圖如下:結果分析:1、Request timed out(請求超時)(1) 對方已關機,或者網絡上根本沒有這個地址:比如在上圖中Ping 14.150.213.222(2)對方與自己不在同一網段內,通過路由也無法找到對方,但有時對方確實是存在的,當然不存在也是返回超時的信息。(3)對方確實存在,但設置了ICMP數據包過濾(比如防火墻設置)。2、Destination host Unreachable(目標不可
9、達)(1)錯誤設置IP地址六、課程設計心得體會本次課程設計較好地實現了要求做到的功能,但同時也遇到不少的困難和挑戰。通過這次設計,不但加深了對Socket的原始套接字編程的理解,經過實現Ping程序,熟悉了IP、ICMP等,掌握TCP/IP網絡協議的基本實現方法。也熟悉了Window網絡編程的技術。能熟悉地使用套接字進行網絡通信。熟悉了數據通信的網絡技術,同時學會了跟同學合作交流完成項目的討論方法和解決問題的能力。學會如果通過討論、交流、找資料來獨立解決所遇到的問題和不懂。更多地鍛煉了獨立解決問題的能力。在編寫過程中,一些基本的常見的函數不會應用,這使我們小組都發現自己知識的匱乏,在以后的學習
10、過程中得要好好的努力,多閱讀一些復雜的程序,了解一個基本的函數,算法和精良的編程思想,更要多動手寫一些有一定難度的程序,我們不應該害怕寫程序出錯,應該大膽地寫出自己的想法,出現錯誤去解決錯誤就能找出自己知識的漏洞和模糊點。我們還可以通過閱讀別人錯誤的程序,試著幫別人查找錯誤,這樣證書技能頭腦中的規則還能發現一些初學者一番的錯誤,使自己少走彎路。附錄一:參考文獻【1】 計算機網絡 謝希仁編著 電子工業出版社【2】C程序設計 譚浩強編著 北京清華大學出版社附錄二:程序源代碼及部分注釋#include "stdafx.h"#pragma comment(lib,"ws2
11、_32.lib")#include <winsock2.h>/創建套接字頭文件#include <ws2tcpip.h>#include <stdio.h>/標準輸入輸出函數#include <stdlib.h>/實用程序庫函數#include <string.h>#include <windows.h>typedef struct iphdr unsigned int h_len:4; / 頭長度unsigned int version:4; / IP版本 unsigned char service; / 服務
12、類型 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;#define ICMP_ECHO 8 /ICMP報文類型,回顯請求 #define IC
13、MP_ECHOREPLY 0 /ICMP報文類型,回顯響應應答#define ICMP_MIN 8 /最小的ICMP數據報大小 typedef struct icmphdr BYTE i_type; /ICMP報文類型 BYTE i_code; /該類型中的代碼號 USHORT i_cksum; /校驗和 USHORT i_id; /惟一的標識符 USHORT i_seq; /序列號 ULONG timestamp; /時間戳 IcmpHeader;#define DEF_PACKET_SIZE 32 /默認數據報大小#define MAX_PACKET 1024 / 最大的ICMP數據報大小
14、 #define MAX_IP_HDR_SIZE 60 / 最大IP頭長度 /初始化全局變量 int datasize=DEF_PACKET_SIZE;char *icmp_data=NULL;char *recvbuf=NULL;SOCKET m_hSocket= INVALID_SOCKET;char *lpdest=NULL;/填充ICMP數據報字段函數void FillICMPData(char *icmp_data, int datasize) IcmpHeader *icmp_hdr = NULL; char *datapart = NULL; icmp_hdr = (IcmpHe
15、ader*)icmp_data; icmp_hdr->i_type = ICMP_ECHO; icmp_hdr->i_code = 0; icmp_hdr->i_id = (USHORT)GetCurrentProcessId();/GetCurrentProcessId()獲取當前進程的標示符(PID) icmp_hdr->i_cksum = 0; icmp_hdr->i_seq = 0; datapart = icmp_data + sizeof(IcmpHeader);/校驗和函數USHORT checksum(USHORT *buffer, int siz
16、e) 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);/解讀ICMP報首部函數void DecodeICMPHeader(char *buf, int bytes, SOCKADDR_IN *fr
17、om) IpHeader *iphdr = NULL; IcmpHeader *icmphdr = NULL; unsigned short iphdrlen; DWORD tick; static int icmpcount = 0; iphdr = (IpHeader *)buf;/從buf中獲取IP數據包頭指針 iphdrlen = iphdr->h_len * 4; tick = GetTickCount(); if (bytes < iphdrlen + ICMP_MIN) printf("Too few bytes from %s rn",inet_
18、ntoa(from->sin_addr); icmphdr = (IcmpHeader*)(buf + iphdrlen);/定位ICMP包頭起始位置 if (icmphdr->i_type != ICMP_ECHOREPLY) printf("nonecho type %d received rn", icmphdr->i_type); if (icmphdr->i_id != (USHORT)GetCurrentProcessId() printf("其他程序的回應報文! t錯誤代碼 %dn", WSAGetLastError
19、(); int tick0;tick0=tick - icmphdr->timestamp;if(tick0<1)printf("Reply from%s: bytes=%d time<1ms icmp_seq =%dn",inet_ntoa(from->sin_addr), bytes, icmphdr->i_seq );else printf("Reply from %s: bytes=%d time=%dms icmp_seq =%dn",inet_ntoa(from->sin_addr), bytes,tick
20、0, icmphdr->i_seq); /釋放資源函數void Cleanup() if (m_hSocket != INVALID_SOCKET) closesocket(m_hSocket); HeapFree(GetProcessHeap(), 0, recvbuf); HeapFree(GetProcessHeap(), 0, icmp_data); WSACleanup();/主函數void main()WSADATA wsaData;char a100;printf("ping ");gets(a);lpdest=a;SOCKADDR_IN m_addrD
21、est;/結構體SOCKADDR_IN m_addrFrom;int timeout=1000;USHORT seq_no=0;if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)printf("Sorry, you cannot load socket dll!");m_hSocket = WSASocket (AF_INET, SOCK_RAW, IPPROTO_ICMP, NULL, 0,WSA_FLAG_OVERLAPPED);/創建原始套接字,該套接字用于ICMP協議 if (m_hSocket = INVALID_
22、SOCKET) /如果套接字創建不成功 printf("socket 創建失敗!"); int bread = setsockopt(m_hSocket, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout);/設置接收的超時值 if(bread = SOCKET_ERROR) printf("設置socket接收超時選項錯誤!"); timeout = 1000; bread = setsockopt(m_hSocket, SOL_SOCKET, SO_SNDTIMEO, (char
23、*)&timeout, sizeof(timeout);/設置發送的超時值 if (bread = SOCKET_ERROR) printf("設置socket發送超時選項錯誤!"); memset(&m_addrDest, 0, sizeof(m_addrDest);/ 用0初始化目的地地址 m_addrDest.sin_family = AF_INET;/設置地址族,這里表示使用IP地址族 if (m_addrDest.sin_addr.s_addr = inet_addr(lpdest) = INADDR_NONE)/地址轉化 struct hoste
24、nt *hp = NULL; if (hp = gethostbyname(lpdest) != NULL) /名字解析,根據主機名獲取IP地址 memcpy(&(m_addrDest.sin_addr), hp->h_addr, hp->h_length);/將獲取到的IP值賦給目的地地址中的相應字段m_addrDest.sin_family = hp->h_addrtype; /將獲取到的地址族值賦給目的地地址中的相應字段 else printf("不能找到名為 %s 的主機t錯誤代碼 %dn",lpdest, WSAGetLastError(
25、);/獲取不成功exit(0); printf("Pinging %s with 64 bytes of data: nn", inet_ntoa(m_addrDest.sin_addr); /inet_ntoa()將網絡地址轉換成“.”點隔的字符串格式 datasize += sizeof(IcmpHeader); /數據報文大小需要包含ICMP報頭/根據默認堆句柄,從堆中分配MAX_PACKET內存塊,新分配內存的內容將被初始化為0 icmp_data=(char*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,MAX_PACK
26、ET); recvbuf =(char*) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,MAX_PACKET); if (!icmp_data) /如果分配內存不成功 printf("堆分配錯誤!"); memset(icmp_data,0,MAX_PACKET);/將已開辟內存空間 icmp_data 的首 MAX_PACKET 個字節的值設為值 0。 FillICMPData(icmp_data,datasize);/創建ICMP報文, / 開始發送或接受ICMP包int n
27、Count=0; while(1) int bwrote; if(strstr(a,"-t")=NULL&&nCount+=4) /判斷a字符數組中是否包含-t參數并且已發ICMP包4次 break;/超過指定的記錄條數則退出 (IcmpHeader*)icmp_data)->i_cksum = 0;/計算校驗和前要把校驗和字段設置為0 (IcmpHeader*)icmp_data)->timestamp = GetTickCount();/獲取操作系統啟動到現在所經過的毫秒數,設置時間戳 (IcmpHeader*)icmp_data)->i_seq = seq_no+;/設置序列號 (IcmpHeader*)icmp_data)->i_cksum = checksum(USHORT*)icmp_data, datasize);/計算校
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 聚酯底漆行業深度研究分析報告(2024-2030版)
- 2025年 公路交通安全生產管理能力考試練習題附答案
- 2025年 蚌埠行知高級中學招聘考試筆試試題附答案
- 2023-2028年中國干果堅果行業市場發展監測及投資戰略咨詢報告
- 中國纖維柄斧子行業市場發展前景及發展趨勢與投資戰略研究報告(2024-2030)
- 中國天花板行業市場深度研究及發展趨勢預測報告
- 2025年中國點陣式顯示器行業發展潛力分析及投資方向研究報告
- 中國紫膠行業市場調查報告
- 2025年中國止擋片行業市場發展前景及發展趨勢與投資戰略研究報告
- 中國空調壓縮機減震墊行業市場發展前景及發展趨勢與投資戰略研究報告(2024-2030)
- MOOC 數據挖掘與python實踐-中央財經大學 中國大學慕課答案
- (正式版)JBT 14790-2024 往復式內燃機曲軸轉角 信號盤
- 勘察設計工作量及計劃安排方案
- T-CSEM 0024-2024 智慧消防 火災防控系統建設要求
- 國家開發大學電大《心理學》課程形成性考核冊試題及答案(1-4)
- 2024年中考語文復習考點幫考點四 標點符號(解析版)
- 2023年老年病科半年工作總結報告
- 嗆咳病人的護理措施
- 護理責任組長崗位競聘
- 校園文印室外包服務投標方案(技術標)
- 臺州簡介課件
評論
0/150
提交評論