📄 socket3.h
字号:
#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 + -