亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? 用c語言實(shí)現(xiàn)ping程序功能.txt

?? 用C語言實(shí)現(xiàn)Ping程序功能/用C語言實(shí)現(xiàn)Ping程序功能
?? TXT
字號:
數(shù)據(jù)統(tǒng)計(jì)

系統(tǒng)自帶的ping命令當(dāng)它接送完所有ICMP報(bào)文后,會(huì)對所有發(fā)送和所有接收的ICMP報(bào)文進(jìn)行統(tǒng)計(jì),從而計(jì)算ICMP報(bào)文丟失的比率。為達(dá)此目的,定義兩個(gè)全局變量:接收計(jì)數(shù)器和發(fā)送計(jì)數(shù)器,用于記錄ICMP報(bào)文接受和發(fā)送數(shù)目。丟失數(shù)目=發(fā)送總數(shù)-接收總數(shù),丟失比率=丟失數(shù)目/發(fā)送總數(shù)。

現(xiàn)給出模擬Ping程序功能的代碼如下: /***********************************************************
 * 作者:梁俊輝                                             *
 * 時(shí)間:2001年10月                                         *
 * 名稱:myping.c                                          *
 * 說明:本程序用于演示ping命令的實(shí)現(xiàn)原理                   *
 ***********************************************************/
#include <stdio.h>
#include <signal.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <netinet/ip_icmp.h>
#include <netdb.h>
#include <setjmp.h>
#include <errno.h>
#define PACKET_SIZE     4096
#define MAX_WAIT_TIME   5
#define MAX_NO_PACKETS  3
char sendpacket[PACKET_SIZE];
char recvpacket[PACKET_SIZE];
int sockfd,datalen=56;
int nsend=0,nreceived=0;
struct sockaddr_in dest_addr;
pid_t pid;
struct sockaddr_in from;
struct timeval tvrecv;
void statistics(int signo);
unsigned short cal_chksum(unsigned short *addr,int len);
int pack(int pack_no);
void send_packet(void);
void recv_packet(void);
int unpack(char *buf,int len);
void tv_sub(struct timeval *out,struct timeval *in);
void statistics(int signo)
{       printf("\n--------------------PING statistics-------------------\n");
        printf("%d packets transmitted, %d received , %%%d lost\n",nsend,nreceived,
                        (nsend-nreceived)/nsend*100);
        close(sockfd);
        exit(1);
}
/*校驗(yàn)和算法*/
unsigned short cal_chksum(unsigned short *addr,int len)
{       int nleft=len;
        int sum=0;
        unsigned short *w=addr;
        unsigned short answer=0;
		
/*把ICMP報(bào)頭二進(jìn)制數(shù)據(jù)以2字節(jié)為單位累加起來*/
        while(nleft>1)
        {       sum+=*w++;
                nleft-=2;
        }
		/*若ICMP報(bào)頭為奇數(shù)個(gè)字節(jié),會(huì)剩下最后一字節(jié)。把最后一個(gè)字節(jié)視為一個(gè)2字節(jié)數(shù)據(jù)的高字節(jié),這個(gè)2字節(jié)數(shù)據(jù)的低字節(jié)為0,繼續(xù)累加*/
        if( nleft==1)
        {       *(unsigned char *)(&answer)=*(unsigned char *)w;
                sum+=answer;
        }
        sum=(sum>>16)+(sum&0xffff);
        sum+=(sum>>16);
        answer=~sum;
        return answer;
}
/*設(shè)置ICMP報(bào)頭*/
int pack(int pack_no)
{       int i,packsize;
        struct icmp *icmp;
        struct timeval *tval;
        icmp=(struct icmp*)sendpacket;
        icmp->icmp_type=ICMP_ECHO;
        icmp->icmp_code=0;
        icmp->icmp_cksum=0;
        icmp->icmp_seq=pack_no;
        icmp->icmp_id=pid;
        packsize=8+datalen;
        tval= (struct timeval *)icmp->icmp_data;
        gettimeofday(tval,NULL);    /*記錄發(fā)送時(shí)間*/
        icmp->icmp_cksum=cal_chksum( (unsigned short *)icmp,packsize); /*校驗(yàn)算法*/
        return packsize;
}
/*發(fā)送三個(gè)ICMP報(bào)文*/
void send_packet()
{       int packetsize;
        while( nsend<MAX_NO_PACKETS)
        {       nsend++;
                packetsize=pack(nsend); /*設(shè)置ICMP報(bào)頭*/
                if( sendto(sockfd,sendpacket,packetsize,0,
                          (struct sockaddr *)&dest_addr,sizeof(dest_addr) )<0  )
                {       perror("sendto error");
                        continue;
                }
                sleep(1); /*每隔一秒發(fā)送一個(gè)ICMP報(bào)文*/
        }
}
/*接收所有ICMP報(bào)文*/
void recv_packet()
{       int n,fromlen;
        extern int errno;
        signal(SIGALRM,statistics);
        fromlen=sizeof(from);
        while( nreceived<nsend)
        {       alarm(MAX_WAIT_TIME);
                if( (n=recvfrom(sockfd,recvpacket,sizeof(recvpacket),0,
                                (struct sockaddr *)&from,&fromlen)) <0)
                {       if(errno==EINTR)continue;
                        perror("recvfrom error");
                        continue;
                }
                gettimeofday(&tvrecv,NULL);  /*記錄接收時(shí)間*/
                if(unpack(recvpacket,n)==-1)continue;
                nreceived++;
        }
}
/*剝?nèi)CMP報(bào)頭*/
int unpack(char *buf,int len)
{       int i,iphdrlen;
        struct ip *ip;
        struct icmp *icmp;
        struct timeval *tvsend;
        double rtt;
        ip=(struct ip *)buf;
        iphdrlen=ip->ip_hl<<2;    /*求ip報(bào)頭長度,即ip報(bào)頭的長度標(biāo)志乘4*/
        icmp=(struct icmp *)(buf+iphdrlen);  /*越過ip報(bào)頭,指向ICMP報(bào)頭*/
        len-=iphdrlen;            /*ICMP報(bào)頭及ICMP數(shù)據(jù)報(bào)的總長度*/
        if( len<8)                /*小于ICMP報(bào)頭長度則不合理*/
        {       printf("ICMP packets\'s length is less than 8\n");
                return -1;
        }
        /*確保所接收的是我所發(fā)的的ICMP的回應(yīng)*/
        if( (icmp->icmp_type==ICMP_ECHOREPLY) && (icmp->icmp_id==pid) )
        {       tvsend=(struct timeval *)icmp->icmp_data;
                tv_sub(&tvrecv,tvsend);  /*接收和發(fā)送的時(shí)間差*/
                rtt=tvrecv.tv_sec*1000+tvrecv.tv_usec/1000;  /*以毫秒為單位計(jì)算rtt*/
                /*顯示相關(guān)信息*/
                printf("%d byte from %s: icmp_seq=%u ttl=%d rtt=%.3f ms\n",
                        len,
                        inet_ntoa(from.sin_addr),
                        icmp->icmp_seq,
                        ip->ip_ttl,
                        rtt);
        }
        else    return -1;
}
main(int argc,char *argv[])
{       struct hostent *host;
        struct protoent *protocol;
        unsigned long inaddr=0l;
        int waittime=MAX_WAIT_TIME;
        int size=50*1024;
        if(argc<2)
        {       printf("usage:%s hostname/IP address\n",argv[0]);
                exit(1);
        }
        if( (protocol=getprotobyname("icmp") )==NULL)
        {       perror("getprotobyname");
                exit(1);
        }
        /*生成使用ICMP的原始套接字,這種套接字只有root才能生成*/
        if( (sockfd=socket(AF_INET,SOCK_RAW,protocol->p_proto) )<0)
        {       perror("socket error");
                exit(1);
        }
        /* 回收root權(quán)限,設(shè)置當(dāng)前用戶權(quán)限*/
        setuid(getuid());
        /*擴(kuò)大套接字接收緩沖區(qū)到50K這樣做主要為了減小接收緩沖區(qū)溢出的
          的可能性,若無意中ping一個(gè)廣播地址或多播地址,將會(huì)引來大量應(yīng)答*/
        setsockopt(sockfd,SOL_SOCKET,SO_RCVBUF,&size,sizeof(size) );
        bzero(&dest_addr,sizeof(dest_addr));
        dest_addr.sin_family=AF_INET;
        /*判斷是主機(jī)名還是ip地址*/
        if( inaddr=inet_addr(argv[1])==INADDR_NONE)
        {       if((host=gethostbyname(argv[1]) )==NULL) /*是主機(jī)名*/
                {       perror("gethostbyname error");
                        exit(1);
                }
                memcpy( (char *)&dest_addr.sin_addr,host->h_addr,host->h_length);
        }
        else    /*是ip地址*/
                memcpy( (char *)&dest_addr,(char *)&inaddr,host->h_length);
        /*獲取main的進(jìn)程id,用于設(shè)置ICMP的標(biāo)志符*/
        pid=getpid();
        printf("PING %s(%s): %d bytes data in ICMP packets.\n",argv[1],
                        inet_ntoa(dest_addr.sin_addr),datalen);
        send_packet();  /*發(fā)送所有ICMP報(bào)文*/
        recv_packet();  /*接收所有ICMP報(bào)文*/
        statistics(SIGALRM); /*進(jìn)行統(tǒng)計(jì)*/
        return 0;
}
/*兩個(gè)timeval結(jié)構(gòu)相減*/
void tv_sub(struct timeval *out,struct timeval *in)
{       if( (out->tv_usec-=in->tv_usec)<0)
        {       --out->tv_sec;
                out->tv_usec+=1000000;
        }
        out->tv_sec-=in->tv_sec;
}
/*------------- The End -----------*/
 





 


 回頁首 
 



特別注意

只有root用戶才能利用socket()函數(shù)生成原始套接字,要讓Linux的一般用戶能執(zhí)行以上程序,需進(jìn)行如下的特別操作:

用root登陸,編譯以上程序:gcc -o myping myping.c,其目的有二:一是編譯,二是讓myping屬于root用戶。

再執(zhí)行chmod u+s myping,目的是把myping程序設(shè)成SUID的屬性。

退出root,用一般用戶登陸,執(zhí)行./myping www.cn.ibm.com,有以下執(zhí)行結(jié)果: PING www.cn.ibm.com(202.95.2.148): 56 bytes data in ICMP packets.
64 byte from 202.95.2.148: icmp_seq=1 ttl=242 rtt=3029.000 ms
64 byte from 202.95.2.148: icmp_seq=2 ttl=242 rtt=2020.000 ms
64 byte from 202.95.2.148: icmp_seq=3 ttl=242 rtt=1010.000 ms
--------------------PING statistics-------------------
3 packets transmitted, 3 received , %0 lost
 



由于myping.c是發(fā)送完所有的ICMP報(bào)文才去接收,因此第一、第二和第三個(gè)ICMP報(bào)文的往返時(shí)間依此是3秒,2秒,1秒,上述結(jié)果中rtt信息正反映這一事實(shí)。

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲精品视频一区| 国产成人福利片| 亚洲va中文字幕| 亚洲精品国久久99热| 国产精品久久久久精k8| 国产校园另类小说区| 久久女同互慰一区二区三区| 日韩免费电影网站| 精品粉嫩超白一线天av| 欧美变态tickle挠乳网站| 欧美r级在线观看| 久久久亚洲欧洲日产国码αv| 2023国产一二三区日本精品2022| 亚洲精品一区二区三区影院| 日韩精品在线一区二区| 精品国产一区二区国模嫣然| 久久精品欧美一区二区三区麻豆| 久久精品夜夜夜夜久久| 国产喷白浆一区二区三区| 国产精品成人在线观看| 成人欧美一区二区三区视频网页 | 国产三级精品视频| 中文字幕亚洲视频| 一区二区三区成人| 亚洲成a天堂v人片| 毛片一区二区三区| 国产成人在线电影| 97精品久久久午夜一区二区三区| 欧美性大战久久久久久久| 91精品国产福利在线观看| 欧美电影免费观看高清完整版在线| xfplay精品久久| 国产精品久久久久四虎| 亚洲午夜免费福利视频| 久久99精品久久久久婷婷| 国产成人在线看| 欧美三级韩国三级日本一级| 日韩免费高清av| 国产精品灌醉下药二区| 偷拍日韩校园综合在线| 国产精品自拍在线| 欧美性大战久久| 久久综合色天天久久综合图片| 国产精品少妇自拍| 丝袜诱惑制服诱惑色一区在线观看 | 亚洲欧美在线高清| 秋霞电影一区二区| av电影在线观看完整版一区二区| 欧美特级限制片免费在线观看| 精品国产一区二区三区久久影院 | 粉嫩13p一区二区三区| 色诱亚洲精品久久久久久| 6080国产精品一区二区| 国产精品动漫网站| 奇米色一区二区三区四区| av中文字幕不卡| 欧美一二三区精品| 亚洲精品写真福利| 国产**成人网毛片九色| 91精品国产入口| 亚洲精品免费电影| 粉嫩av亚洲一区二区图片| 91精品国产品国语在线不卡| 亚洲天堂成人在线观看| 欧美日韩午夜影院| 国产精品日日摸夜夜摸av| 日本网站在线观看一区二区三区 | 4438x亚洲最大成人网| 久久九九99视频| 日本亚洲天堂网| 91免费版pro下载短视频| 欧美一级夜夜爽| 国产精品素人一区二区| 天天色综合天天| 99久久精品国产毛片| 国产清纯白嫩初高生在线观看91| 亚洲午夜一区二区三区| 福利一区二区在线观看| 7777女厕盗摄久久久| 综合网在线视频| 久久精品国产亚洲高清剧情介绍 | 56国语精品自产拍在线观看| 亚洲视频每日更新| 精品一区二区在线看| 色8久久精品久久久久久蜜| 亚洲精品在线观| 婷婷六月综合网| 99久久国产免费看| xnxx国产精品| 亚洲一区二区3| 色综合中文字幕国产 | 国产福利精品导航| 欧美人xxxx| 一区二区三区日韩在线观看| 国产精品白丝av| 欧美一区二区福利视频| 婷婷久久综合九色综合绿巨人| 91欧美激情一区二区三区成人| 久久综合久久99| 日韩激情视频网站| 欧美性大战久久| 亚洲精品国产无套在线观| 成人午夜伦理影院| 久久夜色精品国产噜噜av | 欧美在线free| 亚洲欧美一区二区不卡| 国产精品18久久久久| 日韩午夜电影在线观看| 亚洲成人av福利| 欧美天堂一区二区三区| 亚洲自拍偷拍av| 91视频观看免费| 自拍视频在线观看一区二区| 国产精品资源网站| 中文av一区特黄| 成人综合在线观看| 国产精品久久久久久久浪潮网站| 国产成人一区二区精品非洲| 欧美成人福利视频| 精品一区二区三区在线播放| 欧美日韩黄视频| 麻豆国产91在线播放| 日韩一本二本av| 精品一区二区三区在线观看国产| 日韩欧美精品在线视频| 激情成人午夜视频| 久久综合丝袜日本网| 久久精品国产99国产精品| 久久综合成人精品亚洲另类欧美| 国内精品写真在线观看| 久久综合国产精品| 国产传媒久久文化传媒| 国产欧美va欧美不卡在线| 国产69精品久久99不卡| 日韩精品一区二区三区在线| 国产成人免费视频网站高清观看视频| 久久久www成人免费毛片麻豆| 国产在线精品视频| 中文字幕av一区二区三区免费看| 国产成+人+日韩+欧美+亚洲| 国产精品久久久爽爽爽麻豆色哟哟| 99久久久国产精品免费蜜臀| 中文字幕制服丝袜成人av| 欧美精品一级二级| 另类调教123区| 国产婷婷一区二区| 色综合久久中文字幕| 亚洲妇女屁股眼交7| 欧美大黄免费观看| youjizz国产精品| 偷拍亚洲欧洲综合| 亚洲精品在线一区二区| 99精品久久免费看蜜臀剧情介绍| 一区二区三区欧美日| 欧美军同video69gay| 麻豆91在线观看| 一区二区三区在线播| 日韩网站在线看片你懂的| 国产夫妻精品视频| 亚洲精品中文字幕在线观看| 欧美亚洲免费在线一区| 美女免费视频一区二区| 久久九九全国免费| 91啦中文在线观看| 日本伊人色综合网| 中文字幕中文字幕在线一区 | 亚洲福利视频一区| 久久久亚洲精华液精华液精华液| 91小视频在线| 国产一区二区主播在线| 亚洲美女免费在线| 精品久久久久久久人人人人传媒| 成人高清免费在线播放| 午夜精品福利在线| 国产精品理论片在线观看| 欧美一级夜夜爽| 色综合天天综合色综合av| 美脚の诱脚舐め脚责91| 亚洲免费在线播放| 久久色视频免费观看| 色综合网站在线| 成人一区二区三区在线观看| 同产精品九九九| 亚洲男人的天堂一区二区| 2023国产精华国产精品| 欧美主播一区二区三区| 成人的网站免费观看| 麻豆精品蜜桃视频网站| 亚洲一区二区欧美日韩| 国产欧美精品国产国产专区| 91精品国产综合久久婷婷香蕉| av一本久道久久综合久久鬼色| 蜜桃视频在线观看一区| 一区二区三区不卡在线观看 | 久久精品国产秦先生| 夜夜夜精品看看| 中文字幕一区二区三| 久久色视频免费观看| 717成人午夜免费福利电影| 91麻豆swag|