资源简介
LINUX操作系统下的PING命令完整实现,带有路由追踪的功能和CTRL+C终止的功能。
代码片段和文件信息
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define PACKET_SIZE 4096
#define MAX_WAIT_TIME 5
char sendpacket[PACKET_SIZE];
char recvpacket[PACKET_SIZE];
double max_time=0min_time=10000sum_time=0;
int show_pro=1iobyname=0;
struct timeval start_timeend_time;
int sockfddatalen=56;
int send_count=4send_interval=1nTTL=-1route_count=-1route_TTL=1;
int nsend=0nreceived=0npack=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);
int send_packet(void);
int recv_packet(void);
int unpack(char* buf int len);
void tv_sub(struct timeval *out struct timeval *in);
void cal_time(double rtt);
void commandhelp();
void send_recv();
void statistics(int signo)
{
printf(“\n-------------------PING statistics----------------\n“);
printf(“%d packets transmitted %d received %.1f%% lost\n “
nsendnreceived((float)nsend-(float)nreceived)/(float)nsend*100);
if( (max_time!=0) && (sum_time!=0) )
printf(“rtt min/avg/max = %.3f %.3f %.3f \n“
min_timesum_time/nreceivedmax_time);
close(sockfd);
exit(0);
}
/*校验和算法*/
unsigned short cal_chksum(unsigned short *addrint len)
{
int nleft=len;
int sum=0;
unsigned short *w=addr;
unsigned short answer=0;
while(nleft>1)/*把ICMP报头二进制数据以2字节为单位加起来*/
{
sum+=*w++;
nleft-=2;
}
if( nleft==1 )
{
*(unsigned char *)(&answer) = *(unsigned char *)w;
sum+=answer;
}
sum=(sum>>16)+(sum&0xffff);
sum+=(sum>>16);
answer=~sum;
return answer;
}
/*设置ICMP报头*/
int pack(int pack_no)
{
int ipacksize;
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(tvalNULL);/*记录发送时间*/
icmp->icmp_cksum=cal_chksum((unsigned short *)icmppacksize);/*校验算法*/
return packsize;
}
int send_packet()
{
int packetsize;
npack++;
packetsize=pack(npack);/*设置ICMP报头*/
if( sendto( sockfd sendpacket packetsize 0
(struct sockaddr *)&dest_addrsizeof(dest_addr)) <0 )
{
perror(“sendto error“);
return -1;
}
return 0;
}
/*接受报文*/
int recv_packet()
{
int nfromlen;
extern int errno;
signal(SIGALRMstatistics);
signal(SIGINTstatistics);
fromlen=sizeof(from);
alarm(MAX_WAIT_TIME);
if( ( n=recvfrom(sockfdrecvpacketsizeof(recvpacket)0
(struct sockaddr*)&from&fromlen))<0 )
{
if( errno==EINTR )
perror(“recvfrom error“);
return -1;
}
gettimeofday(&tvrecvNULL);/*记录接收时间*/
if(unpack(recvpacketn)==0)
return 0;
return -1;
}
/*剥去ICMP报头*/
int unpack(char *bufint len)
{
int iiphdrlen;
struct ip *ip;
struct
- 上一篇:单片机最小系统原理图
- 下一篇:使用mp4v2将H264+AAC合成mp4
相关资源
- uboot到linux logo显示不间断 补丁
- UNIX/LINUX编程实践教程的源码
- Linux任务管理器
- linux应用层的华容道游戏源代码
- delphi 通过Ping命令检测网络是否正常
- ubuntu9.10 可加载内核模块和字符设备驱
- MP3文件ID3v2ID3v2APEv2标签读取
- 操作系统实验——虚存管理实验
- linux下的发包工具sendip
- 尚观培训linux许巍关于c 的笔记和讲义
- 尚观培训linux董亮老师关于数据结构的
- linux 线程池源码 c 版
- linux C 电梯程序练习
- linux下用多进程同步方法解决生产者
- Linux 操作系统实验(全)
- Linux From Scratch 中文手册
- linux 网络实验 ftp程序
- Linux命令大全离线版&在线版
- 操作系统共享内存实验
- dos 下运行Linux 命令--gnu_utils
- linux 0.12内核源代码
- linux简易shell C实现
- linux实验报告及心得体会
- 基于GTK的Linux环境下的简易任务管理器
- linux扫雷游戏代码
- CAN Linux驱动代码
- Linux系统教材
- window ping命令加时间并记录日志
- intel 82579LM 网卡驱动Linux系统版 v1.9.
- SA1110处理器掌上电脑液晶显示器设计
评论
共有 条评论