?? 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 + -