亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? dns.c

?? 單片機c語言程序設計100例--基于PIC+PROTEUS
?? C
字號:
/*********************************************************************
 *
 *	DNS Client Module for Microchip TCP/IP Stack
 *	 -Provides DNS resolution (client)
 *
 *********************************************************************
 * FileName:        DNS.c
 * Dependencies:    UDP, ARP, Tick
 * Processor:       PIC18, PIC24F, PIC24H, dsPIC30F, dsPIC33F
 * Complier:        Microchip C18 v3.02 or higher
 *					Microchip C30 v2.01 or higher
 * Company:         Microchip Technology, Inc.
 *
 * Software License Agreement
 *
 * This software is owned by Microchip Technology Inc. ("Microchip") 
 * and is supplied to you for use exclusively as described in the 
 * associated software agreement.  This software is protected by 
 * software and other intellectual property laws.  Any use in 
 * violation of the software license may subject the user to criminal 
 * sanctions as well as civil liability.  Copyright 2006 Microchip
 * Technology Inc.  All rights reserved.
 *
 * This software is provided "AS IS."  MICROCHIP DISCLAIMS ALL 
 * WARRANTIES, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, NOT LIMITED 
 * TO MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND 
 * INFRINGEMENT.  Microchip shall in no event be liable for special, 
 * incidental, or consequential damages.
 *
 *
 * Author               Date    Comment
 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * Howard Schlunder     7/31/06	Original
 ********************************************************************/
#define THIS_IS_DNS

#include "..\Include\Compiler.h"
#include "..\Include\UDP.h"
#include "..\Include\Tick.h"
#include "..\Include\ARP.h"
#include "..\Include\ARPTsk.h"
#include "..\Include\DNS.h"
#include "..\Include\Helpers.h"

#if defined(STACK_USE_DNS)

#define DNS_PORT		53
#define DNS_TIMEOUT		(TICK_SECOND*2)


static BYTE *DNSHostName;
static enum
{
	DNS_HOME = 0,
	DNS_RESOLVE_ARP,
	DNS_OPEN_SOCKET,
	DNS_QUERY,
	DNS_GET_RESULT,
	DNS_DONE
} smDNS = DNS_DONE;

typedef struct _DNS_HEADER
{
	WORD_VAL TransactionID;
	WORD_VAL Flags;
	WORD_VAL Questions;
	WORD_VAL Answers;
	WORD_VAL AuthoritativeRecords;
	WORD_VAL AdditionalRecords;
} DNS_HEADER;

typedef struct _DNS_ANSWER_HEADER
{
	WORD_VAL	ResponseName;
	WORD_VAL	ResponseType;
	WORD_VAL	ResponseClass;
	DWORD_VAL	ResponseTTL;
	WORD_VAL	ResponseLen;
} DNS_ANSWER_HEADER;

static void DNSPutString(BYTE *String);
static void DNSGetString(BYTE *String);

/*********************************************************************
 * Function:        void DNSResolve(BYTE *Hostname)
 *
 * PreCondition:    Stack is initialized()
 *
 * Input:           *Hostname: Null terminated string specifying the 
 *							   host address to resolve to an IP 
 *							   address.
 *
 * Output:          None
 *
 * Side Effects:    None
 *
 * Overview:        Call DNSIsResolved() until the host is resolved.
 *
 * Note:            A UDP socket must be available before this 
 *					function is called.  It is freed at the end of 
 *					the resolution.  MAX_UDP_SOCKETS may need to be 
 *					increased if other modules use UDP sockets.
 *
 *					You must not modify *Hostname until DNSIsResolved() 
 *					returns TRUE.
 ********************************************************************/
void DNSResolve(BYTE *Hostname)
{
	DNSHostName = Hostname;
	smDNS = DNS_HOME;
}


/*********************************************************************
 * Function:        BOOL DNSIsResolved(IP_ADDR *HostIP)
 *
 * PreCondition:    DNSResolve() was called.
 *
 * Input:           HostIP: Pointer to IP_ADDR structure to store the 
 *							returned host IP address when DNS 
 *							resolution is complete.
 *
 * Output:          *HostIP, 4 byte IP address
 *
 * Side Effects:    None
 *
 * Overview:        Call DNSIsResolved() until the host is resolved.
 *
 * Note:            You cannot start two DNS resolution proceedures 
 *					concurrently.
 *
 *					You must not modify *Hostname until DNSIsResolved() 
 *					returns TRUE.
 ********************************************************************/
BOOL DNSIsResolved(IP_ADDR *HostIP)
{
	static UDP_SOCKET	MySocket;
	static NODE_INFO	Remote;
	static TICK			StartTime;
	BYTE 				i;
	WORD_VAL			w;
	DNS_HEADER			DNSHeader;
	DNS_ANSWER_HEADER	DNSAnswerHeader;

	switch(smDNS)
	{
		case DNS_HOME:
			ARPResolve(&AppConfig.PrimaryDNSServer);
			StartTime = TickGet();
			smDNS++;
			break;
		case DNS_RESOLVE_ARP:
			if(!ARPIsResolved(&AppConfig.PrimaryDNSServer, &Remote.MACAddr))
			{
				if(TickGet() - StartTime > DNS_TIMEOUT)
				{
					smDNS--;
				}
				break;
			}
			Remote.IPAddr.Val = AppConfig.PrimaryDNSServer.Val;
			smDNS++;
			// No need to break, we can immediately start resolution

		case DNS_OPEN_SOCKET:
			MySocket = UDPOpen(0, &Remote, DNS_PORT);
			if(MySocket == INVALID_UDP_SOCKET)
				break;

			smDNS++;
			// No need to break, we can immediately start resolution
			
		case DNS_QUERY:
			if(!UDPIsPutReady(MySocket))
				break;
			
			// Put DNS query here
			UDPPut(0x12);		// User chosen ID
			UDPPut(0x34);
			UDPPut(0x01);		// Standard query with recursion
			UDPPut(0x00);	
			UDPPut(0x00);		// 0x0001 questions
			UDPPut(0x01);
			UDPPut(0x00);		// 0x0000 answers
			UDPPut(0x00);
			UDPPut(0x00);		// 0x0000 name server resource records
			UDPPut(0x00);
			UDPPut(0x00);		// 0x0000 additional records
			UDPPut(0x00);

			// Put hostname string to resolve
			DNSPutString(DNSHostName);

			UDPPut(0x00);		// Type: A (host address)
			UDPPut(0x01);
			UDPPut(0x00);		// Class: IN (Internet)
			UDPPut(0x01);

			UDPFlush();
			StartTime = TickGet();
			smDNS++;
			break;

		case DNS_GET_RESULT:
			if(!UDPIsGetReady(MySocket))
			{
				if(TickGet() - StartTime > DNS_TIMEOUT)
				{
					smDNS--;
				}
				break;
			}

			// Retrieve the DNS header and de-big-endian it
			UDPGet(&DNSHeader.TransactionID.v[1]);
			UDPGet(&DNSHeader.TransactionID.v[0]);
			UDPGet(&DNSHeader.Flags.v[1]);
			UDPGet(&DNSHeader.Flags.v[0]);
			UDPGet(&DNSHeader.Questions.v[1]);
			UDPGet(&DNSHeader.Questions.v[0]);
			UDPGet(&DNSHeader.Answers.v[1]);
			UDPGet(&DNSHeader.Answers.v[0]);
			UDPGet(&DNSHeader.AuthoritativeRecords.v[1]);
			UDPGet(&DNSHeader.AuthoritativeRecords.v[0]);
			UDPGet(&DNSHeader.AdditionalRecords.v[1]);
			UDPGet(&DNSHeader.AdditionalRecords.v[0]);

			// Remove all questions
			while(DNSHeader.Questions.Val--)
			{
				DNSGetString(NULL);
				UDPGet(&w.v[1]);		// Question type
				UDPGet(&w.v[0]);
				UDPGet(&w.v[1]);		// Question class
				UDPGet(&w.v[0]);
			}
			
			// Scan through answers
			while(DNSHeader.Answers.Val--)
			{
				UDPGet(&DNSAnswerHeader.ResponseName.v[1]);		// Response name
				UDPGet(&DNSAnswerHeader.ResponseName.v[0]);
				UDPGet(&DNSAnswerHeader.ResponseType.v[1]);		// Response type
				UDPGet(&DNSAnswerHeader.ResponseType.v[0]);
				UDPGet(&DNSAnswerHeader.ResponseClass.v[1]);	// Response class
				UDPGet(&DNSAnswerHeader.ResponseClass.v[0]);
				UDPGet(&DNSAnswerHeader.ResponseTTL.v[3]);		// Time to live
				UDPGet(&DNSAnswerHeader.ResponseTTL.v[2]);
				UDPGet(&DNSAnswerHeader.ResponseTTL.v[1]);
				UDPGet(&DNSAnswerHeader.ResponseTTL.v[0]);
				UDPGet(&DNSAnswerHeader.ResponseLen.v[1]);		// Response length
				UDPGet(&DNSAnswerHeader.ResponseLen.v[0]);

				// Make sure that this is a 4 byte IP address, response type A, class 1
				// Check if this is Type A
				if(	DNSAnswerHeader.ResponseType.Val	== 0x0001 && 
					DNSAnswerHeader.ResponseClass.Val	== 0x0001 && // Internet class
					DNSAnswerHeader.ResponseLen.Val		== 0x0004)
				{
					UDPGet(&HostIP->v[0]);
					UDPGet(&HostIP->v[1]);
					UDPGet(&HostIP->v[2]);
					UDPGet(&HostIP->v[3]);
					break;
				}
				else
				{
					while(DNSAnswerHeader.ResponseLen.Val--)
					{
						UDPGet(&i);
					}
				}
			}

			UDPDiscard();
			UDPClose(MySocket);
			MySocket = INVALID_UDP_SOCKET;
			smDNS++;
			// No need to break, we are done and need to return TRUE

		case DNS_DONE:
			return TRUE;
	}
	
	return FALSE;
}

static void DNSPutString(BYTE *String)
{
	BYTE *RightPtr;
	BYTE i;
	BYTE Len;

	RightPtr = String;

	while(1)
	{
		do
		{
			i = *RightPtr++;
		} while((i != 0x00) && (i != '.') && (i != '/'));
	
		// Put the length parameter
		Len = (BYTE)(RightPtr-String-1);
		UDPPut(Len);
		while(Len--)
		{
			UDPPut(*String++);
		}
		if(i == 0x00 || i == '/')
			break;

		// Skip over the '.' in the input string
		String++;
	}
	
	// Put the string terminator character
	UDPPut(0x00);
}

static void DNSGetString(BYTE *String)
{
	BYTE i;
	BYTE j;

	if(String == NULL)
	{
		UDPGet(&i);
		while(i)
		{
			while(i--)
			{
				UDPGet(&j);
			}
			UDPGet(&i);
		}
	}
	else
	{
		UDPGet(&i);
		while(i)
		{
			while(i--)
			{
				UDPGet(String);
				String++;
			}
			UDPGet(&i);
		}
	}
}


#endif	//#if defined(STACK_USE_DNS)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲午夜视频在线| 91丝袜呻吟高潮美腿白嫩在线观看| 成人一区二区在线观看| 国产精品婷婷午夜在线观看| 99久久777色| 日韩福利电影在线| 国产日韩欧美激情| 日本二三区不卡| 国模少妇一区二区三区| 亚洲综合丝袜美腿| 久久影音资源网| 99国产精品久久久久| 9191成人精品久久| 亚洲精品国产一区二区精华液| 天天综合天天综合色| 日韩一区二区三区四区 | 777精品伊人久久久久大香线蕉| 色婷婷综合视频在线观看| 日韩中文字幕av电影| 日本一区二区不卡视频| 91精品在线一区二区| 日韩三级.com| 欧美激情自拍偷拍| 亚洲精品伦理在线| 午夜欧美2019年伦理| 久久国内精品自在自线400部| 一区二区三区在线高清| 国产蜜臀97一区二区三区| 久久久久九九视频| 有码一区二区三区| 一级做a爱片久久| 蜜臀av亚洲一区中文字幕| 亚洲柠檬福利资源导航| 欧美激情一区二区三区不卡| 亚洲欧美日韩在线| 日本视频在线一区| 国产成人精品免费视频网站| 国产一区二区不卡老阿姨| 麻豆freexxxx性91精品| 国产v日产∨综合v精品视频| 韩国成人在线视频| 91老司机福利 在线| 日韩欧美国产一区二区三区| 欧美一区二区三区啪啪| 欧美一级欧美一级在线播放| 国产视频在线观看一区二区三区 | 26uuu久久综合| 亚洲免费成人av| 精品夜夜嗨av一区二区三区| 麻豆精品新av中文字幕| 95精品视频在线| 精品福利一二区| 国产日韩欧美综合一区| 亚洲一区二区三区精品在线| 国产精品456| www.综合网.com| 99视频精品免费视频| 在线成人小视频| 26uuu成人网一区二区三区| 亚洲影视资源网| 99精品视频一区二区三区| 欧美成人一区二区三区在线观看| 精品国产凹凸成av人网站| 亚洲综合激情另类小说区| 丰满白嫩尤物一区二区| 欧美成人综合网站| 亚洲chinese男男1069| 黄网站免费久久| 9191久久久久久久久久久| 亚洲综合色噜噜狠狠| 不卡av在线免费观看| 91精品国产黑色紧身裤美女| 夜夜亚洲天天久久| 91视频免费观看| 亚洲视频一区在线观看| 日本va欧美va欧美va精品| 国产iv一区二区三区| 精品久久久久香蕉网| 激情综合色播五月| 精品美女被调教视频大全网站| 青青草精品视频| 91精品国产综合久久精品性色 | 欧美午夜精品一区二区蜜桃| 久久精品国产第一区二区三区| 亚洲少妇中出一区| 尤物在线观看一区| 午夜免费欧美电影| 在线免费观看成人短视频| 91官网在线免费观看| 亚洲欧美偷拍三级| 欧美亚州韩日在线看免费版国语版| 亚洲三级免费电影| 欧美羞羞免费网站| 视频一区二区三区入口| 日韩西西人体444www| 麻豆久久久久久| 国产欧美日本一区视频| 99精品国产一区二区三区不卡| 亚洲永久精品大片| 日韩一区二区三免费高清| 国产制服丝袜一区| 亚洲欧美日韩国产综合| 欧美日产在线观看| 一区二区三区在线视频观看58 | 1024亚洲合集| 中文字幕一区二区三区在线观看 | 国产蜜臀97一区二区三区| 99久精品国产| 日韩电影免费在线| 精品欧美久久久| 国产成人精品免费看| 欧美激情一区二区三区蜜桃视频 | 精品影院一区二区久久久| 日韩欧美中文字幕一区| 奇米精品一区二区三区在线观看一 | 久久99久久精品欧美| 日韩欧美激情一区| 国产精品一区在线观看你懂的| 日韩一区二区三区视频在线观看| 国产成人免费9x9x人网站视频| 欧美国产综合一区二区| 91麻豆福利精品推荐| 亚洲国产精品久久久久婷婷884| 欧美老年两性高潮| 紧缚奴在线一区二区三区| 国产喂奶挤奶一区二区三区| av在线这里只有精品| 亚洲午夜免费电影| 精品免费日韩av| 欧美日韩视频在线一区二区| 中文字幕欧美三区| 欧美日韩午夜在线视频| 国产精选一区二区三区| 最新成人av在线| 欧美日韩卡一卡二| 高清国产午夜精品久久久久久| 亚洲欧美日韩一区二区| 精品91自产拍在线观看一区| www.成人网.com| 美女性感视频久久| 亚洲视频一区在线观看| 日韩欧美激情一区| 日本韩国一区二区三区视频| 久久99最新地址| 亚洲精品国产成人久久av盗摄| 国产精品三级视频| 欧美一级xxx| 在线欧美日韩国产| 国产一区二区福利| 日韩精品一级中文字幕精品视频免费观看 | 91美女蜜桃在线| 国产精品69毛片高清亚洲| 日韩精品亚洲专区| 亚洲色图制服丝袜| 欧美精品一区二区三区在线播放| 在线亚洲人成电影网站色www| 99国产精品99久久久久久| 国产剧情一区在线| 久久99精品国产91久久来源| 亚洲综合免费观看高清完整版在线| 国产亚洲成av人在线观看导航| 日韩一区二区三区高清免费看看| 91美女福利视频| 国产成人精品三级麻豆| 久久精品国产亚洲高清剧情介绍 | 精品成人私密视频| 国产视频一区二区在线| 日韩欧美电影在线| 在线播放亚洲一区| 欧美视频一区二区在线观看| 成人美女在线观看| 色av成人天堂桃色av| 99在线精品免费| gogo大胆日本视频一区| 福利视频网站一区二区三区| 国产不卡视频一区| 成人av影视在线观看| 波多野洁衣一区| jizz一区二区| 欧美日韩一区二区三区免费看| 91成人国产精品| 欧美日韩国产在线播放网站| 欧美伊人久久久久久久久影院| 欧美性色aⅴ视频一区日韩精品| 日韩视频一区在线观看| 日韩欧美的一区| 国产亚洲精品资源在线26u| 亚洲精品一区二区三区精华液| 日韩欧美成人午夜| 日韩欧美国产wwwww| 久久嫩草精品久久久久| 国产蜜臀97一区二区三区| 国产精品视频你懂的| 亚洲精品国久久99热| 婷婷开心激情综合| 国产一区二区三区精品视频| 在线观看视频一区| 欧美成人欧美edvon| 欧美激情一区二区三区蜜桃视频| 日韩一区欧美一区|