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

📄 dualserver.h

📁 Combined DHCP/DNS Server. DHCP Server allots addresses and DNS Server first try resolving from DHCP
💻 H
字号:
/**************************************************************************
*   Copyright (C) 2005 by Achal Dhir                                      *
*   achaldhir@gmail.com                                                   *
*                                                                         *
*   This program is free software; you can redistribute it and/or modify  *
*   it under the terms of the GNU General Public License as published by  *
*   the Free Software Foundation; either version 2 of the License, or     *
*   (at your option) any later version.                                   *
*                                                                         *
*   This program is distributed in the hope that it will be useful,       *
*   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
*   GNU General Public License for more details.                          *
*                                                                         *
*   You should have received a copy of the GNU General Public License     *
*   along with this program; if not, write to the                         *
*   Free Software Foundation, Inc.,                                       *
*   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
***************************************************************************/
//This file defines all structures and constants
//for both DHCP and DNS Servers
#include <string>
#include <map>
using namespace std;

#define my_inet_addr 	inet_addr
#define MAX_SERVERS 16

#define RCODE_NOERROR 		0
#define RCODE_FORMATERROR	1
#define RCODE_SERVERFAIL	2
#define RCODE_NAMEERROR		3
#define RCODE_NOTIMPL 		4
#define RCODE_REFUSED 		5
#define RCODE_YXDOMAIN 		6
#define RCODE_YXRRSET 		7
#define RCODE_NXRRSET 		8
#define RCODE_NOTAUTH 		9
#define RCODE_NOTZONE 		10

#define OPCODE_STANDARD_QUERY	0
#define OPCODE_INVERSE_QUERY	1
#define OPCODE_SRVR_STAT_REQ	2
#define OPCODE_DYNAMIC_UPDATE	5

#define DNS_TYPE_A		1
#define DNS_TYPE_NS		2
#define DNS_TYPE_MD		3
#define DNS_TYPE_MF		4
#define DNS_TYPE_CNAME	5
#define DNS_TYPE_SOA	6
#define DNS_TYPE_MB		7
#define DNS_TYPE_MG		8
#define DNS_TYPE_MR		9
#define DNS_TYPE_NULL	10
#define DNS_TYPE_WKS	11
#define DNS_TYPE_PTR	12
#define DNS_TYPE_HINFO	13
#define DNS_TYPE_MINFO	14
#define DNS_TYPE_MX		15
#define DNS_TYPE_TXT	16
#define DNS_TYPE_AAAA	28
#define DNS_TYPE_IXFR	251
#define DNS_TYPE_AXFR	252
#define DNS_TYPE_MAILB	253
#define DNS_TYPE_MAILA	254
#define DNS_TYPE_ANY	255

#define DNS_CLASS_IN	1
#define DNS_CLASS_CS	2
#define DNS_CLASS_CH	3
#define DNS_CLASS_HS	4
#define DNS_CLASS_NONE	254
#define DNS_CLASS_ANY	255

#define IPPORT_DNS 53

struct dnsHeader
{
	WORD xid;
	union
	{
		WORD flags;
		struct
		{
			BYTE rd: 1;			//Recusion Desired
			BYTE tc: 1;			//Truncated
			BYTE aa: 1;			//Authoritative Answer
			BYTE opcode: 4;		//OpCode
			BYTE qr: 1;			//Query/Response

			BYTE rcode: 4;		//rcode
			BYTE at: 1;			//Answer Authenticated
			BYTE z: 1;			//Filler
			BYTE filler: 1;		//Not Used
			BYTE ra: 1;			//Resusion Available
		};
	};
	union {
		WORD zcount;
		WORD qdcount;
	};
	union {
		WORD prcount;
		WORD ancount;
	};
	union {
		WORD ucount;
		WORD nscount;
	};
	union {
		WORD adcount;
		WORD arcount;
	};
};

struct dnsPacket
{
	struct dnsHeader header;
	char data;
};

struct data6
{
	char zone[256];
	WORD dnLen;
	DWORD dns;
};

struct data7 //cache
{
	char *mapname;
	time_t expiry;
	union
	{
		struct
		{
			BYTE dataType;
			BYTE cacheInd;
			BYTE sockInd;
			BYTE dnsIndex;
		};
//		struct
//		{
//			BYTE dataType1;
//			BYTE ext;
//			WORD refCount;
//		};
		struct
		{
			BYTE dataType2;
			char rangeInd;
			WORD dhcpInd;
		};
		struct
		{
			BYTE dataType3;
			BYTE filler;
			WORD mailPref;
		};
	};
	union
	{
		int bytes;
		SOCKADDR_IN *source;
		BYTE *options;
		DWORD serial;
	};
	union
	{
		BYTE *response;
		char *hostname;
		char *query;
		DWORD ip;
	};
};

typedef multimap<string, data7*> hostMap;
typedef map<string, data7*> dhcpMap;
typedef multimap<time_t, data7*> expiryMap;

struct data5 //dns request
{
	dnsPacket *dnsp;
	char raw[2048];
	char *data;
	char query[256];
	char cname[256];
	char mapname[256];
	data7 cache;
	hostMap::iterator iterBegin;
	SOCKET sock;
	SOCKADDR_IN addr;
	socklen_t sockLen;
	int bytes;
	HANDLE hThread;
	WORD qtype;
	WORD qclass;
	BYTE localCode;
	BYTE sockInd;
};

enum
{
	NONE,
	LOCAL_A,
	LOCAL_PTR,
	LOCALHOST_A,
	LOCALHOST_PTR,
	SERVER_A_AUTH,
	SERVER_PTR_AUTH,
	SERVER_A_NAUTH,
	SERVER_PTR_NAUTH,
	LOCAL_CNAME,
	EXT_CNAME,
	STATIC_A_AUTH,
	STATIC_PTR_AUTH,
	STATIC_A_NAUTH,
	STATIC_PTR_NAUTH,
	MX,
	NS,
	SOA,
	AXFR,
	CACHED,
	NON_CACHED,
	QUEUE,
	DHCP
};

struct data12 //dns range
{
	DWORD rangeStart;
	DWORD rangeEnd;
};

struct dns_rr
{
	char *name;
	WORD type, _class;
	DWORD ttl;
	WORD rdlength;
	char *rdata;
	union {
		struct
		{
			long address;
		} a;
		struct
		{
			char *cname;
		} cname;
		struct
		{
			char *cpu, *os;
		} hinfo;
		struct
		{
			char *madname;
		} mb;
		struct
		{
			char *madname;
		} md;
		struct
		{
			char *madname;
		} mf;
		struct
		{
			char *mgmname;
		} mg;
		struct
		{
			char *rmailbx, *emailbx;
		} minfo;
		struct
		{
			char *newname;
		} mr;
		struct
		{
			int preference;
			char *exchange;
		} mx;
		struct
		{
			char *nsdname;
		} ns;
		struct
		{
			char *data;
		} null;
		struct
		{
			char *ptrdname;
		} ptr;
		struct
		{
			char *mname, *rname;
			unsigned serial, refresh, retry, expire, minimum;
		} soa;
		struct
		{
			char **txt_data;
		} txt;
		struct
		{
			int address;
			BYTE protocol;
			int bitmapsize;
			char *bitmap;
		} wks;
	} data;
};

struct dnsConnType
{
	SOCKET sock;
	SOCKADDR_IN addr;
	DWORD server;
};

#define DHCP_REQUEST  1
#define DHCP_REPLY    2

#define DHCP_MESS_NONE       0
#define DHCP_MESS_DISCOVER   1
#define DHCP_MESS_OFFER      2
#define DHCP_MESS_REQUEST	 3
#define DHCP_MESS_DECLINE	 4
#define DHCP_MESS_ACK		 5
#define DHCP_MESS_NAK		 6
#define DHCP_MESS_RELEASE    7
#define DHCP_MESS_INFORM	 8


// DHCP OPTIONS
#define DHCP_OPTION_PAD						0
#define DHCP_OPTION_NETMASK          		1
#define DHCP_OPTION_TIMEOFFSET       		2
#define DHCP_OPTION_ROUTER           		3
#define DHCP_OPTION_TIMESERVER       		4
#define DHCP_OPTION_NAMESERVER       		5
#define DHCP_OPTION_DNS              		6
#define DHCP_OPTION_LOGSERVER        		7
#define DHCP_OPTION_COOKIESERVER     		8
#define DHCP_OPTION_LPRSERVER        		9
#define DHCP_OPTION_IMPRESSSERVER    		10
#define DHCP_OPTION_RESLOCSERVER     		11
#define DHCP_OPTION_HOSTNAME         		12
#define DHCP_OPTION_BOOTFILESIZE     		13
#define DHCP_OPTION_MERITDUMP        		14
#define DHCP_OPTION_DOMAINNAME       		15
#define DHCP_OPTION_SWAPSERVER       		16
#define DHCP_OPTION_ROOTPATH         		17
#define DHCP_OPTION_EXTSPATH         		18
#define DHCP_OPTION_IPFORWARD        		19
#define DHCP_OPTION_NONLOCALSR       		20
#define DHCP_OPTION_POLICYFILTER     		21
#define DHCP_OPTION_MAXREASSEMBLE    		22
#define DHCP_OPTION_IPTTL            		23
#define DHCP_OPTION_PATHMTUAGING     		24
#define DHCP_OPTION_PATHMTUPLATEAU   		25
#define DHCP_OPTION_INTERFACEMTU     		26
#define DHCP_OPTION_SUBNETSLOCAL     		27
#define DHCP_OPTION_BCASTADDRESS     		28
#define DHCP_OPTION_MASKDISCOVERY    		29
#define DHCP_OPTION_MASKSUPPLIER     		30
#define DHCP_OPTION_ROUTERDISCOVERY  		31
#define DHCP_OPTION_ROUTERSOLIC      		32
#define DHCP_OPTION_STATICROUTE      		33
#define DHCP_OPTION_TRAILERENCAPS    		34
#define DHCP_OPTION_ARPTIMEOUT       		35
#define DHCP_OPTION_ETHERNETENCAPS   		36
#define DHCP_OPTION_TCPTTL           		37
#define DHCP_OPTION_TCPKEEPALIVEINT  		38
#define DHCP_OPTION_TCPKEEPALIVEGRBG 		39
#define DHCP_OPTION_NISDOMAIN        		40
#define DHCP_OPTION_NISSERVERS       		41
#define DHCP_OPTION_NTPSERVERS       		42
#define DHCP_OPTION_VENDORSPECIFIC   		43
#define DHCP_OPTION_NETBIOSNAMESERV  		44
#define DHCP_OPTION_NETBIOSDGDIST    		45
#define DHCP_OPTION_NETBIOSNODETYPE  		46
#define DHCP_OPTION_NETBIOSSCOPE     		47
#define DHCP_OPTION_X11FONTS         		48
#define DHCP_OPTION_X11DISPLAYMNGR   		49
#define DHCP_OPTION_REQUESTEDIPADDR  		50
#define DHCP_OPTION_IPADDRLEASE      		51
#define DHCP_OPTION_OVERLOAD         		52
#define DHCP_OPTION_MESSAGETYPE      		53
#define DHCP_OPTION_SERVERID         		54
#define DHCP_OPTION_PARAMREQLIST     		55
#define DHCP_OPTION_MESSAGE          		56
#define DHCP_OPTION_MAXDHCPMSGSIZE   		57
#define DHCP_OPTION_RENEWALTIME      		58
#define DHCP_OPTION_REBINDINGTIME    		59
#define DHCP_OPTION_VENDORCLASSID    		60
#define DHCP_OPTION_CLIENTID         		61
#define DHCP_OPTION_NISPLUSDOMAIN    		64
#define DHCP_OPTION_NISPLUSSERVERS   		65
#define DHCP_OPTION_TFTPSERVER       		66
#define DHCP_OPTION_BOOTFILE         		67
#define DHCP_OPTION_MOBILEIPHOME     		68
#define DHCP_OPTION_SMTPSERVER       		69
#define DHCP_OPTION_POP3SERVER       		70
#define DHCP_OPTION_NNTPSERVER       		71
#define DHCP_OPTION_WWWSERVER        		72
#define DHCP_OPTION_FINGERSERVER     		73
#define DHCP_OPTION_IRCSERVER        		74
#define DHCP_OPTION_STSERVER         		75
#define DHCP_OPTION_STDASERVER       		76
#define DHCP_OPTION_USERCLASS        		77
#define DHCP_OPTION_SLPDIRAGENT      		78
#define DHCP_OPTION_SLPDIRSCOPE      		79
#define DHCP_OPTION_CLIENTFQDN       		81
#define DHCP_OPTION_RELAYAGENTINFO     		82
#define DHCP_OPTION_NDSSERVERS       		85
#define DHCP_OPTION_NDSTREENAME      		86
#define DHCP_OPTION_NDSCONTEXT		 		87
#define DHCP_OPTION_AUTHENTICATION			90
#define DHCP_OPTION_CLIENTSYSTEM			93
#define DHCP_OPTION_CLIENTNDI				94
#define DHCP_OPTION_LDAP					95
#define DHCP_OPTION_UUID_GUID				97
#define DHCP_OPTION_USER_AUTH				98
#define DHCP_OPTION_NETINFOADDRESS			112
#define DHCP_OPTION_NETINFOTAG				113
#define DHCP_OPTION_URL						114
#define DHCP_OPTION_AUTO_CONFIG				116
#define DHCP_OPTION_NAMESERVICESEARCH		117
#define DHCP_OPTION_SUBNETSELECTION			118
#define DHCP_OPTION_DOMAINSEARCH			119
#define DHCP_OPTION_SIPSERVERSDHCP			120
#define DHCP_OPTION_CLASSLESSSTATICROUTE	121
#define DHCP_OPTION_CCC						122
#define DHCP_OPTION_GEOCONF					123
#define DHCP_OPTION_V_IVENDORCLASS			124
#define DHCP_OPTION_V_IVENDOR_SPECIFIC		125
#define DHCP_OPTION_TFPTSERVERIPADDRESS		128
#define DHCP_OPTION_CALLSERVERIPADDRESS		129
#define DHCP_OPTION_DISCRIMINATIONSTRING	130
#define DHCP_OPTION_REMOTESTATISTICSSERVER	131
#define DHCP_OPTION_802_1PVLANID			132
#define DHCP_OPTION_802_1QL2PRIORITY		133
#define DHCP_OPTION_DIFFSERVCODEPOINT		134
#define DHCP_OPTION_HTTPPROXYFORPHONE_SPEC	135
#define DHCP_OPTION_SERIAL					253
#define DHCP_OPTION_NEXTSERVER				254
#define DHCP_OPTION_END						255

//#define DHCP_VENDORDATA_SIZE		 272
//#define DHCP_VENDORDATA_SIZE		 64
//#define DHCP_VENDORDATA_SIZE		 784
//#define DHCP_PACKET_SIZE			1024
//#define DHCP_MIN_SIZE				 44
//#define DHCP_MAX_CLIENTS			 254
#define IPPORT_DHCPS   67
#define IPPORT_DHCPC   68
#define VM_STANFORD  0x5354414EUL
#define VM_RFC1048   0x63825363UL

struct data3
{
	BYTE opt_code;
	BYTE size;
	BYTE value[256];
};

struct dhcp_header
{
	BYTE bp_op;
	BYTE bp_htype;
	BYTE bp_hlen;
	BYTE bp_hops;
	DWORD bp_xid;
	WORD bp_secs;
	BYTE bp_broadcast;
	BYTE bp_spare;
	DWORD bp_ciaddr;
	DWORD bp_yiaddr;
	DWORD bp_siaddr;
	DWORD bp_giaddr;
	BYTE bp_chaddr[16];
	char bp_sname[64];
	BYTE bp_file[128];
	BYTE bp_magic_num[4];
};

struct dhcp_packet
{
	dhcp_header header;
	BYTE vend_data[1024 - sizeof(dhcp_header)];
};

struct data13 //dhcp range
{
	DWORD rangeStart;
	DWORD rangeEnd;
	time_t *expiry;
	WORD *dhcpIndex;
	DWORD mask;
};

struct data1 //dhcpRequst
{
	DWORD lease;
	union
	{
		char raw[sizeof(dhcp_packet)];
		dhcp_packet dhcpp;
	};
	char hostname[256];
	DWORD server;
	DWORD reqIP;
	int bytes;
	SOCKADDR_IN addr;
	WORD messsize;
	data7 *dhcpEntry;
	data3 agentOption;
	//SOCKET tcpSock;
	DWORD serial;
	BYTE paramreqlist[256];
	BYTE opAdded[256];
	BYTE req_type;
	BYTE resp_type;
	BYTE sockInd;
};

struct dhcpConnType
{
	SOCKET sock;
	SOCKADDR_IN addr;
	DWORD server;
	DWORD mask;
	int broadCastVal;
	int broadCastSize;
	int reUseVal;
	int reUseSize;
};

struct data8 //client
{
	BYTE bp_chaddr[16];
	DWORD ip;
	time_t expiry;
	char hostname[64];
};

struct data2
{
	WSADATA wsaData;
	dhcpConnType dhcpConn[MAX_SERVERS];
	dnsConnType dnsUdpConn[MAX_SERVERS];
	dnsConnType forwConn;
	dhcpConnType dhcpReplConn;
	dnsConnType dnsTcpConn[MAX_SERVERS];
	char zone[256];
	BYTE zLen;
	char authority[256];
	BYTE aLen;
	char servername[128];
	char servername_fqn[256];
	DWORD dns[MAX_SERVERS];
	DWORD tservers[MAX_SERVERS];
	DWORD listenServers[MAX_SERVERS];
	DWORD servers[MAX_SERVERS];
	DWORD serverMasks[MAX_SERVERS];
	DWORD zoneServers[MAX_SERVERS];
	DWORD mask;
	DWORD network;
	DWORD lease;
	DWORD serial;
	DWORD refresh;
	DWORD retry;
	DWORD expire;
	DWORD minimum;
	time_t expireTime;
	SOCKET maxFD;
	data6 dnsRoutes[32];
	data12 dnsRanges[32];
	data13 dhcpRanges[32];
	DWORD rangeStart;
	DWORD rangeEnd;
	DWORD routers[MAX_SERVERS];
	WORD dhcpIndex;
	BYTE globalOptions[sizeof(dhcp_packet) - sizeof(dhcp_header)];
	BYTE currentDNS;
	BYTE queriesFailed;
	BYTE logLevel;
	BYTE authorized;
	BYTE replication;
};

struct data4
{
	char op_name[40];
	BYTE op_code;
	BYTE op_size;
};

struct data15
{
	union
	{
		DWORD ip;
		BYTE octate[4];
	};
};

⌨️ 快捷键说明

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