第14章 路由器基本功能實現(xiàn)程序-1_第1頁
第14章 路由器基本功能實現(xiàn)程序-1_第2頁
第14章 路由器基本功能實現(xiàn)程序-1_第3頁
第14章 路由器基本功能實現(xiàn)程序-1_第4頁
第14章 路由器基本功能實現(xiàn)程序-1_第5頁
已閱讀5頁,還剩48頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、計計算機硬件基算機硬件基礎教學礎教學中心中心Copyright by NUPT All rights reserved.1Technology of Network Programming網(wǎng)絡編程技術網(wǎng)絡編程技術網(wǎng)絡編程技術網(wǎng)絡編程技術2 路由器是實現(xiàn)路由器是實現(xiàn)IP協(xié)議最為關鍵協(xié)議最為關鍵的設備之一。通過簡單路由器的設備之一。通過簡單路由器程序的設計與實現(xiàn),掌握路由程序的設計與實現(xiàn),掌握路由器基本工作原理,理解路由選器基本工作原理,理解路由選擇與數(shù)據(jù)包轉發(fā)的方法擇與數(shù)據(jù)包轉發(fā)的方法網(wǎng)絡編程技術網(wǎng)絡編程技術3 編程訓練目的編程訓練目的 編程訓練要求編程訓練要求 相關知識介紹相關知識介紹 程序設

2、計分析程序設計分析 擴展與提高擴展與提高網(wǎng)絡編程技術網(wǎng)絡編程技術4 在理解在理解IP協(xié)議、協(xié)議、ICMP協(xié)議與路由選擇基本工協(xié)議與路由選擇基本工作原理的基礎上,完成路由器基本功能的設計作原理的基礎上,完成路由器基本功能的設計與編程實現(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)絡編程技術網(wǎng)絡編程技術5 編程訓練目的編程訓練目的 編程訓練要求編程訓練要求 相關知識

3、介紹相關知識介紹 程序設計分析程序設計分析 擴展與提高擴展與提高網(wǎng)絡編程技術網(wǎng)絡編程技術6利用利用Winpcap編寫一個簡單的路由處理程序,編寫一個簡單的路由處理程序,該路由程序應該至少應該包括以下功能:該路由程序應該至少應該包括以下功能: 靜態(tài)路由表維護靜態(tài)路由表維護 IP數(shù)據(jù)包處理數(shù)據(jù)包處理 ARP請求與解析請求與解析 處理處理IP數(shù)據(jù)包的數(shù)據(jù)包的TTL值值 重新計算重新計算IP數(shù)據(jù)包的頭部校驗和數(shù)據(jù)包的頭部校驗和 生成和處理生成和處理ICMP報文報文 記錄日志功能記錄日志功能 網(wǎng)絡編程技術網(wǎng)絡編程技術7程序運行的參考界面程序運行的參考界面 網(wǎng)絡編程技術網(wǎng)絡編程技術8 編程訓練目的編程訓練

4、目的 編程訓練要求編程訓練要求 相關知識介紹相關知識介紹 程序設計分析程序設計分析 擴展與提高擴展與提高網(wǎng)絡編程技術網(wǎng)絡編程技術9路由器結構路由器結構 網(wǎng)絡編程技術網(wǎng)絡編程技術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)絡編程技術網(wǎng)絡編程技術11路由選擇的基本原理路由選擇的基本原

5、理IP互聯(lián)網(wǎng)采用表驅動的路由選擇算法互聯(lián)網(wǎng)采用表驅動的路由選擇算法需要路由選擇的設備保存一張需要路由選擇的設備保存一張IP路由表路由表路由表存儲有關目的地址及怎樣到達目的地路由表存儲有關目的地址及怎樣到達目的地的信息的信息通過查詢路由表決定把數(shù)據(jù)報發(fā)往何處通過查詢路由表決定把數(shù)據(jù)報發(fā)往何處IP路由選擇利用路由選擇利用IP地址隱藏主機信息地址隱藏主機信息連接到同一網(wǎng)絡的所有主機共享同一網(wǎng)絡號連接到同一網(wǎng)絡的所有主機共享同一網(wǎng)絡號網(wǎng)絡編程技術網(wǎng)絡編程技術12標準的路由選擇算法標準的路由選擇算法網(wǎng)絡編程技術網(wǎng)絡編程技術13子網(wǎng)選路子網(wǎng)選路網(wǎng)絡編程技術網(wǎng)絡編程技術14路由表路由表 路由表中的每一條路由

6、表項含有五個屬性路由表中的每一條路由表項含有五個屬性 :目的網(wǎng)絡地址、網(wǎng)絡掩碼、下一跳、接口和躍點數(shù)目的網(wǎng)絡地址、網(wǎng)絡掩碼、下一跳、接口和躍點數(shù) 網(wǎng)絡編程技術網(wǎng)絡編程技術15相關的相關的ICMP差錯報文差錯報文 目的不可達報文目的不可達報文當路由器不能為數(shù)據(jù)包找到路由器或主機交付數(shù)據(jù)當路由器不能為數(shù)據(jù)包找到路由器或主機交付數(shù)據(jù)包時,就丟棄該數(shù)據(jù)包,然后向源主機發(fā)出包時,就丟棄該數(shù)據(jù)包,然后向源主機發(fā)出ICMP目的不可達報文目的不可達報文 超時報文超時報文路由器在轉發(fā)數(shù)據(jù)包時,如果生存周期路由器在轉發(fā)數(shù)據(jù)包時,如果生存周期TTL值減值減1后為后為0,就丟棄這個數(shù)據(jù)包。當丟棄這樣的數(shù)據(jù)包,就丟棄這

7、個數(shù)據(jù)包。當丟棄這樣的數(shù)據(jù)包時,路由器向源主機發(fā)送一個超時報文時,路由器向源主機發(fā)送一個超時報文當計時器的時限到,而目的主機還沒有接收到一個當計時器的時限到,而目的主機還沒有接收到一個數(shù)據(jù)包的所有分片時,它會將接收的分片丟棄,并數(shù)據(jù)包的所有分片時,它會將接收的分片丟棄,并向源主機發(fā)送超時報文向源主機發(fā)送超時報文 網(wǎng)絡編程技術網(wǎng)絡編程技術16 編程訓練目的編程訓練目的 編程訓練要求編程訓練要求 相關知識介紹相關知識介紹 程序設計分析程序設計分析 擴展與提高擴展與提高網(wǎng)絡編程技術網(wǎng)絡編程技術17 測試環(huán)境示意圖測試環(huán)境示意圖 網(wǎng)絡編程技術網(wǎng)絡編程技術18 測試環(huán)境示意圖測試環(huán)境示意圖 邏輯結構邏輯

8、結構物理結構物理結構網(wǎng)絡編程技術網(wǎng)絡編程技術19路由器初始化模塊路由器初始化模塊初始化模塊負責初始化設備,添加與路由器直接初始化模塊負責初始化設備,添加與路由器直接相連網(wǎng)絡的路由表項,并啟動相應的數(shù)據(jù)包捕獲相連網(wǎ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)絡編程技術

9、網(wǎng)絡編程技術20定義數(shù)據(jù)包頭數(shù)據(jù)結構定義數(shù)據(jù)包頭數(shù)據(jù)結構 #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)絡編程技術網(wǎng)絡編程技術21定義數(shù)據(jù)包頭數(shù)據(jù)結構定義數(shù)據(jù)包頭數(shù)據(jù)結構 typedef struct IPHeader_t / IP首部首部BYTEVer_HLen; / 版本版本+頭部長度頭部長度BYTETOS; / 服務類型服務類型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)絡編程技術網(wǎng)絡編程技術22路由器初始化模塊路由器初始化模塊初始化模塊負責初始化設備,添加與路由器直接初始化模塊負責初始化設備,添加與路由器直接相連網(wǎng)絡的路由表項,并啟動相應的數(shù)據(jù)包捕獲相連網(wǎ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)絡編程技術網(wǎng)絡編程技術231、定義、定義存儲信息接口存儲信息接口數(shù)據(jù)結構數(shù)據(jù)結構 typedef struct ip_t / 網(wǎng)絡地址網(wǎng)絡地址ULONGIPAddr; / IP地址地址ULONGIPMask; / 子網(wǎng)掩碼子網(wǎng)掩碼 ip_t;typedef struct IfInfo_t / 接口信息接口信息CStringDeviceName; / 設備名設備名CStringDescription; / 設備描述設備描述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)絡編程技術網(wǎng)絡編程技術241、定義、定義路由表數(shù)據(jù)結構路由表數(shù)據(jù)結構 typedef struct RouteTable_t / 路由表結構路由表結構ULONG Mask; / 子網(wǎng)掩碼子網(wǎng)掩碼ULONG DstIP; / 目的地址目的地址ULONG NextHop; / 下一跳步下一跳步UINTIfNo; / 接口序號接口序號 RouteTable_t;網(wǎng)絡編程技術網(wǎng)絡編程技術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)絡編程技術網(wǎng)絡編程技術26網(wǎng)絡編程技術網(wǎng)絡編程技術273、初始化、初始化-獲得本機的設備列表獲得本機的設備列表 / 獲得本機的設備列表獲得本機的設備列表 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)絡編程技術網(wǎng)絡編程技術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)絡編程技術網(wǎng)絡編程技術293、初始化、初始化-打開設備接口打開設備接口 / 打開接口打開接口for (i=0; i IfCount; i+)if ( (IfInfoi.adhandle = pcap_open(IfInfoi.DeviceName, / 設備名設備名65536, / 最大包長度最大包長度PCAP_OPENFLAG_PROMISCUOUS, / 混雜模式混雜模式1000, / 超時時間超時時間NULL, / 遠程認證遠程認證errbuf / 錯誤緩存錯誤緩存 ) ) = NULL)/ 錯誤,顯示錯誤信息錯誤,顯示錯誤

19、信息sprintf(strbuf, 接口未能打開。接口未能打開。WinPcap不支持不支持%s。, IfInfoi.DeviceName);MessageBox(strbuf);PostMessage(WM_QUIT, 0, 0);網(wǎng)絡編程技術網(wǎng)絡編程技術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);/ 設置虛假的設置虛假的MAC地址地址srcIP = inet_addr(112.112.112.112);/ 設置虛假的設置虛假的IP地址地址for (i = 0; i IfCount;

21、 i+) ARPRequest(IfInfoi.adhandle, srcMAC, srcIP, IfInfoi.ip0.IPAddr);網(wǎng)絡編程技術網(wǎng)絡編程技術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)絡編程技術網(wǎng)絡編程技術323、初始化、初始化-設置過濾規(guī)則開始捕獲設置過濾規(guī)則開始捕獲 / 設置過濾規(guī)則設置過濾規(guī)則:僅僅接收僅僅接收arp響應幀和需要路由的幀響應幀和需要路由的幀CString Filter, Filter0, Filter1; 只接收需要轉發(fā)的只接收需要轉發(fā)的I

23、P數(shù)據(jù)報,共同特點是目的數(shù)據(jù)報,共同特點是目的Filter0 = “(”; MAC地址指向本機,但目的地址指向本機,但目的IP地址不屬于本機地址不屬于本機Filter1 = “(”; 轉發(fā)需要轉發(fā)需要MAC地址,所以還需接收地址,所以還需接收ARP應答包應答包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 ; /需要轉發(fā)的數(shù)據(jù)包需要轉發(fā)的數(shù)據(jù)包Filter = Filter0 + and (arp and (ether21=0 x2) or (not + Filter1 + );網(wǎng)絡編程技術網(wǎng)絡編程技術33AR

25、P幀結構幀結構1632bit硬件類型硬件類型協(xié)議類型協(xié)議類型硬件地址長度硬件地址長度協(xié)議長度協(xié)議長度操作操作(Request 1, Reply 2)發(fā)送方硬件地址發(fā)送方硬件地址發(fā)送方發(fā)送方IP地址地址目的硬件地址目的硬件地址目的目的IP地址地址網(wǎng)絡編程技術網(wǎng)絡編程技術343、初始化、初始化-設置過濾規(guī)則開始捕獲設置過濾規(guī)則開始捕獲 表達式支持邏輯操作符,表達式支持邏輯操作符,and /or /not基于協(xié)議的過濾要使用協(xié)議限定符,可以是基于協(xié)議的過濾要使用協(xié)議限定符,可以是 IP /ARP /RARP /TCP /UDP等。等?;诨贛AC過濾要使用限定符過濾要使用限定符ether基于基于I

26、P地址過濾使用限定符地址過濾使用限定符host基于端口的過濾使用限定符基于端口的過濾使用限定符port網(wǎng)絡編程技術網(wǎng)絡編程技術353、初始化、初始化-設置過濾規(guī)則開始捕獲設置過濾規(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(設置過濾器錯誤!設置過濾器錯誤!);PostMessage(WM_QUIT, 0, 0); / 開始捕獲數(shù)據(jù)包開始捕獲數(shù)據(jù)包for (i=0; i IfCount; i+) pthread = AfxBeginThread(Capture, &IfInfoi, THREAD_PRIORITY_NORMAL);網(wǎng)絡編程技術網(wǎng)絡編程技術36路由器初始化模塊路由器初始化模塊初始化模塊負責初始化設備,添加與路由器直接初始化模塊負責初始化設備,添加與路由器直接相連網(wǎng)絡的路由表項,并啟動相應的數(shù)據(jù)包捕獲相連網(wǎ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)絡編程技術網(wǎng)絡編程技術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)絡編程技術網(wǎng)絡編程技術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)絡編程技術網(wǎng)絡編程技術392、刪除路由表項、刪除路由表項 if (nexthop = 0)MessageBox(直接連接路由,不允許刪除!直接連接路由,不允許刪除!);/ 把該路由表項從路由表窗口中刪除把該路由表項從路由表窗口中刪除m_RouteTable.DeleteString(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)絡編程技術網(wǎng)絡編程技術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包,轉到包,轉到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包,轉到包,轉到IP包處理函數(shù)包處理函數(shù)IPPacketProc(pIfInfo, header, pkt_data);break;default: 網(wǎng)絡編程技術網(wǎng)絡編程技術431、數(shù)據(jù)包緩存列表和、數(shù)據(jù)包緩存列表和 IP-MAC緩存列表緩存列表 typedef struct SendPacket_t

35、 / 發(fā)送數(shù)據(jù)包結構發(fā)送數(shù)據(jù)包結構intlen; / 長度長度BYTEPktData2000;/ 數(shù)據(jù)緩存數(shù)據(jù)緩存ULONGTargetIP; / 目的目的IP地址地址UINT_PTRn_mTimer; / 定時器定時器UINTIfNo; / 接口序號接口序號 SendPacket_t;typedef struct IP_MAC_t / IP-MAC地址映射結構地址映射結構ULONG IPAddr; / IP地址地址UCHAR MACAddr6; / MAC地址地址 IP_MAC_t;網(wǎng)絡編程技術網(wǎng)絡編程技術44網(wǎng)絡編程技術網(wǎng)絡編程技術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)絡編程技術網(wǎng)絡編程技術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); / 設設IP頭中的校驗和為頭中的校驗和為0 IPf-IPHeader.Checksum = 0; / 計算計算IP頭部校驗和頭部校驗和 IPf-IPHeader.Checksum = ChecksumCompute(check_buff, sizeof(IPHeader_t); 網(wǎng)絡編程技術網(wǎng)絡編程技術472、IP數(shù)據(jù)包處理數(shù)據(jù)包處理 / IP-MAC地址映射表中存在該映射關系地址映射表中存在該映射關系 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)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論