📄 iptcp.bak
字号:
//#include <89c52.h>
#ifndef _IPTCP_H_
#define _IPTCP_H_
#define UDP_PROTO 0x11
#define TCP_PROTO 0x06
#define ICMP_PROTO 0x01
#define ARP_REQUEST 1
#define ARP_REPLY 2
#define SIZE_OF_UDP_HEADER 8
#define tcp_FlagFIN 0x0001
#define tcp_FlagSYN 0x0002
#define tcp_FlagRST 0x0004
#define tcp_FlagPUSH 0x0008
#define tcp_FlagACK 0x0010
#define tcp_FlagURG 0x0020
#define tcp_FlagDO 0xF000
#define tcp_GetDataOffset(tp) (tp.flags >> 12)
#define tcp_MaxBufSize 5120
/*一个5k大小的区间,请不要超过这个范围*/
#define udp_MaxLen 1400
typedef struct {
uchar eaddr[6];
} eth_address; /* MAC地址结构体 */
/* 以太包头 */
typedef struct {
eth_address destination;
eth_address source;
uint type;
} eth_Header;
/*icmp*/
typedef struct {
uchar type;
uchar pcode;
uint checksum;
} icmp_pkt;
/* IP包头 */
typedef struct {
uchar hd_ver;/*版本号和ip数据头长度*/
uchar tos; /*固定*/
uint length;/*ip的总共的数据长度*/
uint identification;/*固定*/
uint frags;/*固定*/
uchar ttl; /*生存周期,每过一个网关减去一,0的时候就死了*/
uchar proto;/*固定*/
uint checksum;/*校验和*/
ulong source; /*源ip*/
ulong destination;/*目标ip*/
} in_Header;
typedef struct{
uint u_src;/*源端口*/
uint u_dst;/*目标端口*/
uint u_len;/*udp头数据长度*/
uint u_cksum;/*校验和*/
// uchar u_data[1500];/*内部数据*/
}udp_Header;
typedef struct {
uint hwType;/*类型*/
uint protType;
uint hwProtAddrLen; // hw and prot addr len
uint opcode;
eth_address srcEthAddr; /*源物理地址*/
ulong srcIPAddr; /*源ip地址*/
eth_address dstEthAddr; /*目标物理地址*/
ulong dstIPAddr; /*目标ip地址*/
} arp_Header;
/* TCP包头 */
typedef struct {
uint srcPort;
uint dstPort;
ulong seqnum;
ulong acknum;
uint flags;
uint window;
uint checksum;
uint urgentPointer;
} tcp_Header;
/* 计算校验和用的伪包头 */
typedef struct {
ulong src;
ulong dst;
uchar mbz;
uchar protocol;
uint length;
uint checksum;
} tcp_PseudoHeader;
/* 定时器定义 */
/*
* TIME_WAIT 状态的延时值应该在0.5到4分钟之间(2MSL)
*/
#define TW_TO 200
#define tcp_RETRANSMITTIME 40 /* Retransmitter调用间隔 */
#define tcp_LONGTIMEOUT 120 /* TCP_OPEN超时值 */
#define tcp_TIMEOUT 80 /* 连接超时 */
/**单位都是10ms/
/*
* TCP状态定义
*/
#define tcp_StateLISTEN 0 /* 侦听状态 */
#define tcp_StateSYNSENT 1 /* 主动打开方式下SYN已发送 */
#define tcp_StateSYNREC 2 /* 已收到SYN, SYNACK+SYN已发送. */
#define tcp_StateESTAB 3 /* 连接已建立 */
#define tcp_StateESTCL 4 /* 连接已建立, 但是将要结束 */
#define tcp_StateFINWT1 5 /* 已发送 FIN */
#define tcp_StateFINWT2 6 /* 已发送 FIN, 已收到 FINACK */
#define tcp_StateCLOSWT 7 /* 已收到 FIN 等待关闭 */
#define tcp_StateCLOSING 8 /* 已发送 FIN, 已收到 FIN (等待 FINACK) */
#define tcp_StateLASTACK 9 /* 已收到 FIN, 已发送FINACK+FIN */
#define tcp_StateTIMEWT 10 /* 已发送最后的 FINACK 后的延时, 也就是TIMEWAIT*/
#define tcp_StateCLOSEMSL 11
#define tcp_StateCLOSED 12 /* 已收到 FINACK */
/*
* TCP Socket 结构定义
*/
typedef struct {
uint usertimer; /* 用户超时接口 */
uint timeout; /* 超时值 */
uint datatimer; /*数据定时器*/
ulong hisaddr; /* 通讯目标IP */
uint hisport; /* 通讯目标使用的端口 */
ulong myaddr;
uint myport;
int rdatalen; /* 接收的数据长度,必须有符号 */
uchar rddata[tcp_MaxBufSize+1]; /* 接收到的数据 */
uint state; /* 本连结当前状态 */
char safetysig; /* Socket有效性判断标志 */
char sending; /*交给应用层---串口*/
uchar sdata[tcp_MaxBufSize+1]; /*要发送的数据*/
ulong acknum;
ulong seqnum; /* data ack'd and sequence num */
uchar unhappy; /* 重传标志 */
uchar recent; /* 当前重传标志 */
uint flags; /* tcp flags word for last packet sent */
uint window ; /* 通讯目标窗口 */
int datalen; /* 需要发送的字节数 signed!!*/
uint mss;
} tcp_Socket;
void tcp_handler(in_Header xdata *ip);
void tcp_Retransmitter(void);
void tcp_ProcessData(tcp_Header xdata *tp, int len,
tcp_PseudoHeader xdata *ph);
int tcp_write( uchar xdata *dp,int len );
void tcp_rst( in_Header xdata *his_ip, tcp_Header xdata *oldtcpp );
void tcp_abort( void );
char tick(void);
void tcp_listen( uint local_port);
char tcp_open( uint lport, ulong ina, uint port );
void tcp_close(void );
char tcp_established(void);
void tcp_send(void);
void sock_close(void);
char sock_wait_established( int timeout );
void handle_packet(void);
void tcp_probe(void);/*察看当前连接是否有效*/
uint checksum(uchar xdata *chk_addr,uint len);
eth_address code MULTI_ADDR={0xff,0xff,0xff,0xff,0xff,0xff};
eth_address code UNKOWN_ADDR={0x00,0x00,0x00,0x00,0x00,0x00};
uint checksum(uchar xdata *chk_addr,uint len)
{
uint xdata *addr;
uchar xdata *f_addr;
uint xdata tempint;
uint xdata length;
ulong xdata sum;
uchar temp;
length=len;
temp=chk_addr[length];
if(length & 0x01)
{
chk_addr[len]=0;/*pad*/
length=length+1;
}
f_addr=chk_addr;
length=length/2;
addr=(uint xdata *)chk_addr;
sum=0;
for(tempint=0;tempint<length;++tempint)
{
sum+=*(addr++);
}
sum=(sum>>16)+(sum&0xffff);
sum+=(sum>>16);
f_addr[len]=temp;
return(sum);
}
void udp_handler(in_Header xdata *ip);
uint udp_out(uint data_len,uchar xdata *data_headt,ulong dst_ip,uint dst_port);
void icmp_Reply(in_Header xdata *pip, int icmp_length );
void icmp_handler( in_Header xdata *ip );
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -