⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 icmp.c

📁 51单片机加rt8019硬件平台,上web方案及详细代码
💻 C
字号:
//-----------------------------------icmp.c-----------------------------
//#define DEBUG

#include<string.h>
#include"includes.h"

/*****************************************
PING回送
*****************************************/
void ping_send(uchar xdata * inbuf, ulong ipaddr, uint len)
{
	Ping_Header xdata * ping_in;
	Ping_Header xdata * ping_out;
            
	ping_in = (Ping_Header xdata *)(inbuf + 34);      
   
	ping_out = (Ping_Header xdata *)(outbuf + 34);

	ping_out->msg_type = 0;//表示应答
	ping_out->msg_code = 0;
	ping_out->checksum = 0;
	ping_out->identifier = ping_in->identifier;
	ping_out->sequence = ping_in->sequence;
   
	memcpy(&ping_out->echo_data, &ping_in->echo_data, len - 8);             

	ping_out->checksum = ~cksum(outbuf + 34, len);
   
	ip_send(outbuf, ipaddr, ICMP_TYPE, len);
	TRACE("T: PING_RESPONSE",NULL,0,0);
   
}

/*****************************************
ICMP差错报文--端口不可达
*****************************************/
void dest_unreach_send( uchar xdata * outbuf,uchar xdata * inbuf, ulong ipaddr)
{   
	Icmp_Err_Header xdata * icmp;    
      
	icmp = (Icmp_Err_Header xdata *)(outbuf + 34);    
	icmp->msg_type = 3;   //目的不可达
	icmp->msg_code = 3;   //端口不可达
	icmp->checksum = 0; 
	icmp->msg_data = 0;
           
	/*20个字节的IP首部+8个字节的UDP或TCP数据*/
   memcpy(&icmp->echo_data, inbuf + 14, 28);
                               
   /*校验和计算28字节的数据加8字节的ICMP首部*/
	icmp->checksum = ~cksum(outbuf + 34, 36);      
   TRACE("T: Icmp_Err",NULL,0,0);
	ip_send(outbuf, ipaddr, ICMP_TYPE, 36); 
}

/*****************************************
ICMP包接收
len:ICMP包数据长度 
*****************************************/
void icmp_receive(uchar xdata * inbuf, uint len)
{
	Ip_Header * ip;
	uchar idata msg_type;
	uint idata temp;	   
   
	ip = (Ip_Header *)(inbuf + 14); 
	temp = cksum(inbuf + 34, len);
	
	if (temp != 0xFFFF)	
		return;       

	msg_type = *(inbuf + 34);
	switch(msg_type)
	{
		case 3://终点不可达	
			TRACE("R: Dest unreachable",NULL,0,0);
			break;

		case 8: //回送请求
			TRACE("R: PING_REQUEST",NULL,0,0);	
			ping_send(inbuf, ip->source_ipaddr, len); 		  
			break;

		default:
			break;
   }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -