资源简介
课程设计内容
本实验为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
相关资源
- CE修改器风叶人加强版
- Oracle+11gR2+RAC安装详解(HP-UX+11.31+ia6
- Oracle+GoldenGate运维完全手册
- STM32F103RC+ADC+DMA多通道采样LCD显示
- Modbus协议官方文档中、英文全
- pcbtemp电流计算软件
- I2C读写AT24C02 基于STM32F103 cube116540
- Scratch源码
- Microsoft Forms 2.0107770
- 实验三 消息中间件应用开发:Active
- WCE注入工具
- ModelGoon-4.4.1-site.zip
- AsyncTask文件控制暂停和继续,在状态
- Visio大全模具(含Cisco、IBM等常用拓扑
- 信号奇异点Lipschitz指数计算
- 基于STM32RCT6的步进电机驱动程序
- 酒店管理系统基于Qt Creator5)
- 用友NC开发API字典
- Navicat Premium 15汉化包.zip55438
- 登录注册界面.zip48872
- 条码字体barcode128
- Rational Rose Common破解文件
- res10_300x300_ssd_iter_140000.caffemodel与dep
- scratch 第1课 翻跟斗的小猫(入门)
- stm32f407上的两个can发送和接收例程
- Scrach 欢乐狙击手.sb2
- 04741计算机网络原理知识点整理.docx(
- Wolfram Mathematica 矩阵初等变换函数(
- pscad近海风电模型 Fortran语言
- 程序员专用字体YaHei.Consolas.1.11b42517
评论
共有 条评论