📄 udp.c
字号:
//----------------------------------udp.c--------------------------------------
//#define DEBUG
#include<string.h>
#include"includes.h"
uint xdata sender_udpport;
ulong xdata sender_ipaddr;
void udp_echo_service(uchar xdata * inbuf, uint len)
{
udp_send(outbuf,inbuf+42,sender_ipaddr, ECHO_PORT, len);
}
/*****************************************
UDP包发送
outbuf 发送缓冲区首地址
udpdata UDP数据首地址
ipaddr 目的IP地址
port 源端口
len UDP数据包长度不包括首部
*****************************************/
void udp_send(uchar xdata * outbuf,uchar xdata * udpdata,ulong dest_ipaddr, uint port, uint len)
{
ulong idata sum;
uint idata result;
Udp_Header xdata * udp;
Ip_Header xdata * ip;
udp = (Udp_Header xdata *)(outbuf + 34); //eth(14)+ip(20)
ip = (Ip_Header xdata *)(outbuf + 14); //eth(14)
udp->dest_port = sender_udpport;
udp->source_port = port;
udp->len = 8 + len;
udp->checksum = 0;
memcpy(&udp->msg_data, udpdata, len);
ip->dest_ipaddr = dest_ipaddr;
ip->source_ipaddr = myipaddr;
/*伪首部源地址和目标地址*/
sum = (ulong)cksum(outbuf + 26, 8 + udp->len);
/*伪首部协议,UDP总长度*/
sum += (ulong)0x0011;
sum += (ulong)udp->len;
result = (uint)(sum + (sum >> 16));
udp->checksum = ~result;
ip_send(outbuf, dest_ipaddr, UDP_TYPE, udp->len);
}
/*****************************************
UDP包处理
len: UDP数据包长度包括8BYTE首部
*****************************************/
void udp_receive(uchar xdata * inbuf, uint len)
{
ulong idata sum;
uint idata result;
Ip_Header xdata * ip;
Udp_Header xdata * udp;
udp = (Udp_Header xdata *)(inbuf + 34);
ip = (Ip_Header xdata *)(inbuf + 14);
if (len < udp->len)
return;
if (udp->checksum == 0) { }//对方没作校验
else
{
sum = (ulong)cksum(inbuf + 26, 8 + udp->len);
sum += (ulong)0x0011;
sum += (ulong)udp->len;
result = (uint)(sum + (sum >> 16));
if (result != 0xFFFF)
return;
}
sender_udpport = udp->source_port;
sender_ipaddr = ip->source_ipaddr;
switch (udp->dest_port)
{
case ECHO_PORT:
case CUSTOM_PORT: //如是测试自定义端口,则返回收到的数据
TRACE("RECV > ECHO_PORT",NULL,0,0);
udp_echo_service(inbuf, udp->len - 8);
break;
default:
TRACE("udp->dest_port = ",CP &udp->dest_port,2,0);
dest_unreach_send(outbuf,inbuf, ip->source_ipaddr); //发送icmp差错报文,端口不可达
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -