




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
TechnologyofNetworkProgramming網(wǎng)絡(luò)編程技術(shù)第14章路由器基本功能實(shí)現(xiàn)程序1概述
路由器是實(shí)現(xiàn)IP協(xié)議最為關(guān)鍵的設(shè)備之一。通過(guò)簡(jiǎn)單路由器程序的設(shè)計(jì)與實(shí)現(xiàn),掌握路由器基本工作原理,理解路由選擇與數(shù)據(jù)包轉(zhuǎn)發(fā)的方法2網(wǎng)絡(luò)編程技術(shù)編程訓(xùn)練目的編程訓(xùn)練要求相關(guān)知識(shí)介紹程序設(shè)計(jì)分析擴(kuò)展與提高提綱3網(wǎng)絡(luò)編程技術(shù)編程訓(xùn)練目的在理解IP協(xié)議、ICMP協(xié)議與路由選擇基本工作原理的基礎(chǔ)上,完成路由器基本功能的設(shè)計(jì)與編程實(shí)現(xiàn)掌握Windwos平臺(tái)下路由程序測(cè)試環(huán)境的搭建方法熟悉Winpcap編程,掌握數(shù)據(jù)包捕獲與發(fā)送的方法。熟悉動(dòng)態(tài)路由協(xié)議原理以及動(dòng)態(tài)路由表的實(shí)現(xiàn)方法4網(wǎng)絡(luò)編程技術(shù)編程訓(xùn)練目的編程訓(xùn)練要求相關(guān)知識(shí)介紹程序設(shè)計(jì)分析擴(kuò)展與提高提綱5網(wǎng)絡(luò)編程技術(shù)編程訓(xùn)練要求
利用Winpcap編寫一個(gè)簡(jiǎn)單的路由處理程序,該路由程序應(yīng)該至少應(yīng)該包括以下功能:靜態(tài)路由表維護(hù)IP數(shù)據(jù)包處理ARP請(qǐng)求與解析處理IP數(shù)據(jù)包的TTL值重新計(jì)算IP數(shù)據(jù)包的頭部校驗(yàn)和生成和處理ICMP報(bào)文記錄日志功能6網(wǎng)絡(luò)編程技術(shù)程序運(yùn)行的參考界面
7網(wǎng)絡(luò)編程技術(shù)編程訓(xùn)練目的編程訓(xùn)練要求相關(guān)知識(shí)介紹程序設(shè)計(jì)分析擴(kuò)展與提高提綱8網(wǎng)絡(luò)編程技術(shù)路由器結(jié)構(gòu)
9網(wǎng)絡(luò)編程技術(shù)路由器基本功能
為經(jīng)過(guò)的IP數(shù)據(jù)包選擇路由處理IP數(shù)據(jù)包選項(xiàng)處理IP數(shù)據(jù)包TTL值分片處理重新計(jì)算IP數(shù)據(jù)包的頭部校驗(yàn)和生成和處理ICMP報(bào)文實(shí)現(xiàn)動(dòng)態(tài)路由協(xié)議、維護(hù)靜態(tài)路由實(shí)現(xiàn)ARP協(xié)議、形成數(shù)據(jù)幀10網(wǎng)絡(luò)編程技術(shù)路由選擇的基本原理IP互聯(lián)網(wǎng)采用表驅(qū)動(dòng)的路由選擇算法需要路由選擇的設(shè)備保存一張IP路由表路由表存儲(chǔ)有關(guān)目的地址及怎樣到達(dá)目的地的信息通過(guò)查詢路由表決定把數(shù)據(jù)報(bào)發(fā)往何處IP路由選擇利用IP地址隱藏主機(jī)信息連接到同一網(wǎng)絡(luò)的所有主機(jī)共享同一網(wǎng)絡(luò)號(hào)11網(wǎng)絡(luò)編程技術(shù)標(biāo)準(zhǔn)的路由選擇算法12網(wǎng)絡(luò)編程技術(shù)子網(wǎng)選路13網(wǎng)絡(luò)編程技術(shù)路由表路由表中的每一條路由表項(xiàng)含有五個(gè)屬性:目的網(wǎng)絡(luò)地址、網(wǎng)絡(luò)掩碼、下一跳、接口和躍點(diǎn)數(shù)
14網(wǎng)絡(luò)編程技術(shù)相關(guān)的ICMP差錯(cuò)報(bào)文目的不可達(dá)報(bào)文當(dāng)路由器不能為數(shù)據(jù)包找到路由器或主機(jī)交付數(shù)據(jù)包時(shí),就丟棄該數(shù)據(jù)包,然后向源主機(jī)發(fā)出ICMP目的不可達(dá)報(bào)文超時(shí)報(bào)文路由器在轉(zhuǎn)發(fā)數(shù)據(jù)包時(shí),如果生存周期TTL值減1后為0,就丟棄這個(gè)數(shù)據(jù)包。當(dāng)丟棄這樣的數(shù)據(jù)包時(shí),路由器向源主機(jī)發(fā)送一個(gè)超時(shí)報(bào)文當(dāng)計(jì)時(shí)器的時(shí)限到,而目的主機(jī)還沒(méi)有接收到一個(gè)數(shù)據(jù)包的所有分片時(shí),它會(huì)將接收的分片丟棄,并向源主機(jī)發(fā)送超時(shí)報(bào)文15網(wǎng)絡(luò)編程技術(shù)編程訓(xùn)練目的編程訓(xùn)練要求相關(guān)知識(shí)介紹程序設(shè)計(jì)分析擴(kuò)展與提高提綱16網(wǎng)絡(luò)編程技術(shù)測(cè)試環(huán)境的搭建測(cè)試環(huán)境示意圖
17網(wǎng)絡(luò)編程技術(shù)測(cè)試環(huán)境的搭建測(cè)試環(huán)境示意圖
邏輯結(jié)構(gòu)物理結(jié)構(gòu)18網(wǎng)絡(luò)編程技術(shù)路由程序的設(shè)計(jì)路由器初始化模塊初始化模塊負(fù)責(zé)初始化設(shè)備,添加與路由器直接相連網(wǎng)絡(luò)的路由表項(xiàng),并啟動(dòng)相應(yīng)的數(shù)據(jù)包捕獲與處理模塊靜態(tài)路由表維護(hù)模塊靜態(tài)路由表維護(hù)模塊完成路由表的添加、刪除以及顯示
數(shù)據(jù)包捕獲與處理模塊
數(shù)據(jù)包捕獲與處理模塊用于捕獲流經(jīng)本路由器的數(shù)據(jù)包并按照路由協(xié)議進(jìn)行處理
19網(wǎng)絡(luò)編程技術(shù)定義數(shù)據(jù)包頭數(shù)據(jù)結(jié)構(gòu)
#pragmapack(1)typedef
struct
FrameHeader_t{ //幀首部
UCHAR DesMAC[6]; //目的地址
UCHAR SrcMAC[6]; //源地址
USHORT FrameType; //幀類型}FrameHeader_t;typedef
struct
ARPFrame_t{ //ARP幀
FrameHeader_t
FrameHeader; //幀首部
WORD HardwareType; //硬件類型
WORD ProtocolType; //協(xié)議類型
BYTE HLen; //硬件地址長(zhǎng)度
BYTE PLen; //協(xié)議地址長(zhǎng)度
WORD Operation; //操作值
UCHAR SendHa[6]; //源MAC地址
ULONG SendIP; //源IP地址
UCHAR RecvHa[6]; //目的MAC地址
ULONG RecvIP; //目的IP地址}ARPFrame_t;20網(wǎng)絡(luò)編程技術(shù)定義數(shù)據(jù)包頭數(shù)據(jù)結(jié)構(gòu)
typedef
struct
IPHeader_t
{ //IP首部
BYTE Ver_HLen; //版本+頭部長(zhǎng)度
BYTE TOS; //服務(wù)類型
WORD TotalLen; //總長(zhǎng)度
WORD ID; //標(biāo)識(shí)
WORD Flag_Segment; //標(biāo)志+片偏移
BYTE TTL; //生存時(shí)間
BYTE Protocol; //協(xié)議
WORD Checksum; //頭部校驗(yàn)和
ULONG SrcIP; //源IP地址
ULONG DstIP; //目的IP地址}IPHeader_t;typedef
struct
ICMPHeader_t
{ //ICMP首部
BYTEType; //類型
BYTECode; //代碼
WORDChecksum; //校驗(yàn)和
WORDId; //標(biāo)識(shí)
WORDSequence; //序列號(hào)}ICMPHeader_t;21網(wǎng)絡(luò)編程技術(shù)路由程序的設(shè)計(jì)路由器初始化模塊初始化模塊負(fù)責(zé)初始化設(shè)備,添加與路由器直接相連網(wǎng)絡(luò)的路由表項(xiàng),并啟動(dòng)相應(yīng)的數(shù)據(jù)包捕獲與處理模塊靜態(tài)路由表維護(hù)模塊靜態(tài)路由表維護(hù)模塊完成路由表的添加、刪除以及顯示
數(shù)據(jù)包捕獲與處理模塊
數(shù)據(jù)包捕獲與處理模塊用于捕獲流經(jīng)本路由器的數(shù)據(jù)包并按照路由協(xié)議進(jìn)行處理
22網(wǎng)絡(luò)編程技術(shù)1、定義存儲(chǔ)信息接口數(shù)據(jù)結(jié)構(gòu)
typedef
struct
ip_t{//網(wǎng)絡(luò)地址
ULONG IPAddr;//IP地址
ULONG IPMask;//子網(wǎng)掩碼}ip_t;typedef
struct
IfInfo_t
{ //接口信息
CString
DeviceName;//設(shè)備名
CString Description;//設(shè)備描述
UCHAR MACAddr[6];//MAC地址
CArray<ip_t,ip_t&> ip;//IP地址列表
pcap_t *adhandle;//pcap句柄}IfInfo_t;//打開并由一個(gè)線程監(jiān)聽流經(jīng)該接口的數(shù)據(jù)報(bào)23網(wǎng)絡(luò)編程技術(shù)1、定義路由表數(shù)據(jù)結(jié)構(gòu)
typedef
struct
RouteTable_t
{ //路由表結(jié)構(gòu)
ULONG Mask;//子網(wǎng)掩碼
ULONG DstIP;//目的地址
ULONG NextHop;//下一跳步
UINT IfNo;//接口序號(hào)}RouteTable_t;24網(wǎng)絡(luò)編程技術(shù)2、定義全局變量
IfInfo_t
IfInfo[MAX_IF]; //接口信息數(shù)組UINT_PTRTimerCount;//定時(shí)器個(gè)數(shù)CList<SendPacket_t,SendPacket_t&>SP;//發(fā)送數(shù)據(jù)包緩存隊(duì)列CList<IP_MAC_t,IP_MAC_t&>IP_MAC;//IP-MAC地址映射列表CList<RouteTable_t,RouteTable_t&>RouteTable;//路由表25網(wǎng)絡(luò)編程技術(shù)路由器
初始化模塊26網(wǎng)絡(luò)編程技術(shù)3、初始化-獲得本機(jī)的設(shè)備列表
//獲得本機(jī)的設(shè)備列表
if(pcap_findalldevs_ex(PCAP_SRC_IF_STRING,NULL/*無(wú)需認(rèn)證*/,&alldevs,errbuf)==-1){ //錯(cuò)誤,返回錯(cuò)誤信息
sprintf(strbuf,"pcap_findalldevs_ex錯(cuò)誤:%s",errbuf);
MessageBox(strbuf);
PostMessage(WM_QUIT,0,0);}27網(wǎng)絡(luò)編程技術(shù)3、初始化-獲得接口信息和IP地址信息
for(d=alldevs;d!=NULL;d=d->next) {
if(d->addresses!=NULL) //排除集成modem的影響(沒(méi)有IP地址){ //得到一個(gè)有效的接口和其IP地址列表
IfInfo[i].DeviceName=d->name;
IfInfo[i].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);
IfInfo[i].ip.Add(ipaddr); j++; } } if(i==MAX_IF) //最多處理MAX_IF個(gè)接口
{break; }
else{i++;}}28網(wǎng)絡(luò)編程技術(shù)3、初始化-打開設(shè)備接口
//打開接口for(i=0;i<IfCount;i++){if((IfInfo[i].adhandle=pcap_open(IfInfo[i].DeviceName,//設(shè)備名
65536,//最大包長(zhǎng)度
PCAP_OPENFLAG_PROMISCUOUS,//混雜模式
1000,//超時(shí)時(shí)間
NULL,//遠(yuǎn)程認(rèn)證
errbuf//錯(cuò)誤緩存
))==NULL){ //錯(cuò)誤,顯示錯(cuò)誤信息
sprintf(strbuf,"接口未能打開。WinPcap不支持%s。",IfInfo[i].DeviceName);
MessageBox(strbuf);
PostMessage(WM_QUIT,0,0);}29網(wǎng)絡(luò)編程技術(shù)3、初始化-獲得各接口MAC地址
//開啟數(shù)據(jù)包捕獲線程,獲取本地接口的MAC地址,線程數(shù)目為網(wǎng)卡個(gè)數(shù)CWinThread*pthread;for(i=0;i<IfCount;i++){
pthread=AfxBeginThread(CaptureLocalARP,&IfInfo[i],THREAD_PRIORITY_NORMAL);
if(!pthread) {
MessageBox("創(chuàng)建數(shù)據(jù)包捕獲線程失??!");
PostMessage(WM_QUIT,0,0); }}//為得到真實(shí)網(wǎng)卡地址,使用虛假的MAC地址和IP地址向本機(jī)發(fā)送ARP請(qǐng)求setMAC(srcMAC,66); //設(shè)置虛假的MAC地址srcIP=inet_addr("112.112.112.112"); //設(shè)置虛假的IP地址for(i=0;i<IfCount;i++){
ARPRequest(IfInfo[i].adhandle,srcMAC,srcIP,IfInfo[i].ip[0].IPAddr);}30網(wǎng)絡(luò)編程技術(shù)3、初始化-初始化路由表
//初始化路由表并顯示RouteTable_t
rt;for(i=0;i<IfCount;i++){ for(j=0;j<IfInfo[i].ip.GetSize();j++) {
rt.IfNo=i;
rt.DstIP=
IfInfo[i].ip[j].IPAddr&IfInfo[i].ip[j].IPMask;
rt.Mask=IfInfo[i].ip[j].IPMask;
rt.NextHop
=0; //直接投遞
RouteTable.AddTail(rt); m_RouteTable.InsertString(-1,IPntoa(rt.Mask)+"--"+IPntoa(rt.DstIP)+"--"+IPntoa(rt.NextHop)+"(直接投遞)"); }}31網(wǎng)絡(luò)編程技術(shù)3、初始化-設(shè)置過(guò)濾規(guī)則開始捕獲
//設(shè)置過(guò)濾規(guī)則:僅僅接收arp響應(yīng)幀和需要路由的幀CStringFilter,Filter0,Filter1;只接收需要轉(zhuǎn)發(fā)的IP數(shù)據(jù)報(bào),共同特點(diǎn)是目的Filter0=“(”;MAC地址指向本機(jī),但目的IP地址不屬于本機(jī)Filter1=“(”;轉(zhuǎn)發(fā)需要MAC地址,所以還需接收ARP應(yīng)答包for(i=0;i<IfCount;i++){ Filter0+="(etherdst"+MACntoa(IfInfo[i].MACAddr)+")"; for(j=0;j<IfInfo[i].ip.GetSize();j++)//mac地址為本路由器接口 { Filter1+="(ip
dsthost"+IPntoa(IfInfo[i].ip[j].IPAddr)+")"; if(((j==(IfInfo[i].ip.GetSize()-1)))&&(i==(IfCount-1))) {Filter1+=“)”;}//IP地址為本機(jī)的接口地址 else{Filter1+="or";} } if(i==(IfCount-1)) {Filter0+=")";} else{Filter0+="or";}}//需要轉(zhuǎn)發(fā)的數(shù)據(jù)包Filter=Filter0+"and((arpand(ether[21]=0x2))or(not"+Filter1+"))";32網(wǎng)絡(luò)編程技術(shù)ARP幀結(jié)構(gòu)1632bit硬件類型協(xié)議類型硬件地址長(zhǎng)度協(xié)議長(zhǎng)度操作(Request1,Reply2)發(fā)送方硬件地址發(fā)送方IP地址目的硬件地址目的IP地址33網(wǎng)絡(luò)編程技術(shù)3、初始化-設(shè)置過(guò)濾規(guī)則開始捕獲
表達(dá)式支持邏輯操作符,and/or/not基于協(xié)議的過(guò)濾要使用協(xié)議限定符,可以是IP/ARP/RARP/TCP/UDP等?;贛AC過(guò)濾要使用限定符ether基于IP地址過(guò)濾使用限定符host基于端口的過(guò)濾使用限定符port34網(wǎng)絡(luò)編程技術(shù)3、初始化-設(shè)置過(guò)濾規(guī)則開始捕獲
if(pcap_compile(IfInfo[i].adhandle,&fcode,strbuf,1,IfInfo[i].ip[0].IPMask)<0){
MessageBox("過(guò)濾規(guī)則編譯不成功,請(qǐng)檢查書寫的規(guī)則語(yǔ)法是否正確!"); PostMessage(WM_QUIT,0,0);}if(pcap_setfilter(IfInfo[i].adhandle,&fcode)<0){
MessageBox("設(shè)置過(guò)濾器錯(cuò)誤!");
PostMessage(WM_QUIT,0,0);}//開始捕獲數(shù)據(jù)包for(i=0;i<IfCount;i++)
pthread=AfxBeginThread(Capture,&IfInfo[i],THREAD_PRIORITY_NORMAL);35網(wǎng)絡(luò)編程技術(shù)路由程序的設(shè)計(jì)路由器初始化模塊初始化模塊負(fù)責(zé)初始化設(shè)備,添加與路由器直接相連網(wǎng)絡(luò)的路由表項(xiàng),并啟動(dòng)相應(yīng)的數(shù)據(jù)包捕獲與處理模塊靜態(tài)路由表維護(hù)模塊靜態(tài)路由表維護(hù)模塊完成路由表的添加、刪除以及顯示
數(shù)據(jù)包捕獲與處理模塊
數(shù)據(jù)包捕獲與處理模塊用于捕獲流經(jīng)本路由器的數(shù)據(jù)包并按照路由協(xié)議進(jìn)行處理
36網(wǎng)絡(luò)編程技術(shù)1、添加路由表項(xiàng)
voidCRouterDlg::OnInsert(){flag=false;for(i=0;i<IfCount;i++){ for(j=0;j<IfInfo[i].ip.GetSize();j++) { if(((IfInfo[i].ip[j].IPAddr)&(IfInfo[i].ip[j].IPMask))==((IfInfo[i].ip[j].IPMask)&ipaddr))//判斷該路由表項(xiàng)屬于哪個(gè)接口 {
rt.IfNo=i; //記錄子網(wǎng)掩碼
m_Mask.GetAddress(ipaddr); rt.Mask=htonl(ipaddr); //記錄目的IP
m_Destination.GetAddress(ipaddr);
rt.DstIP
=htonl(ipaddr); //記錄下一跳
m_NextHop.GetAddress(ipaddr);
rt.NextHop=htonl(ipaddr);//把該條路由表項(xiàng)添加到路由表
RouteTable.AddTail(rt); //在路由表窗口中顯示該路由表項(xiàng)
m_RouteTable.InsertString(-1,IPntoa(rt.Mask)+"--" +IPntoa(rt.DstIP)+"--"+IPntoa(rt.NextHop)); flag=true; }37網(wǎng)絡(luò)編程技術(shù)2、刪除路由表項(xiàng)
//刪除路由表項(xiàng)voidCRouterDlg::OnDel(){
RouteTable_t
rt; POSITIONpos,CurrentPos;
m_RouteTable.GetText(i,str); //取得子網(wǎng)掩碼選項(xiàng)
strncat(ipaddr,str,15); mask=inet_addr(ipaddr); //取得目的地址選項(xiàng)
ipaddr[0]=0;
strncat(ipaddr,&str[19],15); destination=inet_addr(ipaddr); //取得下一跳選項(xiàng)
ipaddr[0]=0;
strncat(ipaddr,&str[38],15);
nexthop=inet_addr(ipaddr);38網(wǎng)絡(luò)編程技術(shù)2、刪除路由表項(xiàng)
if(nexthop==0){ MessageBox("直接連接路由,不允許刪除!");}//把該路由表項(xiàng)從路由表窗口中刪除m_RouteTable.DeleteString(i);//路由表中沒(méi)有需要處理的內(nèi)容,則返回if(RouteTable.IsEmpty()){return;}//遍歷路由表,把需要?jiǎng)h除的路由表項(xiàng)從路由表中刪除pos=RouteTable.GetHeadPosition();for(i=0;i<RouteTable.GetCount();i++){
CurrentPos=pos;
rt=RouteTable.GetNext(pos); if((rt.Mask==mask)&&(rt.DstIP==destination)&&(rt.NextHop==nexthop)) {
RouteTable.RemoveAt(CurrentPos); }}39網(wǎng)絡(luò)編程技術(shù)路由程序的設(shè)計(jì)路由器初始化模塊初始化模塊負(fù)責(zé)初始化設(shè)備,添加與路由器直接相連網(wǎng)絡(luò)的路由表項(xiàng),并啟動(dòng)相應(yīng)的數(shù)據(jù)包捕獲與處理模塊靜態(tài)路由表維護(hù)模塊靜態(tài)路由表維護(hù)模塊完成路由表的添加、刪除以及顯示
數(shù)據(jù)包捕獲與處理模塊
數(shù)據(jù)包捕獲與處理模塊用于捕獲流經(jīng)本路由器的數(shù)據(jù)包并按照路由協(xié)議進(jìn)行處理
40網(wǎng)絡(luò)編程技術(shù)1、數(shù)據(jù)包捕獲
//數(shù)據(jù)包捕獲線程UINTCapture(PVOID
pParam){
int res;
IfInfo_t *pIfInfo;
struct
pcap_pkthdr *header; constu_char *pkt_data;
pIfInfo=(IfInfo_t*)pParam; //開始正式接收并處理幀
while(true) { res=pcap_next_ex(pIfInfo->adhandle,&header,&pkt_data); if(res==1) {
FrameHeader_t *fh;
fh=(FrameHeader_t*)pkt_data;41網(wǎng)絡(luò)編程技術(shù)1、數(shù)據(jù)包捕獲
switch(ntohs(fh->FrameType)){ case0x0806:
ARPFrame_t*ARPf;
ARPf=(ARPFrame_t*)pkt_data; //TRACE1("收到ARP包源IP為:%d\n",ARPf->SendIP);
//ARP包,轉(zhuǎn)到ARP包處理函數(shù)
ARPPacketProc(header,pkt_data); break;
case0x0800:
IPFrame_t*IPf;
IPf=(IPFrame_t*)pkt_data; //TRACE1("收到IP包源IP為:%d\n",IPf->IPHeader.SrcIP); //IP包,轉(zhuǎn)到IP包處理函數(shù)
IPPacketProc(pIfInfo,header,pkt_data); break;
default:}42網(wǎng)絡(luò)編程技術(shù)1、數(shù)據(jù)包緩存列表和IP-MAC緩存列表
typedef
struct
SendPacket_t{ //發(fā)送數(shù)據(jù)包結(jié)構(gòu)
int
len;//長(zhǎng)度
BYTE PktData[2000];//數(shù)據(jù)緩存
ULONG TargetIP;//目的IP地址
UINT_PTR n_mTimer;//定時(shí)器
UINT IfNo;//接口序號(hào)}SendPacket_t;typedef
struct
IP_MAC_t{//IP-MAC地址映射結(jié)構(gòu)
ULONG IPAddr;//IP地址
UCHAR MACAddr[6];//MAC地址}IP_MAC_t;43網(wǎng)絡(luò)編程技術(shù)數(shù)據(jù)包捕獲與處理模塊(IP數(shù)據(jù)包的處理)44網(wǎng)絡(luò)編程技術(shù)2、IP數(shù)據(jù)包處理
voidIPPacketProc(IfInfo_t*pIfInfo,struct
pcap_pkthdr*header,constu_char*pkt_data){
IPFrame_t*IPf;
SendPacket_t
sPacket;
IPf=(IPFrame_t*)pkt_data;//ICMP超時(shí)IPf->IPHeader.TTL
--;//TTL值減去1
if(IPf->IPHeader.TTL<=0){
ICMPPacketProc(pIfInfo,11,0,pkt_data);}
IPHeader_t*IpHeader=&(IPf->IPHeader);//ICMP差錯(cuò)
if(IsChecksumRight((char*)IpHeader)==0){//日志輸出信息
pDlg->m_Log.InsertString(-1,"IP數(shù)據(jù)包包頭校驗(yàn)和錯(cuò)誤,丟棄數(shù)據(jù)包");}45網(wǎng)絡(luò)編程技術(shù)2、IP數(shù)據(jù)包處理DWORDnextHop;//經(jīng)過(guò)路由選擇算法得到的下一站目的IP地址
UINTifNo;//下一跳的接口序號(hào)
//路由查詢
if((nextHop=RouteLookup(ifNo,IPf->IPHeader.DstIP,&RouteTable))==-1){//ICMP目的不可達(dá)
ICMPPacketProc(pIfInfo,3,0,pkt_data);}else//查找到了下一跳
{
sPacket.IfNo=ifNo;
sPacket.TargetIP=nextHop;
cpyMAC(IPf->FrameHeader.SrcMAC,IfInfo[sPacket.IfNo].MACAddr);//設(shè)IP頭中的校驗(yàn)和為0
IPf->IPHeader.Checksum=0;//計(jì)算IP頭部校驗(yàn)和
IPf->IPHeader.Checksum=ChecksumCompute(check_buff,sizeof(IPHeader_t));46網(wǎng)絡(luò)編程技術(shù)2、IP數(shù)據(jù)包處理//IP-MAC地址映射表中存在該映射關(guān)系
if(IPLookup(sPacket.TargetIP,IPf->FrameHeader.DesMAC)){memcpy(sPacket.PktData,pkt_data,header->len);
sPacket.len=header->len;
if(pcap_sendpacket(IfInfo[sPacket.IfNo].adhandle,(u_char*)sPacket.PktData,sPacket.len)!=0)}//IP-MAC地址映射表中不存在該映射關(guān)系
else{if(SP.GetCount()<65530)//存入緩存隊(duì)列
{
sPacket.len=header->len;//將需要轉(zhuǎn)發(fā)的數(shù)據(jù)報(bào)存入緩存區(qū)
memcpy(sPacket.PktData,pkt_data,header->len);
SP.AddTail(sPacket); //發(fā)送ARP請(qǐng)求
ARPRequest(IfInfo[sPacket.IfNo].adhand
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 室內(nèi)設(shè)計(jì)工作流程
- 聚醚醚酮行業(yè)未來(lái)發(fā)展趨勢(shì)與市場(chǎng)機(jī)會(huì)分析
- 防洪治理工程項(xiàng)目設(shè)計(jì)方案優(yōu)化
- 高級(jí)審計(jì)師活動(dòng)回顧試題及答案
- 及時(shí)調(diào)整的2024年高級(jí)審計(jì)師考試試題及答案
- 高級(jí)審計(jì)師備考新法試題及答案
- 二級(jí)消防工程師全方位解讀試題及答案
- 護(hù)理過(guò)程中溝通試題及答案
- 財(cái)務(wù)審計(jì)方法研究試題及答案
- 職業(yè)審計(jì)中常用的工具及應(yīng)用技巧試題及答案
- 全國(guó)青少年數(shù)獨(dú)比賽U8
- 2024年北京大學(xué)強(qiáng)基計(jì)劃物理試題(附答案)
- 冷凍產(chǎn)品采購(gòu)合同范例
- 中職課件:職業(yè)道德與法治全冊(cè)教案
- 古詩(shī)詞誦讀《登岳陽(yáng)樓》公開課一等獎(jiǎng)創(chuàng)新教學(xué)設(shè)計(jì)統(tǒng)編版高中語(yǔ)文必修下冊(cè)
- 鉚工理論考試題及答案
- JJF(魯) 116-2021 石油產(chǎn)品庫(kù)侖氯分析儀校準(zhǔn)規(guī)范
- 五人合伙開酒吧協(xié)議書模板
- 2024年河北省中考化學(xué)真題(含解析)
- 中國(guó)越劇?唱腔智慧樹知到答案2024年浙江藝術(shù)職業(yè)學(xué)院
- 2024年廣東省高考化學(xué)試卷(真題+答案)
評(píng)論
0/150
提交評(píng)論