资源简介
课程设计内容
本实验为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
相关资源
- STM32F407按键和LCD多级菜单显示.zip
- 模拟网络编码ANC的中断性能分析2011
- 编译原理中VC实现语法分析器
- 清华大学机械工程系7个ANSYS有限元分
- 北航数值分析大作业一二三题完整版
- vc 代碼 mallat 算法
- memcached1.4.5源代码
- Chilkat9.5.0.73注册机
- CDMA干扰分析比较详细了
-
fr
amework4.5(4.0) mscoree.dll - ArcEngine重分类
- 计算机组织与结构:性能设计 willia
- 计算机组织与结构:性能设计 willia
- 计算机组织与结构:性能设计 willia
- 计算机组织与结构:性能设计 willia
- 2019年全国网络空间安全赛卷及评分标
- 社会网络分析软件UCINET注册机
- 开关电源PFC详细解读
- Xilinx pcie中文快速指南
- ucinet 6.X 破解 注册码 绝对好用
- 词法分析实验源程序c版
- webwatch官方版
- 使用socket实现的五子棋游戏
- 基于opencv的blob分析代码
- 单片机PIC16F887模拟电话设计程序含P
- 5种测量DSP程序运行时间的方法的详细
- 俄罗斯方块vc2008源码
- 音频信号分析仪(快速傅里叶变换)
- ArcGIS 3D Analyst 扩展模块
- UC大图预览插件 最新版
评论
共有 条评论