• 大小: 5KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-07-22
  • 语言: 其他
  • 标签: c  ping  

资源简介

课程设计内容 本实验为ICMP实验。实验内容:Ping命令实现的扩充,在给定的Ping程序的基础上做如下功能扩充: ? -h 显示帮助信息 ? -b 允许ping一个广播地址,只用于IPv4 ? -t 设置ttl值,只用于IPv4 ? -q 安静模式。不显示每个收到的包的分析结果,只在结束时,显示汇总结果 程序分为两大部分:一部分读取收到的所有消息,并输出ICMP Echo replay消息,另一部分每个一秒钟发送一个Echo消息。另一部分由SIGALARM信号每秒驱动一次。

资源截图

代码片段和文件信息

#include “ping.h“            

struct proto proto_v4 = { proc_v4 send_v4 NULL NULL 0 IPPROTO_ICMP };

#ifdef IPV6
struct proto proto_v6 = { proc_v6 send_v6 NULL NULL 0 IPPROTO_ICMPV6 };
#endif

int datalen = 56; /* data that goes with ICMP echo request */
int pingnum=4;
int anjing=0;

int getpostcount=0;
double rttcount=0;
int broadcasting=0;
int setttl=0;
int ttlnum=64;
void printhelp(){
printf(“-h 显示帮助信息 \n“);
printf(“-t   设置ttl值,只用于IPv4\n“);
printf(“-q 安静模式。不显示每个收到的包的分析结果,只在结束时,显示汇总结果 \n“);

}
int main(int argc char **argv)
{
int c;
struct addrinfo *ai;

opterr = 0; /* don‘t want getopt() writing to stderr */
while ( (c = getopt(argc argv “vhqbn:t:s:“)) != -1) {
switch (c) {
case ‘v‘:
verbose++;
break;
case‘h‘:
printf(“\n“);
printhelp();
exit(0);
break;
case‘q‘:
anjing=1;
break;
case‘b‘:
broadcasting=1;
break;
case‘n‘:
pingnum=atoi(argv[optind-1]);
break;
case‘s‘:
datalen=atoi(argv[optind-1]);
if(datalen>1024||datalen<0)
printf(“数据包长度应大于0小于1024\n“);
break;
case‘t‘:
setttl=1;
ttlnum = atoi(argv[optind-1]); 
break;
case ‘?‘:
err_quit(“未知的命令 请输入-h来查看帮助\n“);
}
}

if (optind != argc-1)
err_quit(“usage: ping [ -v ] “);
host = argv[optind];

pid = getpid();
signal(SIGALRM sig_alrm);

ai = host_serv(host NULL 0 0);

printf(“ping %s (%s): %d data bytes\n“ ai->ai_canonname
   Sock_ntop_host(ai->ai_addr ai->ai_addrlen) datalen);

/* 4initialize according to protocol */
if (ai->ai_family == AF_INET) {
pr = &proto_v4;
#ifdef IPV6
} else if (ai->ai_family == AF_INET6) {
pr = &proto_v6;
if (IN6_IS_ADDR_V4MAPPED(&(((struct sockaddr_in6 *)
 ai->ai_addr)->sin6_addr)))
err_quit(“cannot ping IPv4-mapped IPv6 address“);
#endif
} else
err_quit(“unknown address family %d“ ai->ai_family);

pr->sasend = ai->ai_addr;
pr->sarecv = calloc(1 ai->ai_addrlen);
pr->salen = ai->ai_addrlen;

readloop();

exit(0);
}


void
proc_v4(char *ptr ssize_t len struct timeval *tvrecv)/*输出结果*/
{
int hlen1 icmplen;
double rtt;
struct ip *ip;
struct icmp *icmp;
struct timeval *tvsend;

ip = (struct ip *) ptr; /* start of IP header */
hlen1 = ip->ip_hl << 2; /* length of IP header */

icmp = (struct icmp *) (ptr + hlen1); /* start of ICMP header */
if ( (icmplen = len - hlen1) < 8)
err_quit(“icmplen (%d) < 8“ icmplen);

if (icmp->icmp_type == ICMP_ECHOREPLY) {
if (icmp->icmp_id != pid)
return; /* not a response to our ECHO_REQUEST */
if (icmplen < 16)
err_quit(“icmplen (%d) < 16“ icmplen);

tvsend = (struct timeval *) icmp->icmp_data;
tv_sub(tvrecv tvsend);
rtt = tvrecv->tv_sec * 1000.0 + tvrecv->tv_usec / 1000.0;

if(anjing!=1){
printf(“%d bytes from %s: seq=%u ttl=%d rtt=%.3f ms\n“
icmplen Sock_ntop_host(pr->sarecv pr->salen)
icmp->icmp_seq ip->ip_ttl rtt);
rttcount+=rtt;
getpostcount++;
}else{
rttcount+=rtt;
getpostcount++;
}

} else if (ver

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2011-09-25 16:25  my\
     文件       11840  2011-06-26 21:18  my\ping.c
     文件        2150  2009-11-04 16:43  my\ping.h

评论

共有 条评论