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

📄 dualserver.cpp

📁 Combined DHCP/DNS Server. DHCP Server allots addresses and DNS Server first try resolving from DHCP
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	BYTE *xname = (BYTE*)query;
	BYTE *xraw = (BYTE*)raw;
	WORD retvalue = 0;
	while (true)
	{
		WORD size = *xraw;
		xraw++;
		if (!size)
		{
			break;
		}
		memcpy(xname, xraw, size);
		xname += size;
		xraw += size;
		retvalue += size;
		if (!*xraw)
			break;
		*xname = '.';
		retvalue++;
		xname++;
	}
	*xname = 0;
	retvalue += 2;

	//printf("%u\n",retvalue);
	return retvalue;
}

WORD qLen(char *query)
{
	WORD fullsize = 1;
	while (true)
	{
		char *i = strchr(query, '.');
		if (i != NULL)
		{
			int size = (DWORD)i - (DWORD)query;
			query += (size + 1);
			fullsize += (size + 1);
		}
		else
		{
			int size = strlen(query);
			if (size)
				fullsize += (size + 1);
			break;
		}
	}
	//printf("%i\n",fullsize);
	return fullsize;
}

WORD pQu(char *raw, char *query)
{
	WORD fullsize = 1;
	while (true)
	{
		char *i = strchr(query, '.');
		if (i != NULL)
		{
			int size = (DWORD)i - (DWORD)query;
			*raw = size;
			raw++;
			memcpy(raw, query, size);
			raw += size;
			query += (size + 1);
			fullsize += (size + 1);
		}
		else
		{
			int size = strlen(query);
			if (size)
			{
				*raw = size;
				raw++;
				strcpy(raw, query);
				fullsize += (size + 1);
			}
			break;
		}
	}
	//printf("%i\n",fullsize);
	return fullsize;
}

WORD fShort(char *raw)
{
	return ntohs(*(WORD*)raw);
}

DWORD fLong(char *raw)
{
	return ntohl(*(DWORD*)raw);
}

DWORD fIP(char *raw)
{
	return (*(DWORD*)raw);
}

BYTE pShort(char *raw, WORD data)
{
	*((WORD*)raw) = htons(data);
	return 2;
}

BYTE pLong(char *raw, DWORD data)
{
	*((DWORD*)raw) = htonl(data);
	return 4;
}

BYTE pIP(char *raw, DWORD data)
{
	*((DWORD*)raw) = data;
	return 4;
}

WORD fShort(BYTE *raw)
{
	return ntohs(*(WORD*)raw);
}

DWORD fLong(BYTE *raw)
{
	return ntohl(*(DWORD*)raw);
}

DWORD fIP(BYTE *raw)
{
	return (*(DWORD*)raw);
}

BYTE pShort(BYTE *raw, WORD data)
{
	*((WORD*)raw) = htons(data);
	return 2;
}

BYTE pLong(BYTE *raw, DWORD data)
{
	*((DWORD*)raw) = htonl(data);
	return 4;
}

BYTE pIP(BYTE *raw, DWORD data)
{
	*((DWORD*)raw) = data;
	return 4;
}

void addRRExt(data5 *req)
{
	WORD xid = req->dnsp->header.xid;

	if (strcasecmp(req->cname, req->query))
	{
		dnsPacket *packet;

		if (req->cache.response)
			packet = (dnsPacket*)req->cache.response;
		else
		{
			packet = (dnsPacket*)malloc(req->bytes);
			memcpy(packet, req->dnsp, req->bytes);
		}

		req->dnsp->header.aa = 0;
		req->dnsp->header.at = 0;
		req->dnsp->header.qdcount = htons(1);
		req->dnsp->header.ancount = htons(1);

		//manuplate the response
		req->data = &req->dnsp->data;
		req->data += pQu(req->data, req->query);
		req->data += pShort(req->data, DNS_TYPE_A);
		req->data += pShort(req->data, DNS_CLASS_IN);
		req->data += pQu(req->data, req->query);
		req->data += pShort(req->data, DNS_TYPE_CNAME);
		req->data += pShort(req->data, DNS_CLASS_IN);
		req->data += pLong(req->data, cfig.lease);
		req->data += pShort(req->data, qLen(req->cname));
		req->data += pQu(req->data, req->cname);

		char *dp = &packet->data;

		for (int i = 1; i <= ntohs(packet->header.qdcount); i++)
		{
			dp += fQu(req->cname, packet, dp);
			dp += 4;
		}

		WORD dl = 0;
		for (int i = 1; i <= ntohs(packet->header.ancount); i++)
		{
			dp += fQu(req->cname, packet, dp);
			req->data += pQu(req->data, req->cname);
			memcpy(req->data, dp, 8);
			req->data += 8;
			int type = fShort(dp);
			dp += 2; //type
			dp += 2; //class
			dp += 4; //ttl
			WORD zLen = fShort(dp);
			dp += 2; //datalength

			switch (type)
			{
				case DNS_TYPE_A:
					req->data += pShort(req->data, zLen);
					req->data += pLong(req->data, fLong(dp));
					break;
				case DNS_TYPE_CNAME:
					fQu(req->cname, packet, dp);
					dl = pQu(req->data + 2, req->cname);
					req->data += pShort(req->data, dl);
					req->data += dl;
					break;
			}
			dp += zLen;
			req->dnsp->header.ancount = htons(htons(req->dnsp->header.ancount) + 1);
		}

		if (!req->cache.response)
			free(packet);

		req->bytes = (DWORD)req->data - (DWORD)req->raw;

	}
	else if (req->cache.response)
	{
		memcpy(req->dnsp, req->cache.response, req->cache.bytes);
		req->dnsp->header.xid = xid;
		req->bytes = req->cache.bytes;
	}
};

void addRRA(data5 *req)
{
	if (strcasecmp(req->query, req->cname))
	{
		req->dnsp->header.ancount = htons(htons(req->dnsp->header.ancount) + 1);
		req->data += pQu(req->data, req->query);
		req->data += pShort(req->data, DNS_TYPE_CNAME);
		req->data += pShort(req->data, DNS_CLASS_IN);
		req->data += pLong(req->data, cfig.lease);
		req->data += pShort(req->data, qLen(req->cname));
		req->data += pQu(req->data, req->cname);
	}

	for (;req->iterBegin != dnsCache[cacheInd].end(); req->iterBegin++)
	{
		data7 *cache = req->iterBegin->second;

		if (strcasecmp(cache->mapname, req->mapname))
			break;

		if (cache->ip)
		{
			req->dnsp->header.ancount = htons(htons(req->dnsp->header.ancount) + 1);
			req->data += pQu(req->data, req->cname);
			req->data += pShort(req->data, DNS_TYPE_A);
			req->data += pShort(req->data, DNS_CLASS_IN);

			if (cache->expiry == LONG_MAX)
				req->data += pLong(req->data, cfig.lease);
			else
				req->data += pLong(req->data, (cache->expiry - time(NULL)));

			req->data += pShort(req->data, 4);
			req->data += pIP(req->data, cache->ip);
		}
	}
	req->bytes = (DWORD)req->data - (DWORD)req->raw;
}

void addRRPtr(data5 *req)
{
	for (;req->iterBegin != dnsCache[cacheInd].end(); req->iterBegin++)
	{
		data7 *cache = req->iterBegin->second;

		if (strcasecmp(cache->mapname, req->mapname))
			break;

		req->data += pQu(req->data, req->query);
		req->data += pShort(req->data, DNS_TYPE_PTR);
		req->data += pShort(req->data, DNS_CLASS_IN);
		req->dnsp->header.ancount = htons(htons(req->dnsp->header.ancount) + 1);

		if (cache->expiry == LONG_MAX)
			req->data += pLong(req->data, cfig.lease);
		else
			req->data += pLong(req->data, (cache->expiry - time(NULL)));

		if (!strchr(cache->hostname, '.'))
			sprintf(req->cname, "%s.%s", cache->hostname, cfig.zone);
		else
			strcpy(req->cname, cache->hostname);

		req->data += pShort(req->data, qLen(req->cname));
		req->data += pQu(req->data, req->cname);
	}
	req->bytes = (DWORD)req->data - (DWORD)req->raw;
}

void addRRServerA(data5 *req)
{
	if (strcasecmp(req->query, req->cname))
	{
		req->dnsp->header.ancount = htons(htons(req->dnsp->header.ancount) + 1);
		req->data += pQu(req->data, req->query);
		req->data += pShort(req->data, DNS_TYPE_CNAME);
		req->data += pShort(req->data, DNS_CLASS_IN);
		req->data += pLong(req->data, cfig.lease);
		req->data += pShort(req->data, qLen(req->cname));
		req->data += pQu(req->data, req->cname);
	}

	req->dnsp->header.ancount = htons(htons(req->dnsp->header.ancount) + 1);
	req->data += pQu(req->data, req->cname);
	req->data += pShort(req->data, DNS_TYPE_A);
	req->data += pShort(req->data, DNS_CLASS_IN);
	req->data += pLong(req->data, cfig.lease);
	req->data += pShort(req->data, 4);
	req->data += pIP(req->data, cfig.dnsUdpConn[req->sockInd].server);

	for (;req->iterBegin != dnsCache[cacheInd].end(); req->iterBegin++)
	{
		data7 *cache = req->iterBegin->second;

		if (strcasecmp(cache->mapname, req->mapname))
			break;

		if (cache->ip && cache->ip != cfig.dnsUdpConn[req->sockInd].server)
		{
			req->dnsp->header.ancount = htons(htons(req->dnsp->header.ancount) + 1);
			req->data += pQu(req->data, req->cname);
			req->data += pShort(req->data, DNS_TYPE_A);
			req->data += pShort(req->data, DNS_CLASS_IN);
			req->data += pLong(req->data, cfig.lease);
			req->data += pShort(req->data, 4);
			req->data += pIP(req->data, cache->ip);
		}
	}
	req->bytes = (DWORD)req->data - (DWORD)req->raw;
}

void addRRLocalhostA(data5 *req)
{
	if (strcasecmp(req->query, req->mapname))
	{
		req->dnsp->header.ancount = htons(htons(req->dnsp->header.ancount) + 1);
		req->data += pQu(req->data, req->query);
		req->data += pShort(req->data, DNS_TYPE_CNAME);
		req->data += pShort(req->data, DNS_CLASS_IN);
		req->data += pLong(req->data, cfig.lease);
		req->data += pShort(req->data, qLen(req->mapname));
		req->data += pQu(req->data, req->mapname);
	}

	req->dnsp->header.ancount = htons(htons(req->dnsp->header.ancount) + 1);
	req->data += pQu(req->data, req->mapname);
	req->data += pShort(req->data, DNS_TYPE_A);
	req->data += pShort(req->data, DNS_CLASS_IN);
	req->data += pLong(req->data, cfig.lease);
	req->data += pShort(req->data, 4);
	req->data += pIP(req->data, req->cache.ip);
	req->bytes = (DWORD)req->data - (DWORD)req->raw;
}

void addRRLocalhostPtr(data5 *req)
{
	req->data += pQu(req->data, req->query);
	req->data += pShort(req->data, DNS_TYPE_PTR);
	req->data += pShort(req->data, DNS_CLASS_IN);
	req->dnsp->header.ancount = htons(1);
	req->data += pLong(req->data, cfig.lease);
	req->data += pShort(req->data, qLen(req->cache.hostname));
	req->data += pQu(req->data, req->cache.hostname);
	req->bytes = (DWORD)req->data - (DWORD)req->raw;
}

void addRRMX(data5 *req)
{
	for (;req->iterBegin != dnsCache[cacheInd].end(); req->iterBegin++)
	{
		data7 *cache = req->iterBegin->second;

		if (strcasecmp(cache->mapname, req->mapname))
			break;

		if (cache->dataType == MX)
		{
			req->data += pQu(req->data, req->query);
			req->data += pShort(req->data, DNS_TYPE_MX);
			req->data += pShort(req->data, DNS_CLASS_IN);
			req->dnsp->header.ancount = htons(htons(req->dnsp->header.ancount) + 1);
			req->data += pLong(req->data, cfig.lease);

			if (!strchr(cache->hostname, '.'))
				sprintf(req->cname, "%s.%s", cache->hostname, cfig.zone);
			else
				strcpy(req->cname, cache->hostname);

			req->data += pShort(req->data, qLen(req->cname) + 2);
			req->data += pShort(req->data, cache->mailPref);
			req->data += pQu(req->data, req->cname);
		}
	}
	req->bytes = (DWORD)req->data - (DWORD)req->raw;
}

void addRRNSA(data5 *req)
{
	if (cfig.authorized && cfig.expireTime > time(NULL))
	{
		req->dnsp->header.at = 1;
		req->dnsp->header.aa = 1;
		req->dnsp->header.ancount = htons(htons(req->dnsp->header.ancount) + 1);

		req->data += pQu(req->data, cfig.zone);
		req->data += pShort(req->data, DNS_TYPE_NS);
		req->data += pShort(req->data, DNS_CLASS_IN);

		if (cfig.expire >= LONG_MAX)
			req->data += pLong(req->data, LONG_MAX);
		else
			req->data += pLong(req->data, cfig.expire);

		req->data += pShort(req->data, qLen(cfig.servername_fqn));
		req->data += pQu(req->data, cfig.servername_fqn);

		req->data += pQu(req->data, cfig.servername_fqn);
		req->data += pShort(req->data, DNS_TYPE_A);
		req->data += pShort(req->data, DNS_CLASS_IN);

		if (cfig.expire >= LONG_MAX)
			req->data += pLong(req->data, LONG_MAX);
		else
			req->data += pLong(req->data, cfig.expire);

		req->data += pShort(req->data, 4);
		req->data += pIP(req->data, cfig.dnsUdpConn[req->sockInd].server);
	}
	req->bytes = (DWORD)req->data - (DWORD)req->raw;
}

void addRRNSPtr(data5 *req)
{
	if (cfig.authorized && cfig.expireTime > time(NULL))
	{
		req->dnsp->header.at = 1;
		req->dnsp->header.aa = 1;
		req->dnsp->header.ancount = htons(htons(req->dnsp->header.ancount) + 1);

		req->data += pQu(req->data, cfig.authority);
		req->data += pShort(req->data, DNS_TYPE_NS);
		req->data += pShort(req->data, DNS_CLASS_IN);

		if (cfig.expire >= LONG_MAX)
			req->data += pLong(req->data, LONG_MAX);
		else
			req->data += pLong(req->data, cfig.expire);

		req->data += pShort(req->data, qLen(cfig.servername_fqn));
		req->data += pQu(req->data, cfig.servername_fqn);

		req->data += pQu(req->data, cfig.servername_fqn);
		req->data += pShort(req->data, DNS_TYPE_A);
		req->data += pShort(req->data, DNS_CLASS_IN);

		if (cfig.expire >= LONG_MAX)
			req->data += pLong(req->data, LONG_MAX);
		else
			req->data += pLong(req->data, cfig.expire);

		req->data += pShort(req->data, 4);
		req->data += pIP(req->data, cfig.dnsUdpConn[req->sockInd].server);
	}
	req->bytes = (DWORD)req->data - (DWORD)req->raw;
}

void addRRSOA(data5 *req)
{
	if (cfig.authorized)
	{
		req->dnsp->header.at = 1;
		req->dnsp->header.aa = 1;
		req->dnsp->header.ancount = htons(htons(req->dnsp->header.ancount) + 1);

		req->data += pQu(req->data, req->query);
		req->data += pShort(req->data, DNS_TYPE_SOA);
		req->data += pShort(req->data, DNS_CLASS_IN);
		req->data += pLong(req->data, cfig.lease);
		char *data = req->data;

⌨️ 快捷键说明

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