[试题]

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

}

参考答案与解析:

相关试题

下面是一个面向连接的SOCKET实例,填入(n)处。 (说明) 代码实例中的服务

[试题]下面是一个面向连接的SOCKET实例,填入(n)处。(说明)代码实例中的服务器通过socket连接向客户端发送字符串"Hello,you are connected!"。只要在服务器上运行该服务器软件,在客户端运行客户软件,客户端就会收到该字符串。客户端程序代码如下:include<stdio.h>include<stdlib.h>include<errno.h>include<string.h>include<netdb.h>include<sys/types.h>include<netin

  • 查看答案
  • 在下列程序的横线处填入正确的语句,实现RandomAccessFile类使用。p

    [单选题]在下列程序的横线处填入正确的语句,实现RandomAccessFile类使用。 package ch1; import java. io. *; public class ex27 { public static void main(String args[] ) { try { RandomAccessFile in = new in.close ( ); } catch (Exception e) { e.printStackTrace (); } } }A.RandomAccessFile

  • 查看答案
  • 下面的代码实现一个简单的Applet:import java.applet.Ap

    [单选题]下面的代码实现一个简单的Applet: import java.applet.Applet; import java.awt.*; public class Sample extends Applet { private String text="Hello World"; public void init() { add(new Label(text)); } public Sample(String string) { text=string; } } 通过下面的HTML文件访问: <h

  • 查看答案
  • 下列是定义一个接口ITF的程序,在横线处应填入的选项是()。 public in

    [单选题]下列是定义一个接口ITF的程序,在横线处应填入的选项是( )。 public interface ITF { public static final double PI=3.14; public ______ double area(double a,double b); }A.interfaceB.staticC.finalD.abstract

  • 查看答案
  • 下面程序的功能是将一个整数数组写入二进制文件。在下画线处应填入的选项是impor

    [单选题]下面程序的功能是将一个整数数组写入二进制文件。在下画线处应填入的选项是 import java.io.*; public class XieShuzu { public static void main(String[] a) { int[]myArray={10,20,30,40}; try { DataoutputStream dos=new DataOutputStream(new FileoutputStream("ints.dat")); for(int i=0;i<myArray

  • 查看答案
  • 阅读以下说明和Java程序,将应填入(n)处的字句写在对应栏内。 [说明] 下面

    [试题]阅读以下说明和Java程序,将应填入(n)处的字句写在对应栏内。[说明]下面程序是为汽车市场编制的一个程序的一部分。其中automobile是基类。[Java程序]class MainJava{public static void main(String agr[]){car sedan=new car();sedan.initialize(24,20.0,4);System.out.println ("The sedan can travel"+ (1) +"miles./n");Sys

  • 查看答案
  • 下面是一个递归Java程序,其功能为()long Factorial(int n

    [单选题]下面是一个递归Java程序,其功能为 ( ) long Factorial(int n){ if(1==n){ return 1; } else return n * Factorial (n-1); }A.求1-n的和B.求2到n的和C.求n的阶乘D.求2-n的积

  • 查看答案
  • 试题四 阅读下列程序说明,将在空缺处填入正确的内容。 (程序说明) 定义一个多

    [试题]试题四阅读下列程序说明,将在空缺处填入正确的内容。(程序说明)定义一个多边形结构:struct polygon实现以下内容: (1) 建立该结构的链表:create函数是创建链表,每输入一个结点的数据,就把该结点加入到链表当中,它返回创建的链表的头指针。 (2) 显示链表的各个结点数据:结点数据包括:多边形顶点数、各顶点的纵横坐标、当多边形顶点数为0时,链表创建结束。 (3) 编写一个函数disp,删除链表中的所有结点。需要注意的是:要先释放结点数据内存,再删除结点,如果在释放结点数据内存单元之前

  • 查看答案
  • 下列是定义一个接口ITF的程序,在横线处应填入的选项是()public inte

    [单选题]下列是定义一个接口ITF的程序,在横线处应填入的选项是 ( ) public interface ITF { public static final double PI=3.14; public( )double area(double a,double b); }A.interfaceB.staticC.finalD.abstract

  • 查看答案
  • 下列是定义一个接口ITF的程序,在横线处应填入的选项是()。publid int

    [单选题]下列是定义一个接口ITF的程序,在横线处应填入的选项是( )。 publid interface ITF { public static final double PI=3.14; public______double area(double a,double B) ; }A.interfaceB.staticC.finalD.abstract

  • 查看答案
  • 下面是一个简单的使用RAWSOCKET实现的ping程序,填入(n)处。 £¯*