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

📄 intotodns.c

📁 Linux下DHCP Client的实现。
💻 C
字号:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <fcntl.h>	//for O_RDWR,open
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/ioctl.h>
#include <sys/poll.h>	//for poll
#include <linux/if.h>	//for ifreq
#include <linux/route.h>
#include <unistd.h>

#include <stdint.h>
#include "IntotoDNS.h"

#ifndef __WAG302TYPE_H__
#define TRUE 1
#define FALSE 0
#endif

typedef uint32_t bool_t;
bool_t  IsValidIP(in_addr_t ulIP);

///////////////////////////////////////////////////////////////////////////////
// domain name server (DNS)
///////////////////////////////////////////////////////////////////////////////
static bool_t IntotoExchangeUdpMsg(
	uint16_t	usPort,
	void		*pMsg,
	uint32_t	ulSize,
	bool_t		bExpectResp
	)
{
	int	iSockFd	= socket(AF_INET,SOCK_DGRAM,0);

	if (iSockFd>=0)
	{
		int	iSendBytes = 0;
		struct sockaddr_in	sin = {0};

		sin.sin_family		= AF_INET;
		sin.sin_port		= htons(usPort);
		sin.sin_addr.s_addr	= INADDR_LOOPBACK;

		iSendBytes = sendto(iSockFd, pMsg, ulSize,
			MSG_DONTROUTE, (struct sockaddr*)&sin, sizeof(sin));

		if (iSendBytes==ulSize && bExpectResp)
		{
			fd_set			RcvFdSet;
			struct timeval	timeout = {0};
			struct sockaddr sockFrom = {0};
			int				iSockFromLen = 0;

			FD_ZERO(&RcvFdSet);
			FD_SET(iSockFd, &RcvFdSet);
			timeout.tv_sec = 2; //seconds
			select(iSockFd + 1, &RcvFdSet, NULL, NULL, &timeout);
			iSendBytes = (FD_ISSET(iSockFd, &RcvFdSet))?
				recvfrom(iSockFd, pMsg, ulSize, 0, &sockFrom, &iSockFromLen): -1;
		}

		close(iSockFd);
		if (iSendBytes != ulSize)
		{
			printf("IntotoExchangeUdpMsg fail port:%d SendBytes:%d ulSize:%d!\n",
				usPort, iSendBytes, ulSize);
		}
		return iSendBytes == ulSize;
	}
	printf("IntotoExchangeUdpMsg fail port:%d!\n", usPort);
	return FALSE;
}

#define	DNSRD_SUPPORT
#define DNSRD_LOOPBACK_PORT_NUM_START         65097 
#ifdef DNSRD_SUPPORT
#define DNSRD_LOOPBACK_PORT        (DNSRD_LOOPBACK_PORT_NUM_START + 0 )
#define DNSRD_LOCAL_PORT           (DNSRD_LOOPBACK_PORT_NUM_START + 1 )
#endif /*DNSRD_SUPPORT*/
bool_t IntotoStaticNameServerAdd(in_addr_t ulIP)
{
	DNSRDCntrlMsg_t  DnsMsg = {0};

	DnsMsg.CmdType				= DNSRD_ADD_NAME_SERVER;
	DnsMsg.Cmd.Server.ServerIp	= ulIP;
	DnsMsg.Cmd.Server.uiFlags	= DNSRD_ADMIN_CONFIG;

	return IntotoExchangeUdpMsg(DNSRD_LOOPBACK_PORT, &DnsMsg, sizeof(DnsMsg), TRUE);
}

static bool_t IntotoStaticNameServerRemove(in_addr_t ulIP)
{
	DNSRDCntrlMsg_t  DnsMsg = {0};

	DnsMsg.CmdType				= DNSRD_DROP_NAME_SERVER;
	DnsMsg.Cmd.Server.ServerIp	= ulIP;
	DnsMsg.Cmd.Server.uiFlags	= DNSRD_ADMIN_CONFIG;

	return IntotoExchangeUdpMsg(DNSRD_LOOPBACK_PORT, &DnsMsg, sizeof(DnsMsg), TRUE);
}

void IntotoStaticNameServerRemoveAll(void)
{
#define	T_SUCCESS	0
	DNSRDCntrlMsg_t  DnsList = {0};
	DNSServer_t		 *pServers = DnsList.Cmd.CmdServList.servers;

	DnsList.CmdType	= DNSRD_GET_SERVER_LIST;
	if (IntotoExchangeUdpMsg(DNSRD_LOOPBACK_PORT, &DnsList, sizeof(DnsList),TRUE)
		&& T_SUCCESS==DnsList.CmdType)
	{
		uint32_t	ulCount = DnsList.Cmd.CmdServList.srvrcnt;
		while (ulCount-->0)
		{
			//if (DNSRD_ADMIN_CONFIG==pServers[ulCount].uiFlags)
			//{
				// Remove it.
				IntotoStaticNameServerRemove(pServers[ulCount].ServerIp);
			//}
		}
	}
}

bool_t IntotoStaticNameServerUpdate(
	in_addr_t	inDnsPrimary,
	in_addr_t	inDnsSecondary
	)
{
	IntotoStaticNameServerRemoveAll();
	if (IsValidIP(inDnsPrimary))
	{
		IntotoStaticNameServerAdd(inDnsPrimary);
	}
	if (IsValidIP(inDnsSecondary))
	{
		IntotoStaticNameServerAdd(inDnsSecondary);
	}
	return TRUE;
}

⌨️ 快捷键说明

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