




下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Ping6程序的實(shí)現(xiàn)Ping6函數(shù)主要用于向一個(gè)節(jié)點(diǎn)發(fā)送回送請(qǐng)求報(bào)文并接收該節(jié)點(diǎn)回復(fù)的回送應(yīng)答報(bào)文用于確定一個(gè)節(jié)點(diǎn)的可達(dá)性及往返時(shí)間延遲。回送請(qǐng)求報(bào)文格式如下:標(biāo)識(shí)符和序列號(hào)由源節(jié)點(diǎn)產(chǎn)生,用于將請(qǐng)求報(bào)文和應(yīng)答報(bào)文對(duì)應(yīng)起來,其中數(shù)據(jù)可以是任意字節(jié)的任意數(shù)據(jù)。回送應(yīng)答報(bào)文格式如下:回送應(yīng)答報(bào)文的標(biāo)識(shí)符和序列號(hào)及數(shù)據(jù)都是由請(qǐng)求報(bào)文中獲得。在linux下ICMPv6的報(bào)文頭結(jié)構(gòu)如下:本程序中,報(bào)文簡(jiǎn)化為只包含消息類型、消息代碼、數(shù)據(jù)報(bào)的ID、數(shù)據(jù)報(bào)的序列號(hào)及數(shù)據(jù)段幾個(gè)部分。ICMPV6回送請(qǐng)求報(bào)文類型為128;ICMPV6回送請(qǐng)求報(bào)文代碼值為0;ICMPV6回送請(qǐng)求報(bào)文序列號(hào)通常為一個(gè)遞增的數(shù)生成IC
2、MPV6回送請(qǐng)求報(bào)文的ID用于對(duì)應(yīng)回送應(yīng)答報(bào)文,通常用進(jìn)程的PID補(bǔ)充同時(shí)保存發(fā)送時(shí)間。int icmpv6_pack(int pack_num) int i,packsize;struct icmp6_hdr *icmpv6;struct timeval *tval;icmpv6=(struct icmp6_hdr*)sendbuf;icmpv6->icmp6_type=128; /消息類型為ICMPv6回顯請(qǐng)求icmpv6->icmp6_code=0; /code為0icmpv6->icmp6_cksum=0; /校驗(yàn)和初始值為0icmpv6->icmp6_seq=
3、pack_num; /序列號(hào)icmpv6->icmp6_id=pid; /進(jìn)程pidpacksize=8+datalen;gettimeofday(sendtime,NULL); /獲取發(fā)送數(shù)據(jù)時(shí)間return packsize;發(fā)送報(bào)文:將打包好的數(shù)據(jù)通過原始套接字發(fā)送到指定地址,使用sendto函數(shù)。每次發(fā)送成功后序列號(hào)增加1,即nsend+void icmp6_send()int packetsize;if(nsend < max_loop_num)nsend+; /發(fā)送序列號(hào)加1packetsize =icmpv6_pack(nsend); /打包數(shù)據(jù)if(sendto(s
4、ocksaw,sendbuf,packetsize,0,(struct sockaddr *)&send_addr,sizeof(send_addr)<0) /發(fā)送數(shù)據(jù)包perror("sento error"); 接受報(bào)文:接受報(bào)文在接收數(shù)據(jù)包的值小于發(fā)送數(shù)據(jù)包的值時(shí),繼續(xù)接收數(shù)據(jù)包,通過recvfrom函數(shù)將接收到的數(shù)據(jù)存儲(chǔ)到recvbuf中,將發(fā)送數(shù)據(jù)端的IP地址存儲(chǔ)在recv_addr中,記錄接收數(shù)據(jù)包的時(shí)間,調(diào)用unpack函數(shù)對(duì)數(shù)據(jù)包進(jìn)行解包和數(shù)據(jù)分析。接收到一個(gè)報(bào)文后接收序列號(hào)并沒有加1,而是在解包后確定數(shù)據(jù)包正確后加1,防止接收錯(cuò)誤的報(bào)文導(dǎo)致丟
5、包的情況。void icmp6_recv() int n,fromlen;fromlen =sizeof(recv_addr);while(nrecv <nsend) /接收?qǐng)?bào)文少于發(fā)送報(bào)文,繼續(xù)接收 if(n = recvfrom(socksaw,recvbuf,sizeof(recvbuf),0, (struct sockaddr *)&recv_addr,&fromlen)<0) /接收?qǐng)?bào)文 perror("recvfrom error"); gettimeofday(&recvtime,NULL); /保存接收數(shù)據(jù)包時(shí)間 unpa
6、ck(recvbuf,n); /解壓數(shù)據(jù)包,并數(shù)據(jù)處理解壓收到的報(bào)文:接收到報(bào)文后判斷報(bào)文長(zhǎng)度是不是太短,如果不是證明報(bào)文有效,需要判斷報(bào)文的類型是否為回送應(yīng)答報(bào)文即類型號(hào)是不是129,并核實(shí)其標(biāo)識(shí)ID是否是本進(jìn)程PID,確定報(bào)文正確后,接收序列號(hào)加1.通過接收?qǐng)?bào)文的時(shí)間減去發(fā)送報(bào)文的時(shí)間,可以得到報(bào)文往返時(shí)間。最后是對(duì)返回信息進(jìn)行顯示,因?yàn)閕pv6為128個(gè)字節(jié),中間為0的位一般用:代替,為了顯示美觀,采用了標(biāo)志位flag進(jìn)行判斷,達(dá)到顯示標(biāo)準(zhǔn)ipv6地址格式的目的。int unpack(char *buf,int len) int i; int iphdrlen; struct ip6 *
7、ip6; struct icmp6_hdr *icmpv6; double rtt; int flag=0; icmpv6 = (struct icmp6_hdr *)(buf); /獲得ICMPv6報(bào)文地址 if(len<8) printf("ICMP packer's length is less than 8n"); return(-1); /*檢查消息類型和進(jìn)程號(hào)是否匹配*/ if(icmpv6->icmp6_type =129)&&(icmpv6->icmp6_id = pid) nrecv+; /判斷數(shù)據(jù)有效,接收序列號(hào)
8、加1 different.tv_sec = recvtime.tv_sec - sendtime->tv_sec; different.tv_usec = recvtime.tv_usec - sendtime->tv_usec; /計(jì)算時(shí)間差 rtt = different.tv_sec*1000.0 + different.tv_usec/1000.0; printf("%d bytes from:",len); for(i=0;i<16;i+) /打印ipv6地址 if(recv_addr.sin6_addr.s6_addri=0&&
9、flag=0) printf(":"); flag=1; else if(recv_addr.sin6_addr.s6_addri=0&&flag=1) flag=flag; else if(recv_addr.sin6_addr.s6_addri!=0&&flag=1) printf("%02x",recv_addr.sin6_addr.s6_addri); flag=2; elseprintf("%02x",recv_addr.sin6_addr.s6_addri); printf(" i
10、cmp_seq=%u time=%1.4f msn",icmpv6->icmp6_seq,rtt); 主函數(shù):主函數(shù)主要包括以下幾個(gè)部分:(1) 對(duì)參數(shù)個(gè)數(shù)進(jìn)行判斷,判斷參數(shù)是否有效。(2) 通過套接字選項(xiàng)設(shè)置發(fā)送和接收超時(shí)選項(xiàng)。(3) 進(jìn)行地址處理,首先通過inet_pton函數(shù)將字符串格式的地址轉(zhuǎn)換為二進(jìn)制地址,然后拷貝到對(duì)應(yīng)套接字地址結(jié)構(gòu)體,為發(fā)送數(shù)據(jù)準(zhǔn)備。(4) 循環(huán)發(fā)送接收max_loop_num次。void main(int argc,char *argv)switch(argc) /判斷參數(shù)個(gè)數(shù), case 3:max_loop_num = atoi(argv2)
11、;case 2:printf(" receice 1 parameter:n");printf("param 1:%sn",argv1);printf("n");tv.tv_sec=5;tv.tv_usec =0;break;default:printf("please input correct paramn");exit(0);break; socksaw = socket(PF_INET6,SOCK_RAW,IPPROTO_ICMPV6); /建立套接字 setsockopt(socksaw, SOL_SOC
12、KET, SO_RCVTIMEO, &tv, sizeof(struct timeval);/接收超時(shí) setsockopt(socksaw, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(struct timeval);/發(fā)送超時(shí) send_addr.sin6_family =AF_INET6; addrptr=inet_pton(AF_INET6,argv1,&addr); /地址轉(zhuǎn)換 if(addrptr>0) printf("inet_pton:ip,%sn",argv1); elseprintf("err addr:%dn",addrptr); memcpy(&send_addr.sin6_addr,&addr,sizeof(addr); /獲取地址 pid = getpid(); /進(jìn)程PID while(nsend<max_loop_
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- Antifungal-agent-125-生命科學(xué)試劑-MCE
- 福建省龍海一中2025年高三下學(xué)期聯(lián)考試卷(一)物理試題試卷
- 山西省朔州市本年度(2025)小學(xué)一年級(jí)數(shù)學(xué)統(tǒng)編版期末考試(上學(xué)期)試卷及答案
- 高考河北理綜試題及答案
- 谷歌智力測(cè)試題及答案
- 鄭職語文試題題庫及答案
- 藥劑類考試已經(jīng)準(zhǔn)備試題及答案
- 2024-2025學(xué)年江蘇省丹陽中學(xué)高三六校第一次聯(lián)考物理試卷含解析
- 高質(zhì)量發(fā)展試題及答案
- 合規(guī)聯(lián)系人培訓(xùn)
- 陜西省公務(wù)員招聘面試真題和考官題本及答案102套
- 鐵路工務(wù)巡道工崗位作業(yè)標(biāo)準(zhǔn)(崗位職責(zé)、崗位風(fēng)險(xiǎn))
- 陜西省建筑施工質(zhì)量驗(yàn)收技術(shù)資料統(tǒng)一用表
- 幼兒園紅色故事繪本:《雞毛信》 課件
- 監(jiān)理畢業(yè)論文開題報(bào)告(文獻(xiàn)綜述+計(jì)劃書),開題報(bào)告
- 夾層鋼結(jié)構(gòu)施工方案鋼結(jié)構(gòu)夾層施工方案
- CB/T 3707-1995船用漩渦泵修理技術(shù)要求
- HEY JUDE歌詞逐字逐句教唱
- Axio-Imager-M2顯微鏡使用手冊(cè)課件
- 三年級(jí)語文下冊(cè)第三單元《古詩三首》教案
- 2014鄭開馬拉松醫(yī)療培訓(xùn)
評(píng)論
0/150
提交評(píng)論