/* BSDI ping.c,v 2.3 1996/01/21 17:56:50 jch Exp */
/*
* Copyright (c) 1989, 1993
* The Regents of the University of California. All rights reserved.
*
* This code is derived from software contributed to Berkeley by
* Mike Muuss.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#ifndef lint
static char copyright[] =
"@(#) Copyright (c) 1989, 1993\n\
The Regents of the University of California. All rights reserved.\n";
#endif /* not lint */
#ifndef lint
static char sccsid[] = "@(#)ping.c 8.1 (Berkeley) 6/5/93";
#endif /* not lint */
/*
* Using the InterNet Control Message Protocol (ICMP) "ECHO" facility,
* measure round-trip-delays and packet loss across network paths.
*
* Author -
* Mike Muuss
* U. S. Army Ballistic Research Laboratory
* December, 1983
*
* Status -
* Public Domain. Distribution Unlimited.
* Bugs -
* More statistics could always be gathered.
* This program has to run SUID to ROOT to access the ICMP socket.
*/
#include <sys/param.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <netinet/in_systm.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <netinet/ip_icmp.h>
#include <netinet/ip_var.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <ctype.h>
#include <err.h>
#include <errno.h>
#include <fcntl.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define DEFDATALEN (64 - 8) /* default data length */
#define MAXIPLEN 60
#define MAXICMPLEN 76
#define MAXPACKET (65536 - 60 - 8)/* max packet size */
#define NROUTES 9 /* number of record route slots */
#define A(bit) rcvd_tbl[(bit)>>3] /* identify byte in array */
#define B(bit) (1 << ((bit) & 0x07)) /* identify bit in byte */
#define SET(bit) (A(bit) |= B(bit))
#define CLR(bit) (A(bit) &= (~B(bit)))
#define TST(bit) (A(bit) & B(bit))
#define F_FLOOD 0x0001
#define F_INTERVAL 0x0002
#define F_NUMERIC 0x0004
#define F_PINGFILLED 0x0008
#define F_QUIET 0x0010
#define F_RROUTE 0x0020
#define F_SO_DEBUG 0x0040
#define F_SO_DONTROUTE 0x0080
#define F_VERBOSE 0x0100
u_int options;
/*
* MAX_DUP_CHK is the number of bits in received table, i.e. the maximum
* number of received sequence numbers we can keep track of. Change 128
* to 8192 for complete accuracy...
*/
#define MAX_DUP_CHK (8 * 8192)
int mx_dup_ck = MAX_DUP_CHK;
char rcvd_tbl[MAX_DUP_CHK / 8];
struct sockaddr whereto; /* who to ping */
int datalen = DEFDATALEN;
int s; /* socket file descriptor */
u_char outpack[MAXPACKET];
char BSPACE = '\b'; /* characters written for flood */
char DOT = '.';
char *hostname;
int ident; /* process id to identify our packets */
/* counters */
long npackets; /* max packets to transmit */
long nreceived; /* # of packets we got back */
long nrepeats; /* number of duplicates */
long ntransmitted; /* sequence # for outbound packets = #sent */
int interval = 1; /* interval between packets */
/* timing */
int timing; /* flag to do timing */
double tmin = 999999999.0; /* minimum round trip time */
double tmax = 0.0; /* maximum round trip time */
double tsum = 0.0; /* sum of all times, for doing average */
void fill __P((char *, char *));
u_short in_cksum __P((u_short *, int));
void onalrm __P((int));
void oninfo __P((int));
void onint __P((int));
void pinger __P((void));
char *pr_addr __P((u_long));
void pr_icmph __P((struct icmp *));
void pr_iph __P((struct ip *));
void pr_pack __P((char *, int, struct sockaddr_in *));
void pr_retip __P((struct ip *));
void summary __P((void));
void tvsub __P((struct timeval *, struct timeval *));
void usage __P((void));
int
main(argc, argv)
int argc;
char *argv[];
{
extern int errno, optind;
extern char *optarg;
struct hostent *hp;
struct itimerval itimer;
struct protoent *proto;
struct sockaddr_in *to, from;
struct timeval timeout;
fd_set fdset;
register int cc, i;
int ch, fromlen, hold, packlen, preload;
u_char *datap, *packet;
char *e, *target, hnamebuf[MAXHOSTNAMELEN];
#ifdef IP_OPTIONS
char rspace[3 + 4 * NROUTES + 1]; /* record route space */
#endif
preload = 0;
datap = &outpack[8 + sizeof(struct timeval)];
while ((ch = getopt(argc, argv, "c:dfi:l:np:qRrs:v")) != -1)
switch(ch) {
case 'c':
npackets = strtol(optarg, &e, 10);
if (npackets <= 0 || *optarg == '\0' || *e != '\0')
errx(1,
"illegal number of packets -- %s", optarg);
break;
case 'd':
options |= F_SO_DEBUG;
break;
case 'f':
if (getuid()) {
errno = EPERM;
err(1, NULL);
}
options |= F_FLOOD;
setbuf(stdout, (char *)NULL);
break;
case 'i': /* wait between sending packets */
interval = strtol(optarg, &e, 10);
if (interval <= 0 || *optarg == '\0' || *e != '\0')
errx(1,
"illegal timing interval -- %s", optarg);
options |= F_INTERVAL;
break;
case 'l':
preload = strtol(optarg, &e, 10);
if (preload < 0 || *optarg == '\0' || *e != '\0')
errx(1, "illegal preload value -- %s", optarg);
break;
case 'n':
options |= F_NUMERIC;
break;
case 'p': /* fill buffer with user pattern */
options |= F_PINGFILLED;
fill((char *)datap, optarg);
break;
case 'q':
options |= F_QUIET;
break;
case 'R':
options |= F_RROUTE;
break;
case 'r':
options |= F_SO_DONTROUTE;
break;
case 's': /* size of packet to send */
datalen = strtol(optarg, &e, 10);
if (datalen <= 0 || *optarg == '\0' || *e != '\0')
errx(1, "illegal datalen value -- %s", optarg);
if (datalen > MAXPACKET)
errx(1,
"datalen value too large, maximum is %d",
MAXPACKET);
break;
case 'v':
options |= F_VERBOSE;
break;
default:
usage();
}
argc -= optind;
argv += optind;
if (argc != 1)
usage();
target = *argv;
memset(&whereto, 0, sizeof(struct sockaddr));
to = (struct sockaddr_in *)&whereto;
to->sin_family = AF_INET;
to->sin_addr.s_addr = inet_addr(target);
if (to->sin_addr.s_addr != (u_int)-1)
hostname = target;
else {
hp = gethostbyname(target);
if (!hp)
errx(1, "unknown host %s", target);
to->sin_family = hp->h_addrtype;
memmove(&to->sin_addr, hp->h_addr, hp->h_length);
(void)strncpy(hnamebuf, hp->h_name, sizeof(hnamebuf) - 1);
hostname = hnamebuf;
}
if (options & F_FLOOD && options & F_INTERVAL)
errx(1, "-f and -i incompatible options");
i
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
UNIX网络编程 卷1:联网API(第3版) 源码 (1582个子文件)
rtt.out.vangogh.1 45KB
rtt.out.vangogh.1 45KB
rtt.out.kumba.1 44KB
rtt.out.kumba.1 44KB
rtt.vals.vangogh.1 5KB
rtt.vals.vangogh.1 5KB
rtt.vals.kumba.1 5KB
rtt.vals.kumba.1 5KB
truss.unixware.2.1 5KB
truss.unixware.2.1 5KB
script.1 2KB
script.1 2KB
script.1 479B
script.1 479B
script.1 428B
script.1 428B
doit.1 417B
doit.1 417B
doit.1 415B
doit.1 415B
script.1 269B
script.1 269B
script.2 50KB
script.2 50KB
rtt.out.vangogh.2 46KB
rtt.out.vangogh.2 46KB
rtt.out.kumba.2 43KB
rtt.out.kumba.2 43KB
doit.2 557B
doit.2 557B
script.2 473B
script.2 473B
script.2 297B
script.2 297B
script.3 530B
script.3 530B
script.4 339B
script.4 339B
truss.solaris.2.6 380B
truss.solaris.2.6 380B
udpread.c.bad 2KB
udpread.c.bad 2KB
bsdping.c 25KB
bsdping.c 25KB
getaddrinfo.c 24KB
getaddrinfo.c 24KB
savecopy.c 15KB
savecopy.c 15KB
main.c 12KB
main.c 12KB
sockopts.c 10KB
sockopts.c 10KB
testga.c 8KB
testga.c 8KB
printsadbmsg.c 8KB
printsadbmsg.c 8KB
mcast_join.c 7KB
mcast_join.c 7KB
loopudp.c 6KB
loopudp.c 6KB
wrapsock.c 6KB
wrapsock.c 6KB
loop.c 6KB
loop.c 6KB
get_ifi_info.c 5KB
get_ifi_info.c 5KB
inet_pton.c 5KB
inet_pton.c 5KB
inet_ntop.c 5KB
inet_ntop.c 5KB
checkopts.c 5KB
checkopts.c 5KB
test1.c 5KB
test1.c 5KB
add.c 5KB
add.c 5KB
web02.c 5KB
web02.c 5KB
wrapunix.c 4KB
wrapunix.c 4KB
getaddrinfo.c 4KB
getaddrinfo.c 4KB
servopen.c 4KB
servopen.c 4KB
cliopen.c 4KB
cliopen.c 4KB
sourceroute.c 4KB
sourceroute.c 4KB
web03.c 4KB
web03.c 4KB
get_ifi_info.c 4KB
get_ifi_info.c 4KB
net_stream.c 3KB
net_stream.c 3KB
getnameinfo.c 3KB
getnameinfo.c 3KB
inet_aton.c 3KB
inet_aton.c 3KB
web01.c 3KB
web01.c 3KB
共 1582 条
- 1
- 2
- 3
- 4
- 5
- 6
- 16
资源评论
- yangkaiboo2012-07-12好书,很清晰,要好好看看
- workusual2013-12-17谢谢,经典书的源代码,学网络编程有用
- 近卫狙击2012-11-05好书,很清晰,源码很完整
- giswoduxing2012-10-11不错,是第3版的源代码
- cham19852012-07-07太好了,书上需要的所有头文件都有了,谢谢~~~
iJecky
- 粉丝: 754
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于UC3842+LTS26Q1565A设计PC机充电器 硬件(原理图+PCB)工程文件.zip
- Hive SQL经典面试题,大数据SQL经典面试题
- Qt实现喷码器代码,实现二维码、条形码、图形的旋转、移动等
- 基于LM324芯片比较器传感器模块AD09设计硬件(原理图+PCB)工程文件.zip
- HTTP请求 - 记一笔-添加记账.jmx
- 2205040245凡永超硬间隔svm.ipynb
- Qt喷码器demo,演示软件,不是代码
- 目标跟踪-基于目标中心点同时进行目标检测+目标跟踪算法实现-项目源码-优质项目实战.zip
- Python《文本特征分析-全唐诗数据挖掘及分析 》+源代码
- Netron-Setup-4.5.0
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功