⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iptcp.bak

📁 是TCPIP程序
💻 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 + -