![Ping程序設(shè)計(jì)(c語(yǔ)言課程設(shè)計(jì))_第1頁(yè)](http://file4.renrendoc.com/view/7d142696ef7e2c98182f56b01af1bf46/7d142696ef7e2c98182f56b01af1bf461.gif)
![Ping程序設(shè)計(jì)(c語(yǔ)言課程設(shè)計(jì))_第2頁(yè)](http://file4.renrendoc.com/view/7d142696ef7e2c98182f56b01af1bf46/7d142696ef7e2c98182f56b01af1bf462.gif)
![Ping程序設(shè)計(jì)(c語(yǔ)言課程設(shè)計(jì))_第3頁(yè)](http://file4.renrendoc.com/view/7d142696ef7e2c98182f56b01af1bf46/7d142696ef7e2c98182f56b01af1bf463.gif)
![Ping程序設(shè)計(jì)(c語(yǔ)言課程設(shè)計(jì))_第4頁(yè)](http://file4.renrendoc.com/view/7d142696ef7e2c98182f56b01af1bf46/7d142696ef7e2c98182f56b01af1bf464.gif)
![Ping程序設(shè)計(jì)(c語(yǔ)言課程設(shè)計(jì))_第5頁(yè)](http://file4.renrendoc.com/view/7d142696ef7e2c98182f56b01af1bf46/7d142696ef7e2c98182f56b01af1bf465.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
ping程序設(shè)計(jì)ping的網(wǎng)絡(luò)上否可達(dá)。windowsping命令具有強(qiáng)大的功能,它有很多項(xiàng)選擇項(xiàng)用于實(shí)現(xiàn)不同的測(cè)試目的。本章仿照windowsping命令,用c語(yǔ)言實(shí)現(xiàn)了一個(gè)簡(jiǎn)潔的命令。本章著重pingc語(yǔ)言的網(wǎng)絡(luò)編程方法。讀者可以在本章的根底上,對(duì)本章實(shí)pingping命令,并進(jìn)一步把握網(wǎng)絡(luò)編程的方法。設(shè)計(jì)目的PingPing程序的實(shí)現(xiàn)原理,并初步講解了c語(yǔ)言網(wǎng)絡(luò)編程技術(shù)。winsocksocket的創(chuàng)立、關(guān)閉;設(shè)置socket選項(xiàng);依據(jù)主機(jī)名獵取IP地址;從堆中安排確定數(shù)量的空間、釋放從堆中安排的空間;獵取當(dāng)前進(jìn)程ID號(hào);數(shù)據(jù)報(bào)的發(fā)送;數(shù)據(jù)報(bào)的接等。通過(guò)本程序的訓(xùn)練,使讀者對(duì)網(wǎng)絡(luò)編程有確定的了解,把握Ping程序的設(shè)計(jì)方法,把握網(wǎng)絡(luò)編程的方法和技巧,從而編寫(xiě)出功能更強(qiáng)大的程序。功能描述本章用c 語(yǔ)言實(shí)現(xiàn)的ping命令,能用于測(cè)試一個(gè)主機(jī)到另一個(gè)主機(jī)間的聯(lián)通狀況,程序還供給了幾個(gè)選項(xiàng)以實(shí)現(xiàn)不同的功能。ping功能。程序能實(shí)現(xiàn)根本的pingICMP回顯懇求報(bào)文,接收顯應(yīng)答報(bào)文。能記錄路由。程序供給了“-r”選項(xiàng),用以記錄從源主機(jī)到目的主機(jī)的路由。能輸出指定條數(shù)的記錄。程序供給了“-n”選項(xiàng),用以輸出指定條數(shù)的記錄。datasize”選項(xiàng),用以指定輸出的數(shù)據(jù)報(bào)的大小。能輸出用戶幫助。程序供給了用戶幫助,顯示程序供給的選項(xiàng)以及選項(xiàng)格式等??傮w設(shè)計(jì)功能模塊設(shè)計(jì)功能模塊圖本系統(tǒng)共有4個(gè)模塊,分別是初始化模塊、功能把握模塊、數(shù)據(jù)把握模塊、數(shù)據(jù)報(bào)ping9.1所示。各模塊功能描述如下。PingPing程序設(shè)計(jì)初功數(shù)Ping始能據(jù)測(cè)化控報(bào)試模制解模塊模讀塊塊模塊9.1系統(tǒng)模塊圖(1)(2)功能把握模塊。改模塊是被其它模塊調(diào)用,其功能包括獵取參數(shù)、計(jì)算校驗(yàn)和填充數(shù)據(jù)報(bào)文、釋放占用資源和顯示用戶幫助。數(shù)據(jù)報(bào)解讀模塊。改模塊用于解讀接收到的報(bào)文和選項(xiàng)。測(cè)試模塊。改模塊是本程序的核心模塊,調(diào)用其他模塊實(shí)現(xiàn)其功能,主要是實(shí)現(xiàn)的功能。2.系統(tǒng)流程圖系統(tǒng)執(zhí)行的流程圖9.2所示。程序首先調(diào)用IniPing函數(shù)初始化各全局變量,然后GetArgments函數(shù)獵取用戶輸入的參數(shù),檢查用戶輸入的參數(shù),假設(shè)參數(shù)不正確或者沒(méi)有輸入?yún)?shù),則顯示用戶幫助信息(Userhelp),并完畢程序;假設(shè)參數(shù)正確,則對(duì)指定目的Ping命令,假設(shè)Ping通,則顯示Ping結(jié)果并釋放占用資源,假設(shè)沒(méi)有Ping通,則報(bào)告錯(cuò)誤信息,并釋放占用資源。開(kāi)頭開(kāi)頭初始化個(gè)變量獵取參數(shù)信息輸入?yún)?shù)是否正確?Ping目的地顯示幫助信息Ping成功?輸出錯(cuò)誤信息Ping結(jié)果釋放占用資源完畢9.2系統(tǒng)流程圖參數(shù)獵取〔GetArgments函數(shù)〕流程圖-〔記錄路由-〔記錄條數(shù)程序,任意的整數(shù)〕和datasize數(shù)據(jù)報(bào)大小〔短橫線,則認(rèn)為是“-r”或者“-n”中的一個(gè),然后作進(jìn)一步推斷。假設(shè)該參數(shù)的其次個(gè)字符是數(shù)字,則-用于開(kāi)頭Argc==1i個(gè)參數(shù)的第一個(gè)字符檢查第一i個(gè)參數(shù)的其次個(gè)字符是數(shù)字?是數(shù)字?該參數(shù)中有開(kāi)頭Argc==1i個(gè)參數(shù)的第一個(gè)字符檢查第一i個(gè)參數(shù)的其次個(gè)字符是數(shù)字?是數(shù)字?該參數(shù)中有該參數(shù)表示要獵取的記錄數(shù)顯示用戶幫助Record該參數(shù)表示該參數(shù)表示轉(zhuǎn)換成十進(jìn)制記錄到全局變FlagtureIP地址數(shù)據(jù)報(bào)大小packetNUM記錄到變量記錄到變量Lpdest中Datasize中還有參數(shù)?I=i+1完畢9.3參數(shù)獵取流程圖ping函數(shù)流程圖ping字,設(shè)置路由選項(xiàng)〔假設(shè)需要的話、設(shè)置接收和發(fā)送超時(shí)值、名字解析〔假設(shè)需要的話、安排內(nèi)存、創(chuàng)立ICMP報(bào)文、發(fā)送ICMP懇求報(bào)文、接收ICMPICMP報(bào)9.4所示。開(kāi)頭創(chuàng)立原始套接字創(chuàng)立成功?記錄路由?ICMP設(shè)置路由選項(xiàng)設(shè)置接收和發(fā)送超時(shí)值設(shè)置成功?名字解析?依據(jù)主機(jī)名獵取各種參數(shù)獵取成功?設(shè)置目的地址各項(xiàng)字段ICMP報(bào)文大小安排內(nèi)存安排成功ICMP報(bào)文ICMP懇求發(fā)送成功?超時(shí)發(fā)送?輸出失敗信息 輸出超時(shí)發(fā)送 接收ICMP應(yīng)答接收成功?接收成功?超時(shí)接收?輸出失敗信息輸出超時(shí)接收記錄數(shù)到達(dá)指定值?圖9.4 Ping函數(shù)流程圖數(shù)據(jù)構(gòu)造設(shè)計(jì)本程序定義了3個(gè)構(gòu)造體:-iphdr、-icmphdr、和-ipotionhdr,分別用于存放IP報(bào)頭信息、ICMP報(bào)頭信息和IP路由選項(xiàng)信息。IP報(bào)頭構(gòu)造體Typedefstruct_iphdr{Unsigned int h_len:4;Unsigned int version:4;Unsigned char tos;Unsigned short total_len;Unsigned short ident;Unsigned short frag_flags;Unsigned char ttl;Unsigned chor proto;Unsigned short checksum;Unsigned int sourceIP;Unsigned int destIP;}IpHeader;其中各字段表示意義如下。h-len:4 IP32bit由于它是一個(gè)4bit60個(gè)字節(jié),不包括任何選項(xiàng)的IP20個(gè)字節(jié)。Version:4: IPIpv4.。Top: 表示效勞的類型,可以表示最小時(shí)延,最大吞吐量,最高牢靠性和最小費(fèi)用。Total–len: IP數(shù)據(jù)報(bào)的總長(zhǎng)度。Ident: 唯一的標(biāo)識(shí)符,標(biāo)識(shí)主機(jī)發(fā)送的每一份數(shù)據(jù)報(bào)。Frag-flags: 分段標(biāo)志,表示過(guò)長(zhǎng)的數(shù)據(jù)報(bào)是否要分段。Ttl: 生存期,表示數(shù)據(jù)報(bào)可以經(jīng)過(guò)的最多路由器數(shù)。Proto: 協(xié)議類型〔TCP、UDP等。Checksum: 校驗(yàn)和。sourceIP: IP地址。destIP: IP地址。定義ICMP報(bào)頭構(gòu)造體Typedefstruct–icmphdr{BYTE i_type;BYTE i_code:USHORT i_cksum;USHORT i_id;USHORT i_seq;ULONG timestamp;} IcmpHeader;其中各字段表示意義如下。I_tye ICMP報(bào)文類型。I_code: 該類型中的代碼號(hào),一種ICMP報(bào)文的類型號(hào)和該類型中的代碼號(hào)共同打算I_cksum: 校驗(yàn)和。I_seq: 序列號(hào),序列號(hào)從0開(kāi)頭,每發(fā)送一次的回顯懇求就加1.Timestamp: 時(shí)間。IP選項(xiàng)構(gòu)造體Typedef struct _ipoptionhdr{Unsignedcharcode;Unsignedcharlen;Unsignedcharptr;Unsignedloangaddr[9];} IcmpHeader;其中各字段表示意義如下。Code: 指明IP選項(xiàng)類型,對(duì)于路由記錄選項(xiàng),它的值是7。Len: 選項(xiàng)頭長(zhǎng)度。Ptr: 地址指針字段,是一個(gè)基于1的指針,指向存放下一個(gè)IP地址的位置。addr[9]: 記錄的Ip地址列表,由于IP首部中選項(xiàng)的空間有限,所以可以記錄的Ip地址最多是9個(gè)。9.33 函數(shù)功能描述1〕IntPing函數(shù)原型:void IntPingIntPing函數(shù)用于初始化ping所需的全局變量,為各個(gè)變量賦初始值。2)userHelp函數(shù)原型:void userHelpuserHelp函數(shù)用于顯示用戶幫助信息。當(dāng)程序檢查到參數(shù)錯(cuò)誤或者沒(méi)有必要的參數(shù)〔如IP地址或者主機(jī)名〕時(shí),則會(huì)調(diào)用此函數(shù)顯示幫助信息。3) GetArgments函數(shù)原型:void GetArgments(intargc,char**argv)GetArgments函數(shù)用于獵取用戶提交的參數(shù)。其中argc表示獵取的參數(shù)個(gè)數(shù),argv用于存儲(chǔ)獵取的參數(shù),這兩個(gè)形參和主函數(shù)中的形參表示的意義一樣的。4)checkSum函數(shù)原型:USHORT checkSum(USHORT *buffer,int size)checkSum函數(shù)用于計(jì)算校驗(yàn)和。計(jì)算過(guò)程是首先把數(shù)據(jù)報(bào)頭中的校驗(yàn)和字段設(shè)置為0,然后對(duì)首部中每個(gè)16bit 進(jìn)展二字段進(jìn)制反碼求和〔整個(gè)首部看成是由一串16bit的字組成,結(jié)果存在校驗(yàn)和字段中。buffer用于存放ICMP數(shù)據(jù),sizeICMP報(bào)文大小。5)FillCMPData函數(shù)原型:void FillCMPDataFillCMPDataICMP數(shù)據(jù)報(bào)中各個(gè)字段。其中icmp_data表示ICMP數(shù)據(jù),datasizeICMP報(bào)文大小。6) reeRes函數(shù)原型:void reeResreeRes函數(shù)用于釋放占用的資源,包括關(guān)閉初始化socket調(diào)用的函數(shù)的、關(guān)閉創(chuàng)立的socket和釋放安排的內(nèi)存等。7)DecodeIPOptions函數(shù)原型:void DecodeIPOptionsIP選項(xiàng),從中讀出從源主機(jī)到目的主機(jī)經(jīng)過(guò)的路由,并輸出路由信息。BufICMP報(bào)文的緩沖區(qū),bytes表示接收到的字節(jié)數(shù)。8)DecodelICMPHeader函數(shù)原型:void DecodelICMPHeader(char*buf,intbytes,SOCKADDR_IN*from)DecodelICMPHeader函數(shù)用于解讀ICMP報(bào)文信息。Buf表示存放接收到的ICMP報(bào)文的緩沖區(qū),bytes表示接收到的字節(jié)數(shù),from表示發(fā)送ICMP回顯應(yīng)答的 主機(jī)IP 地址。9)PingTest函數(shù)原型:void PingTest(inttimeout)PingTestPingtimeout表示設(shè)定的發(fā)送超時(shí)值。9.4 程序?qū)崿F(xiàn)9.1.4源碼分析程序預(yù)處理/*導(dǎo)入庫(kù)文件*/#pragmacomment(lib,“ws2_32.lib“)/*加載頭文件*/#include<winsock2.h>#include<ws2tcpip.h>#include<stdio.h>#include<stdlib.h>#include<math.h>/*定義常量*//*表示要記錄路由*/#defineIP_RECORD_ROUTE0x7/*默認(rèn)數(shù)據(jù)報(bào)大小*/#defineDEF_PACKET_SIZE32/*ICMP數(shù)據(jù)報(bào)大小*/#defineMAX_PACKET1024/*IP頭長(zhǎng)度*/#defineMAX_IP_HDR_SIZE60/*ICMP報(bào)文類型,回顯懇求*/#defineICMP_ECHO8/*ICMP報(bào)文類型,回顯應(yīng)答*/#defineICMP_ECHOREPLY0/*ICMP數(shù)據(jù)報(bào)大小*/#defineICMP_MIN 8/*自定義函數(shù)原型*/voidInitPing;voidUserHelp;voidGetArgments(intargc,char**argv);USHORTCheckSum(USHORT*buffer,intsize);voidFillICMPData(char*icmp_data,intdatasize);voidFreeRes;voidDecodeIPOptions(char*buf,intbytes);voidDecodeICMPHeader(char*buf,intbytes,SOCKADDR_IN*from);voidPingTest(inttimeout);/*IP報(bào)頭字段數(shù)據(jù)構(gòu)造*/typedefstruct_iphdr{unsignedint h_len:4; /*IP報(bào)頭長(zhǎng)度*/unsignedint version:4; /*IP的版本號(hào)*/unsignedchar tos; /*效勞的類型*/unsignedshorttotal_len; /*數(shù)據(jù)報(bào)總長(zhǎng)度*/unsignedshortident; /*惟一的標(biāo)識(shí)符*/unsignedshortfrag_flags; /*分段標(biāo)志*/unsignedchar ttl; /*生存期*/unsignedchar proto; /*協(xié)議類型(TCP、UDP等)*/unsignedshortchecksum; /*校驗(yàn)和*/unsignedint sourceIP; /*源IP地址*/unsignedint destIP; /*目的IP地址*/}IpHeader;/*ICMP報(bào)頭字段數(shù)據(jù)構(gòu)造*/typedefstruct_icmphdr{BYTE i_type; /*ICMP報(bào)文類型*/BYTE i_code; /*該類型中的代碼號(hào)*/USHORTi_cksum; /*校驗(yàn)和*/USHORTi_id; /*惟一的標(biāo)識(shí)符*/USHORTi_seq; /*序列號(hào)*/ULONG timestamp; /*時(shí)間戳*/}IcmpHeader;/*IP選項(xiàng)頭字段數(shù)據(jù)構(gòu)造*/typedefstruct_ipoptionhdr{unsignedcharcode;/*選項(xiàng)類型*/unsignedcharlen;/*選項(xiàng)頭長(zhǎng)度*/unsignedcharptr;/*地址偏移長(zhǎng)度*/unsignedlongaddr[9];/*IP地址列表*/}IpOptionHeader;/*定義全局變量*/SOCKETm_socket;IpOptionHeaderIpOption;SOCKADDR_INDestAddr;SOCKADDR_INSourceAddr;char*icmp_data;char*recvbuf;USHORTseq_no;char*lpdest;intdatasize;BOOLRecordFlag;doublePacketNum;BOOLSucessFlag;初始化模塊/*初始化變量函數(shù)*/voidInitPing{WSADATAwsaData;icmp_data=NULL;seq_no=0;recvbuf=NULL;RecordFlag=FALSE;lpdest=NULL;datasize=DEF_PACKET_SIZE;PacketNum=5;SucessFlag=FALSE;/*Winsock初始化*/if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0){/*假設(shè)初始化不成功則報(bào)錯(cuò),GetLastError返回發(fā)生的錯(cuò)誤信息*/printf(“WSAStartupfailed:%d\n“,GetLastError);return;}}功能把握模塊/*顯示信息函數(shù)*/voidUserHelp{printf(“UserHelp:ping-r<host>[datasize]\n“);printf(“-rrecordroute\n“);printf(“-nrecordamount\n“);printf(“hostremotemachinetoping\n“);printf(“datasizecanbeupto1KB\n“);ExitProcess(-1);}/*ping選項(xiàng)函數(shù)*/voidGetArgments(intargc,char**argv){inti;intj;intlen;intm;/*假設(shè)沒(méi)有指定目的地地址和任何選項(xiàng)*/if(argc==1){printf(“\nPlease specify the destination IPaddress and the ping option follow!\n“);UserHelp;}for(i=1;i<argc;i++){=strlen(argv[i]);if(argv[i][0]==”-”){/*選項(xiàng)指示要獵取記錄的條數(shù)*/if(isdigit(argv[i][1])){}else{
PacketNum=0;for(j=len-1,exp=0;j>=1;j--,exp++)/*argv[i][j]ASCII值計(jì)算要獵取的記錄條數(shù)(十進(jìn)制數(shù))*/PacketNum((double)(argv[i][j]-48))*pow(10,exp);switch(tolower(argv[i][1])){/*選項(xiàng)指示要獵取路由信息*/case”r”:RecordFlag=TRUE;break;/*沒(méi)有按要求供給選項(xiàng)*/default:UserHelp;break;}}}/*參數(shù)是數(shù)據(jù)報(bào)大小或者IP地址*/elseif(isdigit(argv[i][0])){for(m=1;m<len;m++){if(!(isdigit(argv[i][m]))){/*IP地址*/lpdest=argv[i];break;}/*是數(shù)據(jù)報(bào)大小*/elseif(m==len-1)datasize=atoi(argv[i]);}}/*參數(shù)是主機(jī)名*/elselpdest=argv[i];}}/*求校驗(yàn)和函數(shù)*/USHORTCheckSum(USHORT*buffer,intsize){unsignedlongcksum=0;while(size>1){cksum+=*buffer++;size-=sizeof(USHORT);}if(size){cksum+=*(UCHAR*)buffer;}/*16bit進(jìn)展二進(jìn)制反碼求和*/cksum=(cksum>>16)+(cksum&0xffff);cksum(cksum>>16);return(USHORT)(~cksum);}/*ICMP數(shù)據(jù)報(bào)字段函數(shù)*/voidFillICMPData(char*icmp_data,intdatasize){IcmpHeader*icmp_hdr=NULL;char *datapart=NULL;icmp_hdr=(IcmpHeader*)icmp_data;/*ICMP報(bào)文類型設(shè)置為回顯懇求*/icmp_hdr->i_type=ICMP_ECHO;icmp_hdr->i_code0;/*IP作為標(biāo)識(shí)符*/icmp_hdr->i_id=(USHORT)GetCurrentProcessId;icmp_hdr->i_cksum=0;icmp_hdr->i_seq=0;datapart=icmp_data+sizeof(IcmpHeader);/*0填充剩余空間*/memset(datapart,”0”,datasize-sizeof(IcmpHeader));}/*釋放資源函數(shù)*/voidFreeRes{/*關(guān)閉創(chuàng)立的套接字*/if(m_socket!=INVALID_SOCKET)closesocket(m_socket);/*釋放安排的內(nèi)存*/HeapFree(GetProcessHeap,0,recvbuf);HeapFree(GetProcessHeap,0,icmp_data);調(diào)用*/WSACleanup;return;}數(shù)據(jù)報(bào)解讀模塊/*IP選項(xiàng)頭函數(shù)*/voidDecodeIPOptions(char*buf,intbytes){IpOptionHeader*ipopt=NULL;IN_ADDRinaddr;inti;HOSTENT*host=NULL;/*獵取路由信息的地址入口*/ipopt=(IpOptionHeader*)(buf+20);printf(“RR: “);for(i=0;i<(ipopt->ptr/4)-1;i++){inaddr.S_un.S_addr=ipopt->addr[i];if(i!=0)printf(“ “);/*IP地址獵取主機(jī)名*/host = gethostbyaddr((char *)&inaddr.S_un.S_addr,sizeof(inaddr.S_un.S_addr),AF_INET);/*假設(shè)獵取到了主機(jī)名,則輸出主機(jī)名*/if(host)printf(“(%-15s)%s\n“,inet_ntoa(inaddr),host->h_name);/*IP地址*/elseprintf(“(%-15s)\n“,inet_ntoa(inaddr));}return;}/*ICMP報(bào)頭函數(shù)*/voidDecodeICMPHeader(char*buf,intbytes,SOCKADDR_IN*from){IpHeader*iphdr=NULL;IcmpHeader*icmphdr=NULL;unsignedshortiphdrlen;DWORDtick;staticinticmpcount=0;iphdr=(IpHeader*)buf;/*IP報(bào)頭的長(zhǎng)度*/iphdrlen=iphdr->h_len*4;tickGetTickCount;/*IP報(bào)頭的長(zhǎng)度為最大長(zhǎng)度(20字節(jié))IP選項(xiàng),需要解讀IP選項(xiàng)*/if((iphdrlen==MAX_IP_HDR_SIZE)&&(!icmpcount))/*IP選項(xiàng),即路由信息*/DecodeIPOptions(buf,bytes);/*假設(shè)讀取的數(shù)據(jù)太小*/if(bytes<iphdrlen+ICMP_MIN){printf(“Toofewbytesfrom%s\n“,inet_ntoa(from->sin_addr));}icmphdr=(IcmpHeader*)(buf+iphdrlen);/*假設(shè)收到的不是回顯應(yīng)答報(bào)文則報(bào)錯(cuò)*/if(icmphdr->i_type!=ICMP_ECHOREPLY){printf(“nonechotype%drecvd\n“,icmphdr->i_type);return;}/*ID號(hào)和發(fā)送的是否全都*/if(icmphdr->i_id!=(USHORT)GetCurrentProcessId){printf(“someoneelse”spacket!\n“);return;}SucessFlag=TRUE;/*輸出記錄信息*/printf(“%dbytesfrom%s:“,bytes,inet_ntoa(from->sin_addr));printf(“icmp_seq=%d.“,icmphdr->i_seq);printf(“time:%dms“,tick-icmphdr->timestamp);printf(“\n“);icmpcount++;return;}Ping測(cè)試模塊/*ping函數(shù)*/voidPingTest(inttimeout){intret;intreadNum;intfromlen;structhostent*hp=NULL;/*創(chuàng)立原始套接字,該套接字用于ICMP協(xié)議*/m_socket = WSASocket(AF_INET, SOCK_RAW, 0,WSA_FLAG_OVERLAPPED);/*假設(shè)套接字創(chuàng)立不成功*/{
NULL,printf(“WSASocketfailed:%d\n“,WSAGetLastError);return;}/*假設(shè)要求記錄路由選項(xiàng)*/if(RecordFlag){/*IP0初始化*/ZeroMemory(&IpOption,sizeof(IpOption));/*為每個(gè)ICMP包設(shè)置路由選項(xiàng)*/IpOption.code=IP_RECORD_ROUTE;IpOption.ptr =4;IpOption.len =39;ret = setsockopt(m_socket, IPPROTO_IP, IP_OPTIONS,(char *)&IpOption,sizeof(IpOption));if(ret==SOCKET_ERROR){printf(“setsockopt(IP_OPTIONS)failed:%d\n“,WSAGetLastError);}}/*設(shè)置接收的超時(shí)值*/readNum=setsockopt(m_socket,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout,sizeof(timeout));if(readNum==SOCKET_ERROR){printf(“setsockopt(SO_RCVTIMEO)failed:%d\n“,WSAGetLastError);return;}/*設(shè)置發(fā)送的超時(shí)值*/timeout1000;readNum=setsockopt(m_socket,SOL_SOCKET,SO_SNDTIMEO,(char*)&timeout,sizeof(timeout));if(readNum==SOCKET_ERROR){printf(“setsockopt(SO_SNDTIMEO)failed:%d\n“,WSAGetLastError);return;}/*0初始化目的地地址*/memset(&DestAddr,0,sizeof(DestAddr));/*設(shè)置地址族,這里表示使用IP地址族*/DestAddr.sin_familyAF_INET;if((DestAddr.sin_addr.s_addr=inet_addr(lpdest))==INADDR_NONE){/*IP地址*/if((hp=gethostbyname(lpdest))!=NULL){/*IP值賦給目的地地址中的相應(yīng)字段*/memcpy(&(DestAddr.sin_addr),hp->h_addr,hp->h_length);/*將獵取到的地址族值賦給目的地地址中的相應(yīng)字段*/DestAddr.sin_familyhp->h_addrtype;printf(“DestAddr.sin_addr=%s\n“,inet_ntoa(DestAddr.sin_addr));}/*獵取不成功*/else{printf(“gethostbynamefailed:%d\n“,WSAGetLastError);return;}}/*ICMP報(bào)頭*/datasizesizeof(IcmpHeader);/*依據(jù)默認(rèn)堆句柄,從堆中安排MAX_PACKET內(nèi)存塊,安排內(nèi)存的內(nèi)容將被初始0*/icmp_data =(char*) HeapAlloc(GetProcessHeap,HEAP_ZERO_MEMORY,MAX_PACKET);recvbuf =(char*) HeapAlloc(GetProcessHeap,HEAP_ZERO_MEMORY,MAX_PACKET);/*假設(shè)安排內(nèi)存不成功*/if(!icmp_data){printf(“HeapAllocfailed:%d\n“,GetLastError);return;}/*ICMP報(bào)文*/memset(icmp_data,0,MAX_PACKET);FillICMPData(icmp_data,datasize);while(1){stat
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 電子圖書(shū)出版與運(yùn)營(yíng)手冊(cè)
- 房屋租賃三方合同格式
- 焊接工藝與材料選擇作業(yè)指導(dǎo)書(shū)
- 成本合同管理大全
- 生物科技居間合同協(xié)議書(shū)
- 有關(guān)事業(yè)單位合同
- 2025年呼和浩特貨運(yùn)從業(yè)資格證模擬考試題下載
- 2025年南昌從業(yè)資格貨運(yùn)資格考試題庫(kù)答案解析
- 2025年龍巖a2駕駛證貨運(yùn)從業(yè)資格證模擬考試
- 電力市場(chǎng)策略合同(2篇)
- 跨領(lǐng)域安檢操作標(biāo)準(zhǔn)化的現(xiàn)狀與挑戰(zhàn)
- 2024年08月香港2024年中國(guó)銀行(香港)有限公司校園招考筆試歷年參考題庫(kù)附帶答案詳解
- 大模型落地應(yīng)用實(shí)踐方案
- 2025年重慶三峽擔(dān)保集團(tuán)招聘筆試參考題庫(kù)含答案解析
- 2025年八省聯(lián)考內(nèi)蒙古高考生物試卷真題答案詳解(精校打印)
- 地下室頂板后澆帶混凝土構(gòu)造柱支撐方案
- GB/T 19799.2-2024無(wú)損檢測(cè)超聲檢測(cè)試塊第2部分:2號(hào)標(biāo)準(zhǔn)試塊
- 2024山東一卡通文化旅游一卡通合作協(xié)議3篇
- GB/T 45091-2024塑料再生塑料限用物質(zhì)限量要求
- 人教版八年級(jí)上冊(cè)地理 2024-2025學(xué)年八年級(jí)上冊(cè)地理期中測(cè)試卷(二)(含答案)
- 2025屆高三歷史二輪復(fù)習(xí)教學(xué)計(jì)劃
評(píng)論
0/150
提交評(píng)論