資源簡介
ICMP[version 4]的echo報文運用,模擬ping命令實現pingy命令

代碼片段和文件信息
#include?
#include?
#include?
#include?
#include?“ping.h“
#define?ICMP_ECHOREPLY?0
#define?ICMP_ECHOREQ?8
//?statistics
int?nsend?=?0?nrecv?=?0;
int?rrt[10];
int?packsize;
void?get_data(int?rrt[]?int?size?int?*min?int?*max?int?*avg);
void?tv_sub(struct?timeval?*outstruct?timeval?*in);
//?calculate?checksum?of?icmp?header
uint16_t?cal_cksum(uint16_t?*addr?int?len)
{
int?nleft?=?len;
uint32_t?sum?=?0;
uint16_t?*w?=?addr;
uint16_t?answer?=?0;
while?(nleft?>?1)?{
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);
}
void?print_head(char?*ip)
{
packsize?=?sizeof(struct?icmp)?+?sizeof(struct?timeval);
printf(“Ping?%s?with?%d?bytes?of?data:\n“?ip?packsize);
}
void?print_stat(char?*ip)
{
int?min_rrt?max_rrt?avg_rrt;
int?lost;
if(nsend?1)
return;
get_data(rrt?nsend?&min_rrt?&max_rrt?&avg_rrt);
lost?=?nsend?-?nrecv;
printf(“========================================================================\n“);
printf(“Ping?Statistics?for?%s:\n“?ip);
printf(“\tPackets:?Send?=?%d?Received?=?%d?Lost?=?%d(%.1f%%?lost)\n“?nsend?nrecv?lost?(lost?/?(nsend?*?1.0)?*?100.0));
printf(“Approximate?round?trip?times?in?milli-seconds:\n“);
printf(“\tMinimum?=?%dms?Maximum?=?%dms?Average?=?%dms\n“?min_rrt?max_rrt?avg_rrt);
}
void?send_ping(int?sockfd?struct?sockaddr_in?*dstaddr)
{
char?buf[100];
size_t?len?=?sizeof(struct?icmp);
socklen_t?dstlen?=?sizeof(struct?sockaddr_in);
struct?icmp?*echo;
memset(buf?0?sizeof(buf));
echo?=?(struct?icmp*)buf;
echo?=?(struct?icmp?*)buf;
echo->icmp_type?=?ICMP_ECHOREQ;
echo->icmp_code?=?0;
echo->icmp_cksum?=?0;
echo->icmp_id?=?getpid();
echo->icmp_seq?=?nsend;
struct?timeval?*tval=?(struct?timeval?*)echo->icmp_data;
gettimeofday(tvalNULL);
echo->icmp_cksum?=?cal_cksum((uint16_t?*)echo?packsize);
//?send?ping?message
if(sendto(sockfd?buf?len?0?(struct?sockaddr*)dstaddr?dstlen)?==?-1)
printf(“Send?Ping?Message?Error!\n“);
nsend++;
}
void?recv_ping(int?sockfd?struct?sockaddr_in?*dstaddr)
{
char?buf[100];
ssize_t?n;
struct?ip?*ip;
struct?icmp?*icmp;
socklen_t?dstlen?=?sizeof(struct?sockaddr_in);
int?ttl;
fd_set?rset;
int?maxfd?=?sockfd?+?1;
struct?timeval?timeo?*tvsend?tvrecv;
unsigned?char?*p;
unsigned?char?ipaddr[100];
int?time;
memset(buf?0?sizeof(buf));
timeo.tv_sec?=?3;
timeo.tv_usec?=?0;
FD_ZERO(&rset);
FD_SET(sockfd?&rset);
gettimeofday(&tvrecv?NULL);
while(1)
{
//?set?timeout?3s
if((n?=?select(maxfd?&rset?NULL?NULL?&timeo))?==?-1)
{
printf(“Select?Error!\n“);
exit(1);
}
if(n?<=?0)
{
printf(“Request?Time?Out!\n“);
fflush(stdout);
break;
}
if((n?=?recvf
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件????????184??2010-03-10?11:20??PingY\makefile
?????文件???????5182??2010-03-10?11:04??PingY\ping.c
?????文件???????1348??2010-03-09?11:13??PingY\ping.h
?????文件???????2148??2010-03-10?11:21??PingY\PingPro.c
?????目錄??????????0??2010-03-29?20:34??PingY
-----------?---------??----------?-----??----
?????????????????8862????????????????????5
評論
共有 條評論