📄 icmp.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 + -