版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、計計算機硬件基算機硬件基礎(chǔ)教學(xué)礎(chǔ)教學(xué)中心中心Copyright by NUPT All rights reserved.1Technology of Network Programming網(wǎng)絡(luò)編程技術(shù)網(wǎng)絡(luò)編程技術(shù)網(wǎng)絡(luò)編程技術(shù)網(wǎng)絡(luò)編程技術(shù)2 路由器是實現(xiàn)路由器是實現(xiàn)IP協(xié)議最為關(guān)鍵協(xié)議最為關(guān)鍵的設(shè)備之一。通過簡單路由器的設(shè)備之一。通過簡單路由器程序的設(shè)計與實現(xiàn),掌握路由程序的設(shè)計與實現(xiàn),掌握路由器基本工作原理,理解路由選器基本工作原理,理解路由選擇與數(shù)據(jù)包轉(zhuǎn)發(fā)的方法擇與數(shù)據(jù)包轉(zhuǎn)發(fā)的方法網(wǎng)絡(luò)編程技術(shù)網(wǎng)絡(luò)編程技術(shù)3 編程訓(xùn)練目的編程訓(xùn)練目的 編程訓(xùn)練要求編程訓(xùn)練要求 相關(guān)知識介紹相關(guān)知識介紹 程序設(shè)
2、計分析程序設(shè)計分析 擴展與提高擴展與提高網(wǎng)絡(luò)編程技術(shù)網(wǎng)絡(luò)編程技術(shù)4 在理解在理解IP協(xié)議、協(xié)議、ICMP協(xié)議與路由選擇基本工協(xié)議與路由選擇基本工作原理的基礎(chǔ)上,完成路由器基本功能的設(shè)計作原理的基礎(chǔ)上,完成路由器基本功能的設(shè)計與編程實現(xiàn)與編程實現(xiàn) 掌握掌握Windwos平臺下路由程序測試環(huán)境的搭建平臺下路由程序測試環(huán)境的搭建方法方法 熟悉熟悉Winpcap編程,掌握數(shù)據(jù)包捕獲與發(fā)送的編程,掌握數(shù)據(jù)包捕獲與發(fā)送的方法。熟悉動態(tài)路由協(xié)議原理以及動態(tài)路由表方法。熟悉動態(tài)路由協(xié)議原理以及動態(tài)路由表的實現(xiàn)方法的實現(xiàn)方法網(wǎng)絡(luò)編程技術(shù)網(wǎng)絡(luò)編程技術(shù)5 編程訓(xùn)練目的編程訓(xùn)練目的 編程訓(xùn)練要求編程訓(xùn)練要求 相關(guān)知識
3、介紹相關(guān)知識介紹 程序設(shè)計分析程序設(shè)計分析 擴展與提高擴展與提高網(wǎng)絡(luò)編程技術(shù)網(wǎng)絡(luò)編程技術(shù)6利用利用Winpcap編寫一個簡單的路由處理程序,編寫一個簡單的路由處理程序,該路由程序應(yīng)該至少應(yīng)該包括以下功能:該路由程序應(yīng)該至少應(yīng)該包括以下功能: 靜態(tài)路由表維護靜態(tài)路由表維護 IP數(shù)據(jù)包處理數(shù)據(jù)包處理 ARP請求與解析請求與解析 處理處理IP數(shù)據(jù)包的數(shù)據(jù)包的TTL值值 重新計算重新計算IP數(shù)據(jù)包的頭部校驗和數(shù)據(jù)包的頭部校驗和 生成和處理生成和處理ICMP報文報文 記錄日志功能記錄日志功能 網(wǎng)絡(luò)編程技術(shù)網(wǎng)絡(luò)編程技術(shù)7程序運行的參考界面程序運行的參考界面 網(wǎng)絡(luò)編程技術(shù)網(wǎng)絡(luò)編程技術(shù)8 編程訓(xùn)練目的編程訓(xùn)練
4、目的 編程訓(xùn)練要求編程訓(xùn)練要求 相關(guān)知識介紹相關(guān)知識介紹 程序設(shè)計分析程序設(shè)計分析 擴展與提高擴展與提高網(wǎng)絡(luò)編程技術(shù)網(wǎng)絡(luò)編程技術(shù)9路由器結(jié)構(gòu)路由器結(jié)構(gòu) 網(wǎng)絡(luò)編程技術(shù)網(wǎng)絡(luò)編程技術(shù)10路由器基本功能路由器基本功能 為經(jīng)過的為經(jīng)過的IP數(shù)據(jù)包選擇路由數(shù)據(jù)包選擇路由處理處理IP數(shù)據(jù)包選項數(shù)據(jù)包選項處理處理IP數(shù)據(jù)包數(shù)據(jù)包TTL值值分片處理分片處理重新計算重新計算IP數(shù)據(jù)包的頭部校驗和數(shù)據(jù)包的頭部校驗和生成和處理生成和處理ICMP報文報文實現(xiàn)動態(tài)路由協(xié)議、維護靜態(tài)路由實現(xiàn)動態(tài)路由協(xié)議、維護靜態(tài)路由實現(xiàn)實現(xiàn)ARP協(xié)議、形成數(shù)據(jù)幀協(xié)議、形成數(shù)據(jù)幀網(wǎng)絡(luò)編程技術(shù)網(wǎng)絡(luò)編程技術(shù)11路由選擇的基本原理路由選擇的基本原
5、理IP互聯(lián)網(wǎng)采用表驅(qū)動的路由選擇算法互聯(lián)網(wǎng)采用表驅(qū)動的路由選擇算法需要路由選擇的設(shè)備保存一張需要路由選擇的設(shè)備保存一張IP路由表路由表路由表存儲有關(guān)目的地址及怎樣到達目的地路由表存儲有關(guān)目的地址及怎樣到達目的地的信息的信息通過查詢路由表決定把數(shù)據(jù)報發(fā)往何處通過查詢路由表決定把數(shù)據(jù)報發(fā)往何處IP路由選擇利用路由選擇利用IP地址隱藏主機信息地址隱藏主機信息連接到同一網(wǎng)絡(luò)的所有主機共享同一網(wǎng)絡(luò)號連接到同一網(wǎng)絡(luò)的所有主機共享同一網(wǎng)絡(luò)號網(wǎng)絡(luò)編程技術(shù)網(wǎng)絡(luò)編程技術(shù)12標準的路由選擇算法標準的路由選擇算法網(wǎng)絡(luò)編程技術(shù)網(wǎng)絡(luò)編程技術(shù)13子網(wǎng)選路子網(wǎng)選路網(wǎng)絡(luò)編程技術(shù)網(wǎng)絡(luò)編程技術(shù)14路由表路由表 路由表中的每一條路由
6、表項含有五個屬性路由表中的每一條路由表項含有五個屬性 :目的網(wǎng)絡(luò)地址、網(wǎng)絡(luò)掩碼、下一跳、接口和躍點數(shù)目的網(wǎng)絡(luò)地址、網(wǎng)絡(luò)掩碼、下一跳、接口和躍點數(shù) 網(wǎng)絡(luò)編程技術(shù)網(wǎng)絡(luò)編程技術(shù)15相關(guān)的相關(guān)的ICMP差錯報文差錯報文 目的不可達報文目的不可達報文當(dāng)路由器不能為數(shù)據(jù)包找到路由器或主機交付數(shù)據(jù)當(dāng)路由器不能為數(shù)據(jù)包找到路由器或主機交付數(shù)據(jù)包時,就丟棄該數(shù)據(jù)包,然后向源主機發(fā)出包時,就丟棄該數(shù)據(jù)包,然后向源主機發(fā)出ICMP目的不可達報文目的不可達報文 超時報文超時報文路由器在轉(zhuǎn)發(fā)數(shù)據(jù)包時,如果生存周期路由器在轉(zhuǎn)發(fā)數(shù)據(jù)包時,如果生存周期TTL值減值減1后為后為0,就丟棄這個數(shù)據(jù)包。當(dāng)丟棄這樣的數(shù)據(jù)包,就丟棄這
7、個數(shù)據(jù)包。當(dāng)丟棄這樣的數(shù)據(jù)包時,路由器向源主機發(fā)送一個超時報文時,路由器向源主機發(fā)送一個超時報文當(dāng)計時器的時限到,而目的主機還沒有接收到一個當(dāng)計時器的時限到,而目的主機還沒有接收到一個數(shù)據(jù)包的所有分片時,它會將接收的分片丟棄,并數(shù)據(jù)包的所有分片時,它會將接收的分片丟棄,并向源主機發(fā)送超時報文向源主機發(fā)送超時報文 網(wǎng)絡(luò)編程技術(shù)網(wǎng)絡(luò)編程技術(shù)16 編程訓(xùn)練目的編程訓(xùn)練目的 編程訓(xùn)練要求編程訓(xùn)練要求 相關(guān)知識介紹相關(guān)知識介紹 程序設(shè)計分析程序設(shè)計分析 擴展與提高擴展與提高網(wǎng)絡(luò)編程技術(shù)網(wǎng)絡(luò)編程技術(shù)17 測試環(huán)境示意圖測試環(huán)境示意圖 網(wǎng)絡(luò)編程技術(shù)網(wǎng)絡(luò)編程技術(shù)18 測試環(huán)境示意圖測試環(huán)境示意圖 邏輯結(jié)構(gòu)邏輯
8、結(jié)構(gòu)物理結(jié)構(gòu)物理結(jié)構(gòu)網(wǎng)絡(luò)編程技術(shù)網(wǎng)絡(luò)編程技術(shù)19路由器初始化模塊路由器初始化模塊初始化模塊負責(zé)初始化設(shè)備,添加與路由器直接初始化模塊負責(zé)初始化設(shè)備,添加與路由器直接相連網(wǎng)絡(luò)的路由表項,并啟動相應(yīng)的數(shù)據(jù)包捕獲相連網(wǎng)絡(luò)的路由表項,并啟動相應(yīng)的數(shù)據(jù)包捕獲與處理模塊與處理模塊 靜態(tài)路由表維護模塊靜態(tài)路由表維護模塊靜態(tài)路由表維護模塊完成路由表的添加、刪除以靜態(tài)路由表維護模塊完成路由表的添加、刪除以及顯示及顯示 數(shù)據(jù)包捕獲與處理模塊數(shù)據(jù)包捕獲與處理模塊 數(shù)據(jù)包捕獲與處理模塊用于捕獲流經(jīng)本路由器的數(shù)據(jù)包捕獲與處理模塊用于捕獲流經(jīng)本路由器的數(shù)據(jù)包并按照路由協(xié)議進行處理數(shù)據(jù)包并按照路由協(xié)議進行處理 網(wǎng)絡(luò)編程技術(shù)
9、網(wǎng)絡(luò)編程技術(shù)20定義數(shù)據(jù)包頭數(shù)據(jù)結(jié)構(gòu)定義數(shù)據(jù)包頭數(shù)據(jù)結(jié)構(gòu) #pragma pack(1)typedef struct FrameHeader_t / 幀首部幀首部 UCHARDesMAC6; / 目的地址目的地址 UCHARSrcMAC6; / 源地址源地址 USHORTFrameType; / 幀類型幀類型 FrameHeader_t;typedef struct ARPFrame_t / ARP幀幀F(xiàn)rameHeader_t FrameHeader; / 幀首部幀首部 WORDHardwareType; / 硬件類型硬件類型WORDProtocolType; / 協(xié)議類型協(xié)議類型BYTEH
10、Len; / 硬件地址長度硬件地址長度BYTEPLen; / 協(xié)議地址長度協(xié)議地址長度WORDOperation; / 操作值操作值UCHARSendHa6; / 源源MAC地址地址ULONGSendIP; / 源源IP地址地址UCHARRecvHa6; / 目的目的MAC地址地址ULONGRecvIP; / 目的目的IP地址地址 ARPFrame_t;網(wǎng)絡(luò)編程技術(shù)網(wǎng)絡(luò)編程技術(shù)21定義數(shù)據(jù)包頭數(shù)據(jù)結(jié)構(gòu)定義數(shù)據(jù)包頭數(shù)據(jù)結(jié)構(gòu) typedef struct IPHeader_t / IP首部首部BYTEVer_HLen; / 版本版本+頭部長度頭部長度BYTETOS; / 服務(wù)類型服務(wù)類型WORDT
11、otalLen; / 總長度總長度WORDID; / 標識標識WORDFlag_Segment; / 標志標志+片偏移片偏移BYTETTL; / 生存時間生存時間BYTEProtocol; / 協(xié)議協(xié)議WORDChecksum; / 頭部校驗和頭部校驗和ULONG SrcIP; / 源源IP地址地址ULONG DstIP; / 目的目的IP地址地址 IPHeader_t;typedef struct ICMPHeader_t / ICMP首部首部BYTE Type; / 類型類型BYTE Code; / 代碼代碼WORD Checksum; / 校驗和校驗和WORD Id; / 標識標識WOR
12、D Sequence; / 序列號序列號 ICMPHeader_t;網(wǎng)絡(luò)編程技術(shù)網(wǎng)絡(luò)編程技術(shù)22路由器初始化模塊路由器初始化模塊初始化模塊負責(zé)初始化設(shè)備,添加與路由器直接初始化模塊負責(zé)初始化設(shè)備,添加與路由器直接相連網(wǎng)絡(luò)的路由表項,并啟動相應(yīng)的數(shù)據(jù)包捕獲相連網(wǎng)絡(luò)的路由表項,并啟動相應(yīng)的數(shù)據(jù)包捕獲與處理模塊與處理模塊 靜態(tài)路由表維護模塊靜態(tài)路由表維護模塊靜態(tài)路由表維護模塊完成路由表的添加、刪除以靜態(tài)路由表維護模塊完成路由表的添加、刪除以及顯示及顯示 數(shù)據(jù)包捕獲與處理模塊數(shù)據(jù)包捕獲與處理模塊 數(shù)據(jù)包捕獲與處理模塊用于捕獲流經(jīng)本路由器的數(shù)據(jù)包捕獲與處理模塊用于捕獲流經(jīng)本路由器的數(shù)據(jù)包并按照路由協(xié)議進
13、行處理數(shù)據(jù)包并按照路由協(xié)議進行處理 網(wǎng)絡(luò)編程技術(shù)網(wǎng)絡(luò)編程技術(shù)231、定義、定義存儲信息接口存儲信息接口數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu) typedef struct ip_t / 網(wǎng)絡(luò)地址網(wǎng)絡(luò)地址ULONGIPAddr; / IP地址地址ULONGIPMask; / 子網(wǎng)掩碼子網(wǎng)掩碼 ip_t;typedef struct IfInfo_t / 接口信息接口信息CStringDeviceName; / 設(shè)備名設(shè)備名CStringDescription; / 設(shè)備描述設(shè)備描述UCHARMACAddr6; / MAC地址地址CArray ip; / IP地址列表地址列表pcap_t*adhandle; / pca
14、p句柄句柄 IfInfo_t; /打開并由一個線程監(jiān)聽流經(jīng)該接口的數(shù)據(jù)報打開并由一個線程監(jiān)聽流經(jīng)該接口的數(shù)據(jù)報網(wǎng)絡(luò)編程技術(shù)網(wǎng)絡(luò)編程技術(shù)241、定義、定義路由表數(shù)據(jù)結(jié)構(gòu)路由表數(shù)據(jù)結(jié)構(gòu) typedef struct RouteTable_t / 路由表結(jié)構(gòu)路由表結(jié)構(gòu)ULONG Mask; / 子網(wǎng)掩碼子網(wǎng)掩碼ULONG DstIP; / 目的地址目的地址ULONG NextHop; / 下一跳步下一跳步UINTIfNo; / 接口序號接口序號 RouteTable_t;網(wǎng)絡(luò)編程技術(shù)網(wǎng)絡(luò)編程技術(shù)252、定義全局變量、定義全局變量 IfInfo_t IfInfoMAX_IF; / 接口信息數(shù)組接口信息
15、數(shù)組UINT_PTR TimerCount; / 定時器個數(shù)定時器個數(shù)CList SP; / 發(fā)送數(shù)據(jù)包緩存隊列發(fā)送數(shù)據(jù)包緩存隊列CList IP_MAC; / IP-MAC地址映射列表地址映射列表CList RouteTable; / 路由表路由表網(wǎng)絡(luò)編程技術(shù)網(wǎng)絡(luò)編程技術(shù)26網(wǎng)絡(luò)編程技術(shù)網(wǎng)絡(luò)編程技術(shù)273、初始化、初始化-獲得本機的設(shè)備列表獲得本機的設(shè)備列表 / 獲得本機的設(shè)備列表獲得本機的設(shè)備列表 if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL /*無需認證無需認證*/, &alldevs, errbuf) = -1) / 錯誤,返
16、回錯誤信息錯誤,返回錯誤信息 sprintf(strbuf, pcap_findalldevs_ex錯誤錯誤: %s, errbuf);MessageBox(strbuf);PostMessage(WM_QUIT, 0, 0); 網(wǎng)絡(luò)編程技術(shù)網(wǎng)絡(luò)編程技術(shù)283、初始化、初始化-獲得接口信息和獲得接口信息和IP地址信息地址信息 for(d = alldevs; d != NULL; d = d-next)if(d-addresses != NULL)/ 排除集成排除集成modem的影響(沒有的影響(沒有IP地址)地址)/ 得到一個有效的接口和其得到一個有效的接口和其IP地址列表地址列表IfInf
17、oi.DeviceName = d-name;IfInfoi.Description = d-description;for(a = d-addresses; a; a = a-next)if (a-addr-sa_family = AF_INET) ipaddr.IPAddr = (struct sockaddr_in *)a-addr)-sin_addr.s_addr);ipaddr.IPMask = (struct sockaddr_in *)a-netmask)- sin_addr.s_addr);IfInfoi.ip.Add(ipaddr);j+;if (i=MAX_IF)/ 最多處
18、理最多處理MAX_IF個接口個接口break; elsei+;網(wǎng)絡(luò)編程技術(shù)網(wǎng)絡(luò)編程技術(shù)293、初始化、初始化-打開設(shè)備接口打開設(shè)備接口 / 打開接口打開接口for (i=0; i IfCount; i+)if ( (IfInfoi.adhandle = pcap_open(IfInfoi.DeviceName, / 設(shè)備名設(shè)備名65536, / 最大包長度最大包長度PCAP_OPENFLAG_PROMISCUOUS, / 混雜模式混雜模式1000, / 超時時間超時時間NULL, / 遠程認證遠程認證errbuf / 錯誤緩存錯誤緩存 ) ) = NULL)/ 錯誤,顯示錯誤信息錯誤,顯示錯誤
19、信息sprintf(strbuf, 接口未能打開。接口未能打開。WinPcap不支持不支持%s。, IfInfoi.DeviceName);MessageBox(strbuf);PostMessage(WM_QUIT, 0, 0);網(wǎng)絡(luò)編程技術(shù)網(wǎng)絡(luò)編程技術(shù)303、初始化、初始化-獲得各接口獲得各接口MAC地址地址 / 開啟數(shù)據(jù)包捕獲線程,獲取本地接口的開啟數(shù)據(jù)包捕獲線程,獲取本地接口的MAC地址,線程數(shù)目為網(wǎng)卡個數(shù)地址,線程數(shù)目為網(wǎng)卡個數(shù)CWinThread* pthread;for (i = 0; i IfCount; i+)pthread = AfxBeginThread(CaptureL
20、ocalARP, &IfInfoi, THREAD_PRIORITY_NORMAL);if(!pthread)MessageBox(創(chuàng)建數(shù)據(jù)包捕獲線程失?。?chuàng)建數(shù)據(jù)包捕獲線程失?。?;PostMessage(WM_QUIT, 0, 0);/ 為得到真實網(wǎng)卡地址,使用虛假的為得到真實網(wǎng)卡地址,使用虛假的MAC地址和地址和IP地址向本機發(fā)送地址向本機發(fā)送ARP請求請求setMAC(srcMAC, 66);/ 設(shè)置虛假的設(shè)置虛假的MAC地址地址srcIP = inet_addr(112.112.112.112);/ 設(shè)置虛假的設(shè)置虛假的IP地址地址for (i = 0; i IfCount;
21、 i+) ARPRequest(IfInfoi.adhandle, srcMAC, srcIP, IfInfoi.ip0.IPAddr);網(wǎng)絡(luò)編程技術(shù)網(wǎng)絡(luò)編程技術(shù)313、初始化、初始化-初始化路由表初始化路由表 / 初始化路由表并顯示初始化路由表并顯示RouteTable_t rt;for (i = 0; i IfCount; i+)for (j = 0; j IfInfoi.ip.GetSize(); j+)rt.IfNo = i;rt.DstIP = IfInfoi.ipj.IPAddr & IfInfoi.ipj.IPMask;rt.Mask = IfInfoi.ipj.IPMa
22、sk;rt.NextHop = 0;/ 直接投遞直接投遞RouteTable.AddTail(rt);m_RouteTable.InsertString(-1, IPntoa(rt.Mask) + - + IPntoa(rt.DstIP) + - + IPntoa(rt.NextHop) + (直接投遞直接投遞);網(wǎng)絡(luò)編程技術(shù)網(wǎng)絡(luò)編程技術(shù)323、初始化、初始化-設(shè)置過濾規(guī)則開始捕獲設(shè)置過濾規(guī)則開始捕獲 / 設(shè)置過濾規(guī)則設(shè)置過濾規(guī)則:僅僅接收僅僅接收arp響應(yīng)幀和需要路由的幀響應(yīng)幀和需要路由的幀CString Filter, Filter0, Filter1; 只接收需要轉(zhuǎn)發(fā)的只接收需要轉(zhuǎn)發(fā)的I
23、P數(shù)據(jù)報,共同特點是目的數(shù)據(jù)報,共同特點是目的Filter0 = “(”; MAC地址指向本機,但目的地址指向本機,但目的IP地址不屬于本機地址不屬于本機Filter1 = “(”; 轉(zhuǎn)發(fā)需要轉(zhuǎn)發(fā)需要MAC地址,所以還需接收地址,所以還需接收ARP應(yīng)答包應(yīng)答包for (i = 0; i IfCount; i+)Filter0 += (ether dst + MACntoa(IfInfoi.MACAddr) + );for (j = 0; j IfInfoi.ip.GetSize(); j+) /mac地址為本路由器接口地址為本路由器接口Filter1 += (ip dst host + IPn
24、toa(IfInfoi.ipj.IPAddr) + );if (j = (IfInfoi.ip.GetSize() -1) & (i = (IfCount-1) Filter1 += “)”; /IP地址為本機的接口地址地址為本機的接口地址else Filter1 += or ;if (i = (IfCount-1)Filter0 += ); else Filter0 += or ; /需要轉(zhuǎn)發(fā)的數(shù)據(jù)包需要轉(zhuǎn)發(fā)的數(shù)據(jù)包Filter = Filter0 + and (arp and (ether21=0 x2) or (not + Filter1 + );網(wǎng)絡(luò)編程技術(shù)網(wǎng)絡(luò)編程技術(shù)33AR
25、P幀結(jié)構(gòu)幀結(jié)構(gòu)1632bit硬件類型硬件類型協(xié)議類型協(xié)議類型硬件地址長度硬件地址長度協(xié)議長度協(xié)議長度操作操作(Request 1, Reply 2)發(fā)送方硬件地址發(fā)送方硬件地址發(fā)送方發(fā)送方IP地址地址目的硬件地址目的硬件地址目的目的IP地址地址網(wǎng)絡(luò)編程技術(shù)網(wǎng)絡(luò)編程技術(shù)343、初始化、初始化-設(shè)置過濾規(guī)則開始捕獲設(shè)置過濾規(guī)則開始捕獲 表達式支持邏輯操作符,表達式支持邏輯操作符,and /or /not基于協(xié)議的過濾要使用協(xié)議限定符,可以是基于協(xié)議的過濾要使用協(xié)議限定符,可以是 IP /ARP /RARP /TCP /UDP等。等?;诨贛AC過濾要使用限定符過濾要使用限定符ether基于基于I
26、P地址過濾使用限定符地址過濾使用限定符host基于端口的過濾使用限定符基于端口的過濾使用限定符port網(wǎng)絡(luò)編程技術(shù)網(wǎng)絡(luò)編程技術(shù)353、初始化、初始化-設(shè)置過濾規(guī)則開始捕獲設(shè)置過濾規(guī)則開始捕獲 if (pcap_compile(IfInfoi.adhandle , &fcode, strbuf, 1, IfInfoi.ip0.IPMask) 0 )MessageBox(過濾規(guī)則編譯不成功,請檢查書寫的規(guī)則語法是否正確!過濾規(guī)則編譯不成功,請檢查書寫的規(guī)則語法是否正確!);PostMessage(WM_QUIT,0,0);if (pcap_setfilter(IfInfoi.adhandl
27、e, &fcode)0)MessageBox(設(shè)置過濾器錯誤!設(shè)置過濾器錯誤!);PostMessage(WM_QUIT, 0, 0); / 開始捕獲數(shù)據(jù)包開始捕獲數(shù)據(jù)包for (i=0; i IfCount; i+) pthread = AfxBeginThread(Capture, &IfInfoi, THREAD_PRIORITY_NORMAL);網(wǎng)絡(luò)編程技術(shù)網(wǎng)絡(luò)編程技術(shù)36路由器初始化模塊路由器初始化模塊初始化模塊負責(zé)初始化設(shè)備,添加與路由器直接初始化模塊負責(zé)初始化設(shè)備,添加與路由器直接相連網(wǎng)絡(luò)的路由表項,并啟動相應(yīng)的數(shù)據(jù)包捕獲相連網(wǎng)絡(luò)的路由表項,并啟動相應(yīng)的數(shù)據(jù)包捕獲
28、與處理模塊與處理模塊 靜態(tài)路由表維護模塊靜態(tài)路由表維護模塊靜態(tài)路由表維護模塊完成路由表的添加、刪除以靜態(tài)路由表維護模塊完成路由表的添加、刪除以及顯示及顯示 數(shù)據(jù)包捕獲與處理模塊數(shù)據(jù)包捕獲與處理模塊 數(shù)據(jù)包捕獲與處理模塊用于捕獲流經(jīng)本路由器的數(shù)據(jù)包捕獲與處理模塊用于捕獲流經(jīng)本路由器的數(shù)據(jù)包并按照路由協(xié)議進行處理數(shù)據(jù)包并按照路由協(xié)議進行處理 網(wǎng)絡(luò)編程技術(shù)網(wǎng)絡(luò)編程技術(shù)371、添加路由表項、添加路由表項 void CRouterDlg:OnInsert() flag = false;for (i=0; i IfCount; i+)for (j = 0; j IfInfoi.ip.GetSize();
29、j+)if (IfInfoi.ipj.IPAddr) & (IfInfoi.ipj.IPMask) = (IfInfoi.ipj.IPMask) & ipaddr) /判斷該路由表項屬于哪個接口判斷該路由表項屬于哪個接口rt.IfNo = i;/ 記錄子網(wǎng)掩碼記錄子網(wǎng)掩碼m_Mask.GetAddress(ipaddr); rt.Mask = htonl(ipaddr);/ 記錄目的記錄目的IPm_Destination.GetAddress(ipaddr);rt.DstIP = htonl(ipaddr);/ 記錄下一跳記錄下一跳m_NextHop.GetAddress(ip
30、addr);rt.NextHop = htonl(ipaddr);/ 把該條路由表項添加到路由表把該條路由表項添加到路由表RouteTable.AddTail(rt);/ 在路由表窗口中顯示該路由表項在路由表窗口中顯示該路由表項m_RouteTable.InsertString(-1, IPntoa(rt.Mask) + - + IPntoa(rt.DstIP) + - + IPntoa(rt.NextHop);flag = true;網(wǎng)絡(luò)編程技術(shù)網(wǎng)絡(luò)編程技術(shù)382、刪除路由表項、刪除路由表項 / 刪除路由表項刪除路由表項void CRouterDlg:OnDel() RouteTable_t
31、 rt;POSITION pos, CurrentPos;m_RouteTable.GetText(i, str);/ 取得子網(wǎng)掩碼選項取得子網(wǎng)掩碼選項strncat(ipaddr, str, 15);mask = inet_addr(ipaddr);/ 取得目的地址選項取得目的地址選項ipaddr0 = 0;strncat(ipaddr, &str19, 15);destination = inet_addr(ipaddr);/ 取得下一跳選項取得下一跳選項ipaddr0 = 0;strncat(ipaddr, &str38, 15);nexthop = inet_addr(
32、ipaddr);網(wǎng)絡(luò)編程技術(shù)網(wǎng)絡(luò)編程技術(shù)392、刪除路由表項、刪除路由表項 if (nexthop = 0)MessageBox(直接連接路由,不允許刪除!直接連接路由,不允許刪除!);/ 把該路由表項從路由表窗口中刪除把該路由表項從路由表窗口中刪除m_RouteTable.DeleteString(i);/ 路由表中沒有需要處理的內(nèi)容,則返回路由表中沒有需要處理的內(nèi)容,則返回if (RouteTable.IsEmpty() return;/ 遍歷路由表遍歷路由表,把需要刪除的路由表項從路由表中刪除把需要刪除的路由表項從路由表中刪除pos = RouteTable.GetHeadPositio
33、n();for (i=0; iadhandle, &header, &pkt_data); if (res = 1)FrameHeader_t *fh;fh = (FrameHeader_t *) pkt_data;網(wǎng)絡(luò)編程技術(shù)網(wǎng)絡(luò)編程技術(shù)421、數(shù)據(jù)包捕獲、數(shù)據(jù)包捕獲 switch (ntohs(fh-FrameType)case 0 x0806:ARPFrame_t *ARPf;ARPf = (ARPFrame_t *)pkt_data;/TRACE1(收到收到ARP包包 源源IP為:為:%dn, ARPf-SendIP);/ ARP包,轉(zhuǎn)到包,轉(zhuǎn)到ARP包處理函數(shù)包處理函
34、數(shù)ARPPacketProc(header, pkt_data);break;case 0 x0800:IPFrame_t *IPf;IPf = (IPFrame_t*) pkt_data;/TRACE1(收到收到IP包包 源源IP為:為:%dn,IPf-IPHeader.SrcIP );/ IP包,轉(zhuǎn)到包,轉(zhuǎn)到IP包處理函數(shù)包處理函數(shù)IPPacketProc(pIfInfo, header, pkt_data);break;default: 網(wǎng)絡(luò)編程技術(shù)網(wǎng)絡(luò)編程技術(shù)431、數(shù)據(jù)包緩存列表和、數(shù)據(jù)包緩存列表和 IP-MAC緩存列表緩存列表 typedef struct SendPacket_t
35、 / 發(fā)送數(shù)據(jù)包結(jié)構(gòu)發(fā)送數(shù)據(jù)包結(jié)構(gòu)intlen; / 長度長度BYTEPktData2000;/ 數(shù)據(jù)緩存數(shù)據(jù)緩存ULONGTargetIP; / 目的目的IP地址地址UINT_PTRn_mTimer; / 定時器定時器UINTIfNo; / 接口序號接口序號 SendPacket_t;typedef struct IP_MAC_t / IP-MAC地址映射結(jié)構(gòu)地址映射結(jié)構(gòu)ULONG IPAddr; / IP地址地址UCHAR MACAddr6; / MAC地址地址 IP_MAC_t;網(wǎng)絡(luò)編程技術(shù)網(wǎng)絡(luò)編程技術(shù)44網(wǎng)絡(luò)編程技術(shù)網(wǎng)絡(luò)編程技術(shù)452、IP數(shù)據(jù)包處理數(shù)據(jù)包處理 void IPPacke
36、tProc(IfInfo_t *pIfInfo, struct pcap_pkthdr *header, const u_char *pkt_data) IPFrame_t *IPf; SendPacket_t sPacket; IPf = (IPFrame_t *) pkt_data; / ICMP超時超時IPf-IPHeader.TTL -; /TTL值減去值減去1 if (IPf-IPHeader.TTL IPHeader); / ICMP差錯差錯 if (IsChecksumRight(char *)IpHeader) = 0) / 日志輸出信息日志輸出信息 pDlg-m_Log.In
37、sertString(-1, IP數(shù)據(jù)包包頭校驗和錯誤,丟棄數(shù)據(jù)包數(shù)據(jù)包包頭校驗和錯誤,丟棄數(shù)據(jù)包);網(wǎng)絡(luò)編程技術(shù)網(wǎng)絡(luò)編程技術(shù)462、IP數(shù)據(jù)包處理數(shù)據(jù)包處理 DWORD nextHop; / 經(jīng)過路由選擇算法得到的下一站目的經(jīng)過路由選擇算法得到的下一站目的IP地址地址 UINT ifNo; / 下一跳的接口序號下一跳的接口序號 / 路由查詢路由查詢 if(nextHop = RouteLookup(ifNo, IPf-IPHeader.DstIP, &RouteTable) = -1) / ICMP目的不可達目的不可達 ICMPPacketProc(pIfInfo, 3, 0, pk
38、t_data); else /查找到了下一跳查找到了下一跳 sPacket.IfNo = ifNo; sPacket.TargetIP = nextHop; cpyMAC(IPf-FrameHeader.SrcMAC, IfInfosPacket.IfNo.MACAddr); / 設(shè)設(shè)IP頭中的校驗和為頭中的校驗和為0 IPf-IPHeader.Checksum = 0; / 計算計算IP頭部校驗和頭部校驗和 IPf-IPHeader.Checksum = ChecksumCompute(check_buff, sizeof(IPHeader_t); 網(wǎng)絡(luò)編程技術(shù)網(wǎng)絡(luò)編程技術(shù)472、IP數(shù)據(jù)包處理數(shù)據(jù)包處理 / IP-MAC地址映射表中存在該映射關(guān)系地址映射表中存在該映射關(guān)系 if (IPLookup(sPacket.TargetIP, IPf-FrameHeader.DesMAC) memcpy(sPacket.PktData, pkt_data, header-len); sPacket.len = header-len; if(pcap_sendpacket(IfInfosPacket.IfNo.adhandle, (u_char *) sPacket.PktData, sPa
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年二手房購買合同例文(4篇)
- 2025年產(chǎn)品銷售代理合同參考樣本(三篇)
- 2025年個人房屋抵押借款服務(wù)合同(2篇)
- 2025年二手房購房正規(guī)合同(2篇)
- 2025年二手車分期付款合同(2篇)
- 2025年九年級思想品德上學(xué)期工作總結(jié)樣本(三篇)
- 2025年五年級數(shù)學(xué)教研組總結(jié)(2篇)
- 2025年臨時工合同簡單版(2篇)
- 健身連鎖股權(quán)轉(zhuǎn)讓居間協(xié)議
- 汽車內(nèi)飾運輸協(xié)議模板
- 華能火力發(fā)電機組節(jié)能降耗技術(shù)導(dǎo)則(2023年版)
- 基礎(chǔ)知識3500個常用漢字附拼音
- 企業(yè)易制毒化學(xué)品管理培訓(xùn)
- 酒店財務(wù)部SOP(標準操作手冊)4092
- JJF(紡織)072-2018紡織滾筒式烘干機校準規(guī)范
- 北京故宮作文600字
- 羊水栓塞的應(yīng)急預(yù)案演練腳本
- 餐飲服務(wù)保障措施、食品衛(wèi)生安全保障方案
- 物業(yè)保潔及餐飲服務(wù)項目方案
- (新版教材)粵教粵科版六年級下冊科學(xué)全冊課時練(同步練習(xí))
- TCETA 001-2021 演藝燈具型號命名規(guī)則
評論
0/150
提交評論