下面是一个简单的使用RAWSOCKET实现的ping程序,填入(n)处。 /*simple ping program*/ struct sock

12 查阅

下面是一个简单的使用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);

}

参考答案:

(1)argc !=2 //判断参数个数是否为2;(2)SOCK_RAW //指定套接字类型为SOCK_RAW;(3)AF_INET //指定通信发生的区域是网际网区域;(4)Rawsock //指定套接字;(5)rawsock //关闭套接字。(1)argc !=2 //判断参数个数是否为2;(2)SOCK_RAW //指定套接字类型为SOCK_RAW;(3)AF_INET //指定通信发生的区域是网际网区域;(4)Rawsock //指定套接字;(5)rawsock //关闭套接字。

软考初级