c語言dns
A. dns是什麼意思啊
一、簡述dns
DNS(domain name system)域名系統或者(domain named system)區域名稱服務,分為正向與反向域名解析,適用C/S,埠路53/udp,53/tcp,屬於應用層協議;
作用:人得記憶有限,如果沒有dns得記下多少IP地址;從網路來說由於tcp/ip協議族是基於ip地址,所以需要一個翻譯器即DNS;可以1對多也可以多對1,那麼正向解析即域名解析為ip地址,反向解析即ip地址解析為域名。有人說DNS就是一個本大得電話本,說的挺貼切。
正反向解析事兩個不同得名稱空間,是兩顆不同得解析樹;
正向:ip---》主機名
反向:主機名---》ip
當今得業界標准BIND(berkeley internet name domain)dns軟體
二、DNS域名
1)DNS是一個倒掛樹結構示意圖如下
1、在瀏覽器中輸入www..com域名,操作系統會先檢查自己本地的hosts文件是否有這個網址映射關系,如果有,就先調用這個ip地址映射,完成域名解析。
2、如果hosts里沒有這個域名的映射,則會查找本地DNS解析器緩存,是否有這個網址映射關系,如果有,直接返回,完成域名解析。
3、如果hosts與本地DNS解析器緩存都沒有相應的網址映射關系,首先會找TCP/IP參數中設置的首選DNS伺服器,在此我們叫它本地DNS伺服器,此伺服器收到查詢時,如果要查詢的域名,包含在本地配置區域資源中,則返回解析記過給客戶端,完成域名解析,此解析具有權威性。
4、如果要查詢域名,不由本地DNS伺服器區域解析,但該伺服器已緩存了此網址映射關系,則調用這個IP地址映射,完成域名解析,此解析不具有權威性。
5、如果本地DNS伺服器本地區域文件與緩存解析都失效,則根據本地DNS伺服器的設置(是否設置轉發器)進行查詢,如果未用轉發模式,本地DNS就把請求發至13台根DNS,根DNS伺服器收到請求後會判斷這個域名(.com)是誰來授權管理,並會返回一個負責該頂級域名伺服器的一個IP。本地DNS伺服器收到IP信息後,將會聯系負責.com域的這台伺服器。這台負責.com域的伺服器收到請求後,如果自己無法解析,它就會找一個管理.com域的下一級DNS伺服器地址(.com)給本地DNS伺服器。當本地DNS伺服器收到這個地址後,就會找.com域伺服器,重復上面的動作,進行查詢,直至找到www..com主機。
6、如果用的是轉發模式,此DNS伺服器就會把請求轉發至上一級DNS伺服器,由上一級伺服器進行解析,上一級伺服器如果不能解析,或找根DNS或把請求轉至上上級,以此循環。不管是本地DNS伺服器用是轉發,還是根提示,最後都是把結果返回給本地DNS伺服器,由此DNS伺服器再返回給客戶機。
B. 怎麼用c或者c++代碼獲取默認DNS伺服器的ip
這里的代碼可以列印出電腦默認的DNS伺服器
#pragmawarning(disable:4996)
#include<stdio.h>
#include<WinSock2.h>
#include<iphlpapi.h>
#pragmacomment(lib,"IPHLPAPI.lib")
#pragmacomment(lib,"ws2_32.lib")
intmain()//獲取本地主機名、域名和DNS伺服器信息
{
//聲明變數
FIXED_INFO*FixedInfo;//定義保存本地計算機網路參數信息的結構體指針
ULONGulOutBufLen;//保存獲取到的本地計算機網路參數信息結構體鏈表的長度
DWORDdwRetVal;//調用GetNetworkParams()函數的返回值
IP_ADDR_STRING*pIPAddr;//保存所有DNS伺服器的IP地址列表
FixedInfo=(FIXED_INFO*)GlobalAlloc(GPTR,sizeof(FIXED_INFO));//為FixedInfo結構體分配內存空間
ulOutBufLen=sizeof(FIXED_INFO);//初始化ulOutBufLen變數值
//第1次調用GetNetworkParams()函數,獲取返回結果的大小到ulOutBufLen中
if(ERROR_BUFFER_OVERFLOW==GetNetworkParams(FixedInfo,&ulOutBufLen))
{
GlobalFree(FixedInfo);
FixedInfo=(FIXED_INFO*)GlobalAlloc(GPTR,ulOutBufLen);
}
//第2次調用GetNetworkParams()函數,以前面獲取的ulOutBufLen作為參數,
if(dwRetVal=GetNetworkParams(FixedInfo,&ulOutBufLen)!=ERROR_SUCCESS)
{
printf("調用GetNetworkParams()函數失敗。返回值:%08x ",dwRetVal);
}
else
{
printf(" DNS伺服器列表: ");
printf("%s ",FixedInfo->DnsServerList.IpAddress.String);
pIPAddr=FixedInfo->DnsServerList.Next;
while(pIPAddr)
{
printf(" %s ",pIPAddr->IpAddress.String);
pIPAddr=pIPAddr->Next;
}
}
printf("按下回車鍵結束 ");
getchar();
return0;
}