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

📄 ne2000.h

📁 51单片机上实现tcp/ip的源代码
💻 H
字号:
/*********************************************************************
 *            Copright(c) 2004,张会福 湖南科技大学计算机学院 
 *                        All rights reserved.
 *
 *文件名称:    NE2000.h
 *文件标识: 
 *摘    要: 网络结构及网络端口定义
 *
 *当前版本: V1.0
 *完成日期: 2004.4.10
 *
 *
 *********************************************************************/
#define  uint   unsigned int
#define  uchar  unsigned char
#define  ulong  unsigned long
union    u {    unsigned int     word;
                struct{unsigned char     high;
                       unsigned char     low;}bytes;//字节顺序为高位在前的2byte结构
           };

union   w {  ulong     dwords;
             struct {uint      high ;
                     uint      low;}words;
             struct {uchar     byte3;
                     uchar     byte2;
                     uchar     byte1;
                     uchar     byte0;}bytes;
           };
union   Ethernet_Address_Type{
                              uint     words[3];
                              uchar     bytes[6]; };
union     Ip_Address_Type{
                          ulong     dwords;
                          uint     words[2];
                          uchar     bytes[4]; };

/******************以太网帧**********************/
struct  ethernet {  uchar     RecStatus;           /*接收状态*/
                    uchar     NextPage;            /*下一个页*/
                    uint      length;              /*以太网长度,以字节为单位,*/
                    uint      DestMacId[3];        /*目的网卡地址*/
                    uint      SourceMacId[3];      /*源网卡地址*/
                    uint      NextProtocal;        /*下一层协议*/
                    uchar     packet[1518];        /*包的内容*/
                   } ;
struct  retransmit {uchar    RtStatus;            /*重发缓冲区状态*/
                    uchar    timeout;             /*超时时间值,单位为10毫秒,最大2.55秒*/
                    uint     length;              /*以太网长度,以字节为单位,*/
                    uint     DestMacId[3];        /*目的网卡地址*/
                    uint     SourceMacId[3];      /*源网卡地址*/
                    uint     NextProtocal;        /*下一层协议 */
                    uchar    packet[1518];        /*包的内容*/
                   }  ;

/*******************IP包,仅当IHL=5时用,当不=5时作转换*********/
struct ip { uint     EtherHead[9];   /*以太网包头*/
            uchar    VerandIphLen;   /*版本与头长度*/
            uchar    ServerType;     /*服务类型*/
            uint     TotalLen;       /*总长度*/
            uint     FrameIndex;     /*IP帧序号*/
            uint     Segment;        /*分段标志*/
            uchar    ttl;            /*生存时间*/
            uchar    NextProtocal;   /*下一层协议*/
            uint     Crc;            /*校验和*/
            uint     SourceIp[2];    /*源IP*/
            uint     DestId[2];      /*目的IP*/
            uchar    packet[1498];   /*IP包的内容*/
          };
struct IpPacket  { uint     EtherHead[9];     /*以太网包头*/
                   uint     IpPacket[720];    /*IP包的内容*/
                 };
struct arp     { uint     EtherHead[9];       /*以太网头*//* arp报文的内容总长28字节*/
                                       
                 uint     HardwareType;       /*以太网为0x0001*/
                 uint     ProtocalType;       /*ip 为0X0800*/
                 uchar    HardwareLen;        /*=0X06*/
                 uchar    ProtocalLen;        /*=0X04*/
                 uint     Operation;          /*操作  0X0001为请求   0X0002为应答  */
                                              /*0X0003为反向地址请求 0X0004为反向地址应答*/
                 uint     SourceMacId[3];     /*源网卡地址*/
                 uint     SourceIp[2];        /*源IP地址*/
                 uint     DestMacId[3];       /*目的网卡地址*/
                 uint     DestId[2];          /*目的IP地址*/
                };

struct icmp {/*包含在IP包中,是IP的上层为0X01的应用*/
                uint     EtherHead[9];       /*以太网头*/
                uint     IpHead[10];         /*IP头*/
                uchar    type;               /*0X08 PING请求 0X00 PING应答*/
                uchar    option;             /*0X00 PING*/
                uint     Crc;
                uint     id;
                uint     seq;
                uchar    icmpdata[1478];
              };

struct tcp {   uint     EtherHead[9];
               uint     IpHead[10];
               uint     SourcePort;             /*源端口*/
               uint     DestPort;               /*目的端口*/
               ulong    SeqNum;                 /*顺序号*/
               ulong    AckNum;                 /*确认号*/
               uchar    offset;                 /*数据偏移量*/
               uchar    control;                /*连接控制*/
               uint     window;                 /*流控*/
               uint     Crc;                    /*校验和 ,包括伪头部,TCP头部,数据*/
               uint     urg;                    /*紧急指针*/
               uchar    tcpdata[1478];          /*TCP数据*/
             };

struct udp {   uint     EtherHead[9];
               uint     IpHead[10];
               uint     SourcePort;        /*源端口*/
               uint     DestPort;          /*目的端口*/
               uint     length;
               uint     Crc;               /*校验和,包括伪头部,udp头部,数据*/
               uchar    udpdata[1478];     /*udp数据*/
             };

     /*所有协议的共用体*/
union Netcard {struct     {uchar      bytebuf[1536];}bytes;
               struct     {uint       wordbuf[768];}words;
               struct     ethernet    EtherFrame;
               struct     retransmit  ResendFrame;
               struct     arp         ArpFrame;
               struct     icmp        IcmpFrame;
               struct     tcp         TcpFrame;
               struct     ip          IpFrame;
               struct     udp         UdpFrame;
               struct     IpPacket    IpPacket;
              };

struct Socket_Type{
            uint      My_Port;            //本机端口
            uint      Dest_Port;          //对方端口
            uint      Dest_Ip[2];         //对方ip
            uint      Dest_Mac_Id[3];     //对方的以太网地址
            ulong     IRS;                //初始化顺序号
            ulong     ISS;                //我的初始化序列号
            ulong     Rcv_Next;           //对方的顺序号
            ulong     Send_Next;          //我的已经发送顺序号
            ulong     Sent_UnAck;         //我的还没有确认顺序号
                                          //unsigned long dest_ack_number;
            uint      Rcv_Window;         //对方的window大小
            uint      Snd_Window;         //我的window大小
            uint      Dest_Max_Seg_Size;  //对方接受的最大的数据包大小MTU
            uint      My_Max_Seg_Size;    //我能接受的最大的数据包大小
            ulong     My_Wl1;             //seq
            ulong     My_Wl2;             //ack
            uchar     State;              //连接状态
            uchar     Open;
          };

/*tcp state define */

#define     TCP_STATE_LISTEN        0
#define     TCP_STATE_SYN_RCVD      1
#define     TCP_STATE_SYN_SENT      2
#define     TCP_STATE_ESTABLISHED   3
#define     TCP_STATE_FIN_WAIT1     4
#define     TCP_STATE_FIN_WAIT2     5
#define     TCP_STATE_CLOSING       6
#define     TCP_STATE_CLOSE_WAIT    7
#define     TCP_STATE_LAST_ACK      8
#define     TCP_STATE_CLOSED        9
#define     TCP_STATE_TIME_WAIT     10
//tcp连接的标志位
#define     TCP_FIN 0x01
#define     TCP_SYN 0x02
#define     TCP_RST 0x04
#define     TCP_PSH 0x08
#define     TCP_ACK 0x10
#define     TCP_URG 0x20


/***    RTL8019's address deifne     ***/
#define dp668
#ifdef  dp668   //reg00- 10为isa网卡接口的寄存器地址300-31f
    #define     RED_ADDR0   RTL8019AS_BASE_ADDRESS+0x00
    #define     RED_ADDR1   RTL8019AS_BASE_ADDRESS+0x01
    #define     RED_ADDR2   RTL8019AS_BASE_ADDRESS+0x02
    #define     RED_ADDR3   RTL8019AS_BASE_ADDRESS+0x03
    #define     RED_ADDR4   RTL8019AS_BASE_ADDRESS+0x04
    #define     RED_ADDR5   RTL8019AS_BASE_ADDRESS+0x05
    #define     RED_ADDR6   RTL8019AS_BASE_ADDRESS+0x06
    #define     RED_ADDR7   RTL8019AS_BASE_ADDRESS+0x07
    #define     RED_ADDR8   RTL8019AS_BASE_ADDRESS+0x08
    #define     RED_ADDR9   RTL8019AS_BASE_ADDRESS+0x09
    #define     RED_ADDRa   RTL8019AS_BASE_ADDRESS+0x0a
    #define     RED_ADDRb   RTL8019AS_BASE_ADDRESS+0x0b
    #define     RED_ADDRc   RTL8019AS_BASE_ADDRESS+0x0c
    #define     RED_ADDRd   RTL8019AS_BASE_ADDRESS+0x0d
    #define     RED_ADDRe   RTL8019AS_BASE_ADDRESS+0x0e
    #define     RED_ADDRf   RTL8019AS_BASE_ADDRESS+0x0f
    #define     RED_ADDR10  RTL8019AS_BASE_ADDRESS+0x10
    #define     RED_ADDR18  RTL8019AS_BASE_ADDRESS+0x18
    #define     Reg00       XBYTE[RED_ADDR0]   
    #define     Reg01       XBYTE[RED_ADDR1]
    #define     Reg02       XBYTE[RED_ADDR2]
    #define     Reg03       XBYTE[RED_ADDR3]
    #define     Reg04       XBYTE[RED_ADDR4]
    #define     Reg05       XBYTE[RED_ADDR5]
    #define     Reg06       XBYTE[RED_ADDR6]
    #define     Reg07       XBYTE[RED_ADDR7]
    #define     Reg08       XBYTE[RED_ADDR8]
    #define     Reg09       XBYTE[RED_ADDR9]
    #define     Reg0a       XBYTE[RED_ADDRa]
    #define     Reg0b       XBYTE[RED_ADDRb]
    #define     Reg0c       XBYTE[RED_ADDRc]
    #define     Reg0d       XBYTE[RED_ADDRd]
    #define     Reg0e       XBYTE[RED_ADDRe]
    #define     Reg0f       XBYTE[RED_ADDRf]
    #define     Reg10       XBYTE[RED_ADDR10]
    #define     Reg18       XBYTE[RED_ADDR18]

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -