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

📄 socket3.h

📁 winsail v2.0是用于DOS下的图形界面空间系统
💻 H
📖 第 1 页 / 共 2 页
字号:
#ifndef _SOCKET3_H_
#define _SOCKET3_H_

#include <Symbol.h>
#include <Memory.h>
//#include <Socket4.h>

#define INADDR_ANY 0

#define PACKET_DISPLAY_ETHERNET 0
#define PACKET_DISPLAY_ARP      1
#define PACKET_DISPLAY_RARP     2
#define PACKET_DISPLAY_IP       3
#define PACKET_DISPLAY_ICMP     4
#define PACKET_DISPLAY_IGMP     5
#define PACKET_DISPLAY_UDP      6
#define PACKET_DISPLAY_TCP      7

//SOCKET编程必用的宏
#define TCP_WINDOW_SIZE   2048
#define PACKET_IP_VERSION 4
#define PACKET_INTNUMBER_ASM 60H
#define PACKET_INTNUMBER_C   0x60

#define MAX_LISTENING_COUNT 5
#define NULL_SOCKET     (SOCKET)(0)
#define INVALID_SOCKET  (SOCKET)(~0)
#define SOCKET_ERROR    (int)(~0)

//#define h_errno         WSAGetLastError()
typedef unsigned char   u_char;
typedef unsigned short  u_short;
typedef unsigned int    u_int;
typedef unsigned long   u_long;
typedef unsigned char 	byte;
typedef int  word;
typedef	long lword;
typedef	unsigned unshort;
typedef char *caddr_t;

typedef long            in_name;
typedef long            seq_t;
typedef u_int           SOCKET;

#include <Socket5.h>

//定义ICMP消息
#define	PGNOSND		0	//Couldn't send pkt
#define	PGTMO		1	//超时
#define	PGBADDATA	2	//rcved bad data back
#define	PGWAITING	3	//waiting for rcpt of packet
#define	PGSUCCESS	4	//成功

//定义
#define	DSTNET		0
#define	DSTHOST		1
#define	DSTPROT		2
#define	DSTPORT		3
#define	DSTFRAG		4
#define	DSTSRC		5

//定义IP报文的传输协议
#define			IPPROTO_IP               0  
#define			IPPROTO_ICMP             1  //ICMP协议
#define			IPPROTO_IGMP             2  //IGMP协议
#define			IPPROTO_GGP              3  //GGP网关协议
#define			IPPROTO_ST               5  /* Stream                           */
#define			IPPROTO_TCP              6  //TCP协议
#define			IPPROTO_UCL              7  /* UCL                              */
#define			IPPROTO_EGP              8  /* Exterior Gateway Protocol        */
#define			IPPROTO_IGP              9  /* any private interior gateway     */
#define			IPPROTO_BBN_RCC_MON     10  /* BBN RCC Monitoring               */
#define			IPPROTO_NVP_II          11  /* Network Voice Protocol           */
#define			IPPROTO_PUP             12  /* PUP                              */
#define			IPPROTO_ARGUS           13  /* ARGUS                            */
#define			IPPROTO_EMCON           14  /* EMCON                            */
#define			IPPROTO_XNET            15  /* Cross Net Debugger               */
#define			IPPROTO_CHAOS           16  /* Chaos                            */
#define			IPPROTO_UDP             17  //UDP协议
#define			IPPROTO_MUX             18  /* Multiplexing                     */
#define			IPPROTO_DCN_MEAS        19  /* DCN Measurement Subsystems       */
#define			IPPROTO_HMP             20  /* Host Monitoring                  */
#define			IPPROTO_PRM             21  /* Packet Radio Measurement         */
#define			IPPROTO_XNS_IDP         22  /* XEROX NS IDP                     */
#define			IPPROTO_TRUNK_1         23  /* Trunk-1                          */
#define			IPPROTO_TRUNK_2         24  /* Trunk-2                          */
#define			IPPROTO_LEAF_1          25  /* Leaf-1                           */
#define			IPPROTO_LEAF_2          26  /* Leaf-2                           */
#define			IPPROTO_RDP             27  /* Reliable Data Protocol           */
#define			IPPROTO_IRTP            28  /* Internet Reliable Transaction    */
#define			IPPROTO_ISO_TP4         29  /* ISO Transport Protocol Class 4   */
#define			IPPROTO_NETBLT          30  /* Bulk Data Transfer Protocol      */
#define			IPPROTO_INTERNAL        61  /* any host internal protocol       */
#define			IPPROTO_CFTP            62  /* CFTP                             */
#define			IPPROTO_LOCAL_NET       63  /* any local network                */
#define			IPPROTO_SAT_EXPAK       64  /* SATNET and Backroom EXPAK        */
#define			IPPROTO_MIT_SUBNET      65  /* MIT Subnet Support               */
#define			IPPROTO_RVD             66  /* MIT Remote Virtual Disk Protocol */
#define			IPPROTO_IPPC            67  /* Internet Pluribus Packet Core    */
#define			IPPROTO_DIST_FS         68  /* any distributed file system      */
#define			IPPROTO_SAT_MON         69  /* SATNET Monitoring                */
#define			IPPROTO_IPCV            71  /* Internet Packet Core Utility     */
#define			IPPROTO_BR_SAT_MON      76  /* Backroom SATNET Monitoring       */
#define			IPPROTO_WB_MON          78  /* WIDEBAND Monitoring              */
#define			IPPROTO_WB_EXPAK        79  /* WIDEBAND EXPAK                   */
#define			IPPROTO_OSPF            89  //OSPF最先开放短路径协议
#define			IPPROTO_RAW             255

//#define SOCK_STREAM   IPPROTO_TCP
//#define SOCK_DGRAM    IPPROTO_UDP
//#define SOCK_RAW      IPPROTO_RAW

//使用的TCP端号
#define IPPORT_ECHO             7
#define IPPORT_DISCARD          9
#define IPPORT_SYSTAT           11
#define IPPORT_DAYTIME          13
#define IPPORT_NETSTAT          15
#define IPPORT_FTP              21
#define IPPORT_TELNET           23
#define IPPORT_SMTP             25
#define IPPORT_TIMESERVER       37
#define IPPORT_NAMESERVER       42
#define IPPORT_WHOIS            43
#define IPPORT_MTP              57
#define IPPORT_TFTP             69
#define IPPORT_RJE              77
#define IPPORT_FINGER           79
#define IPPORT_TTYLINK          87
#define IPPORT_SUPDUP           95
#define IPPORT_EXECSERVER       512
#define IPPORT_LOGINSERVER      513
#define IPPORT_CMDSERVER        514
#define IPPORT_EFSSERVER        520
#define IPPORT_BIFFUDP          512
#define IPPORT_WHOSERVER        513
#define IPPORT_ROUTESERVER      520

//定义Ethernet的类型
#define	ETHERTYPE_IP		0x0800	//IP
#define	ETHERTYPE_ARP		0x0806	//ARP
#define	ETHERTYPE_RARP		0x8035  //RARP

//Ethernet数据包
#define MAX_IPADDR_LENGTH        4
#define MAX_ETHERNETADDR_LENGTH  6

#define MAX_ETHERNETPAGE_SIZE  (6 + 6 + 2 + 1500)

class CFifo
{

private:
        int m_nMaxFrame;
        int m_nHead;
        int m_nTail;

        void** m_psBuffer;
public:
       BOOL IsFull();
       BOOL IsEmpty(){return((m_nHead == m_nTail)?TRUE:FALSE);};
	   void Clear(){m_nHead = m_nTail;}

       void SetMaxFrame(int nCount){m_nMaxFrame = nCount;}
       int  GetMaxFrame(){return(m_nMaxFrame);}

       void SetHead(int nHead){m_nHead = nHead;}
       int  GetHead(){return(m_nHead);}

       void SetTail(int nTail){m_nTail = nTail;}
       int  GetTail(){return(m_nTail);}

       void  SetBuffer(void** pBuffer){m_psBuffer = pBuffer;}
       void* SetFrame(int nLocation, void* pFrame);
       void* GetFrame(int nLocation);

       BOOL  AddFrameToTail(void* pFrame);
       void* GetFrameFromHead(BOOL bMove = TRUE);

public:
       CFifo();
};

#define ETHERFIFO_UDPTCP_SIZE  10

#define ETHERFIFO_START_SIZE       4
#define ETHERFIFO_SEND_SIZE       32
#define ETHERFIFO_ARP_SIZE         2
#define ETHERFIFO_RARP_SIZE        2
#define ETHERFIFO_IP_SIZE         12
#define ETHERFIFO_ICMP_SIZE       12
#define ETHERFIFO_UDP_SIZE       12
#define ETHERFIFO_TCP_SIZE       12
#define ETHERFIFO_FREE_SIZE        4

#define ETHERFIFO_START       1
#define ETHERFIFO_SEND        2
#define ETHERFIFO_ARP         3
#define ETHERFIFO_RARP        4
#define ETHERFIFO_IP          5
#define ETHERFIFO_ICMP        6
#define ETHERFIFO_UDP         7
#define ETHERFIFO_TCP         8
#define ETHERFIFO_FREE        9

class CEthernetFifo:public CFifo
{
public:
	CFifo  m_SendFifo;
	CFifo  m_RecvArpFifo;
	CFifo  m_RecvRarpFifo;
    CFifo  m_RecvIpFifo;
    CFifo  m_RecvIcmpFifo;
//	CFifo  m_RecvUdpFifo;
// 	CFifo  m_RecvTcpFifo;

public:
	CXmsMemory m_XmsMemory_Send;
    CXmsMemory m_XmsMemory_Recv;
public:
	CEthernetFifo();
};

typedef BYTE IP_ADDRESS[MAX_IPADDR_LENGTH];
typedef BYTE ETHERNET_ADDRESS[MAX_ETHERNETADDR_LENGTH];

typedef struct ETHERNET_HEADER
{
	ETHERNET_ADDRESS	mEthernetRecvAddr;//目的地址
	ETHERNET_ADDRESS	mEthernetSendAddr;//源地址
	WORD				wType;//帧类型
	//BYTE				ip_data[];//数据
	//DWORD				Check;//crc校验
} ETHERNET_HEADER;


//Arp数据包
typedef struct tagARP_HEADER
{
	WORD             wHardwareStyle;//硬件类型
	WORD             wProtoentStyle;//协议类型
	BYTE             byHardwareLen;//硬件长度
	BYTE             byProtoentLen;//协议长度
	WORD             wOperationCode;//1=申请;2=应答
	ETHERNET_ADDRESS mEthernetSendAddr;//发送机硬件地址
	IP_ADDRESS       mIPSendAddr;//发送机IP地址
	ETHERNET_ADDRESS mEthernetRecvAddr;//接收机硬件地址
	IP_ADDRESS       mIPRecvAddr;//接收机IP地址
}ARP_HEADER;

#pragma
//IP包定义
typedef struct tagIP_HEADER
{
	BYTE			byIHL: 4;		//网际头标长度,以4字节为单位
	BYTE 			byVersion : 4;	//版本

	byte			byServeType;	//服务类型,现行TCP/IP不使用该值
	unshort			wLength;		//总长度,以字节为单位
	unshort			wID;			//标识,每一“完整的”数据报是唯一的
	unshort			wFlags : 3;		//标志,x1x不能分段;10x:表有分段;00x:没分段
	unshort			wOffset : 13;	//片偏移,在分段时,其原始的8字节为单位的偏移
	byte			byTTL;			//生存期,值为0时,应丢弃
	byte			byProtoent;		//协议
	unshort			wChecksum;		//头校验
	IP_ADDRESS		mIPSendAddr;	//源IP地址
	IP_ADDRESS		mIPRecvAddr;	//目的IP地址
	//unsigned long dwOption:24;	//选项
	//unsigned long dwFill:8;		//填充
	//byte			bysData[];		//数据
}IP_HEADER;

//ICMP包。3=住宿不可达,4=终止源,11=超时
struct ICMP_Dest
{
	BYTE	  byType;//类型
	BYTE	  byCode;//代码
	unshort   wChecksum;//校验和
	DWORD     dwReserve;//保留1
	IP_HEADER mIPHead;//IP头
	BYTE	  bysData[8];//64位
};

//ICMP包。5=重定向
struct ICMP_Redirect
{
	BYTE	  byType;//类型
	BYTE	  byCode;//代码
	unshort   wChecksum;//校验和
	long      gwIPAddress;//Gatewat IP地址
	IP_HEADER mIPHead;//IP头
	BYTE	  bysData[8];//64位

};

//ICMP包。8=响应申请,0=响应应答
struct ICMP_Response
{
	BYTE	  byType;//类型
	BYTE	  byCode;//代码
	unshort   wChecksum;//校验和
	unsigned  id;//标识
	unsigned  seq;//序列号
	IP_HEADER mIPHeader;//IP头
	BYTE	  bysData[8];//64位
    BYTE      bysData2[4];
};


//ICMP包。12=参数失灵
struct ICMP_Para
{
	BYTE	  byType;//类型
	BYTE	  byCode;//代码
	unshort   wChecksum;//校验和
	BYTE      byPtr;//Ptr
	BYTE      byReserve[3];//保留
	IP_HEADER mIPHead;//IP头
	BYTE	  bysData[8];//64位
};


//ICMP包。13=时间标志请求
struct ICMP_StampReq
{
	BYTE	  byType;//类型
	BYTE	  byCode;//代码
	unshort   wChecksum;//校验和
	unsigned  id;//标识
	unsigned  seq;//序列号
	long	  stamp[1];//源时标
};

//ICMP包。14=时间标志应答
struct ICMP_StampAck
{
	BYTE	  byType;//类型
	BYTE	  byCode;//代码
	unshort   wChecksum;//校验和
	unsigned  id;//标识
	unsigned  seq;//序列号
	long	  stamp[3];//源时标+接收时标+传输时标
};

//ICMP包。15=信息请求,16=信息印答,17=地址掩码请求
struct ICMP_INFORMATION
{
	BYTE	  byType;//类型
	BYTE	  byCode;//代码
	unshort   wChecksum;//校验和
	unsigned  id;//标识
	unsigned  seq;//序列号
};

//ICMP包。16 =地址掩码请求 17=地址掩码应答
struct ICMP_ADDRESSMASK
{
	BYTE	  byType;//类型
	BYTE	  byCode;//代码
	unshort   wChecksum;//校验和
	unsigned  id;//标识
	unsigned  seq;//序列号
    DWORD 	  dwMask;
};

typedef union tagICMP_HEADER
{
	struct ICMP_Dest     mIcmp3_4_11;
	struct ICMP_Redirect mIcmp5;
	struct ICMP_Response mIcmp0_8;
	struct ICMP_Para     mIcmp12;
	struct ICMP_StampReq mIcmp13;
	struct ICMP_StampAck mIcmp14;
    struct ICMP_ADDRESSMASK mIcmp16_17;
}ICMP_HEADER;

//PING数据包
struct PING_HEAD //使用ICMP的响应申请(=8)和响应应答(=0)
{				
	char	  byType;//类型
	char	  byCode;//代码
	unshort   wChecksum;//校验和
	unsigned  id;//标识
	unsigned  seq;//序列号
};

//伪TCP头
typedef struct tagTCPx_HEADER
{
	IP_ADDRESS mIPSendAddr;
	IP_ADDRESS mIPRecvAddr;
    BYTE       byReserve;
    BYTE       byProtoent;
    WORD       wLength;

}TCPx_HEADER;

⌨️ 快捷键说明

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