icmp.c

来自「51单片机加rt8019硬件平台,上web方案及详细代码」· C语言 代码 · 共 87 行

C
87
字号
//-----------------------------------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 + =
减小字号Ctrl + -
显示快捷键?