51單片機簡單Ping的實現
PingEcho(*輸入包緩沖區首址pBUF) //收到應答后回顯
{
//打印ping響應,因為51定時器較慢,time參數省略(time是本機與對方主機往返一次所用時間)。
PrintStr("tReply from IP=");
PrintStr(輸入包之源IP地址);
PrintStr(": bytes=32");
PrintStr(" TTL=");
PrintByte(輸入包之TTL);
PrintStr("");
//處理PingBuf的記錄
for(i=0;iMaxLenPingBuf;i++){
if(PingBuf[i].status==1){
if(PingBuf[i].ip==pBUF.ipframe.ip){
PingBuf[i].status=2; //已發出且應答
break;
}
}
}
}
PingCycle() //定時操作,放在1秒循環任務中
{
for(;;){
taskDelay(1秒);
for(i=0;iMaxLenPingBuf;i++){
switch(PingBuf[i].status)
case 0: //空閑
break;
{
case 1: //已發出但無應答
//打印超時信息
PrintStr("tRequest timed out.(");
PrintStr(PingBuf[i].ip);
PrintStr(")");
case 2: //已發出且應答
//狀態變遷
PingBuf[i].times=PingBuf[i].times-1;
if(PingBuf[i].times==0)
PingBuf[i].status=0;
else{
case 4: //第一次準備發(用于同步1秒時鐘)
//查ARP緩存
if(ARP緩存有對應項){
//直接發送ICMP包至TxQFIFO緩存
OSQSend(QID,*pBUF);
PingBuf[i].status=1; //已發出但無應答
}
else PingBuf[i].status=3; //等ARP
}
break;
}
case 3: //等ARP
{
//查ARP緩存
if(ARP緩存有對應項){
//直接發送ICMP包至TxQFIFO緩存
OSQSend(QID,*pBUF);
}
PingBuf[i].status=1; //已發出但無應答
}
default: //其他狀態,錯誤
PingBuf[i].status=0;
}
}
}
void PingCommand(WORDTABLE *WordTable)//PING命令處理
{
if(WordTable->Num==1)
PrintStr("Please input IP address!");
else{
if(IPadrToHEX(WordTable->wt[1].Str,ping_ip_address)==0){
PrintStr("IP address error!");return;
}
else
PingRequest(ping_ip_address);
}
}
INT16U CheckSum(INT16U *buf,INT16U length) //校驗和計算
{
INT16U len;
INT32U sum;
len=length>>1;
for(sum=0;len>0;len--)
sum+=*buf++;
if(length1)
sum+=(*buf0xFF00);
sum=(sum>>16)+(sum0xFFFF);
sum+=(sum>>16);
return(~sum);
}
union ip_address_type{ //ip地址數據結構
unsigned long dwords;
unsigned int words[2];
unsigned char bytes[4];
};
bit IPadrToHEX(unsigned char *Str,union ip_address_type *ip) //IP字符串轉換到IP地址值
{
unsigned char i,j,ch,x;
ch=*Str++;
for(j=0;j3;j++){
x=0;
for(i=0;i4;i++){
if(ch=='.') {ch=*Str++;break;}
else if(i==3) return 0;
else if(ch0ch>9) return 0;
else
x=10*x+(ch-'0');
ch=*Str++;
}
ip->bytes[j]=x;
}
x=0;
for(i=0;i4;i++){
if(ch=='
主站蜘蛛池模板:
张家口市|
竹山县|
南雄市|
沁源县|
永川市|
北辰区|
手机|
乐亭县|
申扎县|
普兰县|
台州市|
北辰区|
湘乡市|
饶河县|
日土县|
砀山县|
梁河县|
准格尔旗|
富顺县|
菏泽市|
上林县|
乐东|
寿阳县|
启东市|
璧山县|
延长县|
抚远县|
安达市|
永修县|
东阿县|
岳阳县|
福州市|
南漳县|
全椒县|
孝感市|
平陆县|
大厂|
灵宝市|
建阳市|
临潭县|
陕西省|