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;i arp_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*/