www.pudn.com > TcpIpOn8051.rar > PING.C


/*------------------------------------------------------------------------------ 
main.C 
 
Copyright 1995-1999 Keil Software, Inc. 
------------------------------------------------------------------------------*/ 
#include "public.h" 
#include "ether.h" 
#include "arp.h" 
#include "ip.h" 
//#include "arpmain.h" 
#include  
//xin 
#define count 4		//icmp发送请求次数 
#define arp_time 30 
#define icmp_time 50 
static WORD III; 
typedef struct{ 
  DWORD time1; 
  DWORD time2; 
  BYTE time; 
}icmp_entry; 
//xin end 
icmp_entry xdata icmp_table[count];//icmp表 
 
extern mycomp xdata mypara; 
extern arp_entry xdata arp_gate;      	//默认网关 
extern arp_entry xdata arp_table[10]; 		//arp表 
 
extern netcard xdata netrev0; 
extern netcard xdata netrev1; 
extern netcard xdata netsen0; 
extern netcard xdata netsen1; 
 
extern void write_para(void); 
extern get_current(); 
extern delay_ms(BYTE sec); 
extern initcpu(); 
 
extern BYTE deal_packet(netcard *rxdnet); 
extern void arp_request(ip *destip); 
extern void arp_init(); 
extern void arp_update(ip *ipaddr,WORD *macaddr); 
extern bit arp_deal_pack(netcard *netbuf,BYTE len); 
extern BYTE arp_lookup(ip *ipaddr); 
extern void icmp_send(netcard *netbuf,ip destip,BYTE type,BYTE icode,WORD ident,WORD seq,WORD len); 
extern BYTE ip_deal_pack(netcard *netbuf,WORD len); 
extern bit icmp_deal_pack(netcard *netbuf,WORD len); 
extern bit is_local(ip p); 
 
void init_icmp(void)//初始化icmp表 
{ 
	BYTE i; 
  	for(i=0;iarp_time) 
        arp_timeout=0xff;   
      }         
    } 
 
    if(arped)//如果arp已经得到响应则发送icmp请求,等待应答 
    { 
      //发送icmp请求两次 
      icmp_send(&netbuf,destip,8,0x00,0x0200,III,40); 
      icmp_send(&netbuf,destip,8,0x00,0x0200,III,40); 
	  III++; 
      //等待接收icmp应答 
      while(!icmped && !icmp_timeout) 
      { 
        if(deal_packet(&netbuf)==2)//如果接收到ip包 
        {  
          //if(ip_deal_pack(&netbuf,0xff)==1)//如果接收到的是icmp包 
          //{ 
            if(icmp_deal_pack(&netbuf,0xff)==1)//ping应答包 
            { 
              ip_head=(ipheader *)&netbuf.etherframe.packet; 
              if(ip_head->srcip==destip) 
                icmped=0xff; 
            }              
          //}               
        } 
        end_time=get_current(); 
        timer=end_time-icmp_table[i].time1; 
 
        if(timer>icmp_time) 
        icmp_timeout=0xff; 
      } 
    } 
//如果收到了icmp应答,修改icmp表 
    if(icmped) 
    { 
      icmp_table[i].time2=end_time; 
      icmp_table[i].time=(BYTE)(icmp_table[i].time2-icmp_table[i].time1); 
    } 
  } 
//程序结束 
} 
 
void main() 
{ 
//BYTE index; 
//register BYTE i; 
 
//ip xdata deip; 
//ip xdata deip1; 
//ip xdata deip2; 
//ip xdata deip3; 
//ip xdata deip4; 
ip xdata destip; 
netcard xdata netbuf1; 
 
/* 
WORD xdata mac[3]={0x4477,0x5588,0x4477}; 
WORD xdata mac1[3]={0x4567,0x5658,0x4487}; 
WORD xdata mac2[3]={0x4887,0x5448,0x4337}; 
WORD xdata mac3[3]={0x4477,0x5556,0x4477}; 
WORD xdata mac4[3]={0x4457,0x5668,0x4327}; 
WORD xdata mac5[3]; 
deip.dwordip=0x11223344; 
deip1.dwordip=0x11558877; 
deip2.dwordip=0x66998877; 
deip3.dwordip=0x11223344; 
deip4.dwordip=0x55882255; 
*/ 
 
initcpu(); 
 
//mypara.myip=0xca7613ad; 
//mypara.mymask=0xffffff00; 
//mypara.mygate=0xca7613fe; 
//mypara.port=0x80; 
//mypara.myagent=0xca760122; 
//mypara.myagentport=0x8800; 
//deip.dwordip=0xca7613ae; 
//write_para(); 
 
//arp_update(&deip,mac); 
//arp_update(&deip1,mac1); 
//arp_update(&deip2,mac2); 
//arp_update(&deip3,mac3); 
//arp_update(&deip4,mac4); 
//index=sizeof(arp_table[0].hw_addr); 
//index=arp_lookup(&deip); 
//for(i=0;i<3;i++){ 
//mac5[index]=arp_table[index].hw_addr[i]; 
//} 
/* 
arp_gate.ip_addr.dwordip=(WORD)0x9865; 
arp_gate.hw_addr[0]=0x85; 
arp_gate.hw_addr[1]=0x85; 
arp_gate.hw_addr[2]=0x85; 
*/ 
//init_icmp(); 
 
//arp_request(&destip);//向主机发送两次arp请求; 
//arp_request(&destip); 
//destip=0xca7613fe; 
//arp_request(&destip); 
//arp_request(&destip); 
 
destip=0xca760162; 
 
ping(destip); 
 
while(1) 
	{ 
	//delay_ms(10); 
	//arp_request(&destip); 
	//arp_request(&destip); 
 
	//	init_icmp(); 
		//ping(destip); 
        //arp_request(&deip); 
    //delay_ms(10); 
    deal_packet(&netbuf1); 
 
	if(arp_gate.arp_flag!=255) 
	{destip=0xca760162; 
 
	ping(destip); 
	} 
	else { 
	destip=0xca7613fe; 
	arp_request(&destip); 
	arp_request(&destip); 
	} 
/* 
destip=0xca7613ad; 
ping(destip); 
 
destip=0xca7613b1; 
ping(destip); 
 
destip=0xca7613b3; 
ping(destip); 
 
destip=0xca7613b5; 
ping(destip); 
 
destip=0xca7613aa; 
ping(destip);*/ 
	} 
} 
 
/*EOF*/