下面是一个简单的使用RAWSOCKET实现的ping程序,填入(n)处。/*simple ping program*/struct sockaddr_in saddr;int rawsock;unsigned short in_cksum(unsigned short*addr, int len){ int sum=0;unsigned short res=0;while(1en>1){sum+=*addr++; len-=2;}if(len=1){*((unsigned char *)(res))=*((unsigned char *)addr); sum+=res;}sum=(sum>>16)+(sam 0xffff);sum+=(sum>>16); res=~sum;return res;}void ping(int signo){int len;int i;static unsigned short seq=0;char buff[8192];struct timeval tv;struet icmp*icmph=(struct icmp * )buff;long*data=(long*)icmph→icmp_data;bzero(buff, 8192);gettimeofday(tv, NULL);icmph→icmp_type=ICMP_ECHO;icmph→icmp_code=0;icmph→icmp_cksum=0;icmph→icmp_id=0;icmph→icmp_seq=0;icmph→icmp_id=getpid()0xffff;icmph→icmp_seq=seq++;data[0]=tv.tv_sec;data[1]=tv.tv_usec;for(i=8; i< ; i++)icmph→icmp_data[i]=(unsigned char)i;icmph→icmp_cksum=in_cksum((unsigned short *)buff, ? 72);len; sendto(rawsock, buff, 72, 0, saddr, sizeof(saddr));alarm(1);}void sigint(int signo){ printf("CATCH SIGINT !!! \n");close(rawsock);exit(0);}void dumppkt(char*buf, int len){ struct ip*iph=(struct ip*)buf;int i=iph→ip_h1*4;struct icmp*icmph=(struct icmp*)buf[i];long*data=(long*)iemph→icmp_data;struct timeval tv;gettimeofday(tv, NULL);if(icmph→icmp_type! =ICMP_ECHOREPLY)return;if(icmph→icmp_id! =(getpid()0xffff))return;printf("From %s:ttl=% d seq=% d time=%.2f ms\n",inet_ntoa(iph→ip_src),iph→ip_ttl?,icmph→icmp_seq,(tv.tv_see-data[0])*1000.0+(tv.tv_usec-data[0])/1000.0);}int main(int argc, char*argv[]){ int len;stuct timeval now;char recvbuff[8192];if(1){printf("%s aaa.bbb.ccc.ddd\n", argv[0]);exit(1);}rawsock=soeket(AF_INET, (2), IPPROTO_ICMP);if(rawsock<0) {perror("soeket");exit(1);}bzero ( saddr, sizeof(saddr));saddr.sin_family=(3);if( inet_aton( argv[1], saddr.sin_addr) <0) {printf("invalid IP address: %s\n", argv[1]);exit(1);}signal(SICALRM, ping);signal(SICINT, sigint);alarm(1);while (1){len=read (4), recvbuff, 8192);if( len<0 errno=EINTR)continue;else it( len<0)perror("read");else if( len>0)dumppkt(recvbuff, len);}close (5);exit(0);}
下面是一个简单的使用RAWSOCKET实现的ping程序,填入(n)处。
/*simple ping program*/
struct sockaddr_in saddr;
int rawsock;
unsigned short in_cksum(unsigned short*addr, int len)
{ int sum=0;
unsigned short res=0;
while(1en>1){
sum+=*addr++; len-=2;
}
if(len=1){
*((unsigned char *)(&res))=*((unsigned char *)addr); sum+=res;
}
sum=(sum>>16)+(sam & 0xffff);
sum+=(sum>>16); res=~sum;
return res;
}
void ping(int signo)
{
int len;
int i;
static unsigned short seq=0;
char buff[8192];
struct timeval tv;
struet icmp*icmph=(struct icmp * )buff;
long*data=(long*)icmph→icmp_data;
bzero(buff, 8192);
gettimeofday(&tv, NULL);
icmph→icmp_type=ICMP_ECHO;
icmph→icmp_code=0;
icmph→icmp_cksum=0;
icmph→icmp_id=0;
icmph→icmp_seq=0;
icmph→icmp_id=getpid()&0xffff;
icmph→icmp_seq=seq++;
data[0]=tv.tv_sec;
data[1]=tv.tv_usec;
for(i=8; i< ; i++)
icmph→icmp_data[i]=(unsigned char)i;
icmph→icmp_cksum=in_cksum((unsigned short *)buff, ? 72);
len; sendto(rawsock, buff, 72, 0, &saddr, sizeof(saddr));
alarm(1);
}
void sigint(int signo)
{ printf("CATCH SIGINT !!! \n");
close(rawsock);
exit(0);
}
void dumppkt(char*buf, int len)
{ struct ip*iph=(struct ip*)buf;
int i=iph→ip_h1*4;
struct icmp*icmph=(struct icmp*)&buf[i];
long*data=(long*)iemph→icmp_data;
struct timeval tv;
gettimeofday(&tv, NULL);
if(icmph→icmp_type! =ICMP_ECHOREPLY)
return;
if(icmph→icmp_id! =(getpid()&0xffff))
return;
printf("From %s:ttl=% d seq=% d time=%.2f ms\n",
inet_ntoa(iph→ip_src),iph→ip_ttl?,
icmph→icmp_seq,
(tv.tv_see-data[0])*1000.0+(tv.tv_usec-data[0])/1000.0);
}
int main(int argc, char*argv[])
{ int len;
stuct timeval now;
char recvbuff[8192];
if(1){
printf("%s aaa.bbb.ccc.ddd\n", argv[0]);
exit(1);
}
rawsock=soeket(AF_INET, (2), IPPROTO_ICMP);
if(rawsock<0) {
perror("soeket");
exit(1);
}
bzero ( &saddr, sizeof(saddr));
saddr.sin_family=(3);
if( inet_aton( argv[1], &saddr.sin_addr) <0) {
printf("invalid IP address: %s\n", argv[1]);
exit(1);
}
signal(SICALRM, ping);
signal(SICINT, sigint);
alarm(1);
while (1){
len=read (4), recvbuff, 8192);
if( len<0 && errno=EINTR)
continue;
else it( len<0)
perror("read");
else if( len>0)
dumppkt(recvbuff, len);
}
close (5);
exit(0);
}