現在有很多朋友對于域名解析的語(yǔ)言域情況不是很了解,它??其實(shí)指的名解名解是把域名(′ω`*)轉化為對應的ip地址的過(guò)程,這個(gè)工作是析方析由dns服務(wù)器來(lái)完成的,這個(gè)過(guò)程其實(shí)并不是法(fa)樣很復雜ヽ(′ー`)ノ,但是流程很多朋友會(huì )對各種解析的方??式容易混淆,比如做c語(yǔ)言域名解析,語(yǔ)言域這個(gè)看起??來(lái)非常的名解名解抽象,不容易理解,析方析那么c語(yǔ)言域名解析方法是法樣怎樣的?域名解析的流程有哪些呢?下面新網(wǎng)(′ω`)就給大家詳細的來(lái)闡述一下。
c語(yǔ)言域名解析方法是流程怎樣的? typedef struct _DNSHEAD{ //dns 頭部 USH(⊙_⊙)ORT ID;&emsp??;&e??msp;USHORT tag; // dns 標志(參數) USHORT numQ; // 問(wèn)題數 USHORT numA; // 答案數 USHORT numA1; // 權威答案數 USHORT numA2; // 附加答案數&em┐(′д`)┌sp; }DnsHead; typedef struct _DNSQUERY //dns 查詢(xún)結構 { &ヽ(′▽?zhuān)?ノemsp;// char name[64];(′?ω?`) // //查詢(xún)的域名,這是一個(gè)大小在0到63之間的字符串; c語(yǔ)言域名解析 &ems(╯°□°)╯︵ ┻━┻p;USHORT type; //查詢(xún)類(lèi)型,大約有20個(gè)不同的語(yǔ)言域類(lèi)(′ω`)型 USHORT classes;&em??sp; //查詢(xún)類(lèi),通常是A類(lèi)既查詢(xún)IP地址。 &eヽ(′▽?zhuān)?ノmsp;}DnsQuery; #pragma comment(lib,名解名解"ws2_32.lib") // 初始化操作 bool initWSA(); &e??msp;//顯示錯誤 void displayErrWSA(char *str);&emsp??; //創(chuàng )建套接字 SOCKET CreateSocket(int type); //UDP sendto int MySendto(SOCKET sockTo, const char FAR * buf,int len,char *addr,USHORT port); //TCP 連接 bool MyConnect(???SOCKET s, char *addr,USHORT ); // UDP recvfrom int MyRecvFrom(SOCKET s, char FAR * buf,in(′▽?zhuān)?t len,charヽ(′?`)ノ *addr,US??HO??(???)RT port); //設置DNS 頭部 bool?? SetDNSHead(char *name,char *buf); int main(int arg,char *are[]) { &em??sp;int Result=0; char buf[1024]={ 0};&emsp??; char addr[16] = "61.187.72.8";// dns 服務(wù)器地址 char *name?? = 0; //要查詢(xún)的域名 (′?_?`) if ( !initWSA() )//初始化 { displ(°o°)ayErrWSA("i??nitWSA err!"); &(′ω`*)emsp;ret??urn 1; &emヽ(′▽?zhuān)?ノsp;}&e(╯°□°)╯msp; //創(chuàng )建套接字 SOCKET sockTo ; if ( (sockTo = Crea(?????)teSocket(SO(?_?;)CK_DG??RAM)) == 0) &ems??p;{ displayErrWSA("CreatSocket err!"); &e┐(′ー`)┌msp;r(′?_?`)eturn 1;&emsp( ?ヮ?); ??} while (1) { if (arg { char temp[1024]={ 0}; printf("\n請輸入要查詢(xún)的域名:"); scanf("%s",tem(′?`)p); if (temp[0] == 'q' ||temp[0] == 'Q??') &emsp??;{ break; } name = temp;&emsp(′?`*); } else&ヾ(′▽?zhuān)??emsp; { arg = 1; name = are[1]; } //設(′Д` )置dns 頭部 &(′_`)emsp;SetDNSHead(name,buf); &ems(′▽?zhuān)?p;//發(fā)送出去的請求數據長(cháng)度 int len = sizeof(DnsHead)+sizeof(DnsQuery)+strlen(na(T_T)me)+2;?? // for (int i =0;i // { // pri(°o°)ntf("x",(U??CHAR)buf[i]); // printf("x ",(UCHAR)buf[i+1]); // } //發(fā)送DNS 請求 if ( ( Result =MySendto(sockTo,buf,len,addr,53) ) { &emsp??; displayErrWSA("sendto err!"); continue;&(?????)emsp; } //接收應答&e??msp; if ( (Result =MyRecvFrom(s(′?ω?`)ockTo,b??uf,1024,addr,53) )&nbs??p; { &em(°o°)sp;&em???sp;display??ErrWSA("recvfr??om err!"); continue; } //簡(jiǎn)單的取得返回的 IP 地址( 收到的最后4字節 )&e(╬ ò﹏ó)msp; D??(′▽?zhuān)?nsHead *DnsH = (DnsHead *)buf; if (DnsH->numA == 0) { printf("無(wú)法解析 %s 的IP 地址。\n",析方析name); continue; } char *getIP =(char *)buf +Result - 4; printf("%s 的IP地址為: ",name)??; for (int Result= 0 ;Result { printf("%u.",(UCHAR )getIP[Resultヾ(′?`)?]); } printf("\n"); } ヽ(′ー`)ノ return 0; }&emsp(╬ ò﹏ó);&e??ms(?⊿?)p;// 初始??化操作 bool initWSA() { WORD wVersionRequested; WSADATA wsaData; int Result; wVersionRequested = MAKEWORD( 2, 2 ); &( ?ω?)emsp;Result = WSAStartup( wVersionRequested, &wsaData );&??emsp; if(Resu??lt(╬?益?) != 0 ) { return false; } if( LOBYTE( wsaD??ata.wVersion) != 2 || HIBYTE(wsaData.wVersio??n)!= 2 ) { WSACleanup(′▽?zhuān)?(); return false; } return true; } / &(//ω//)emsp;SOCKET CreateSocket(int type) { &??emsp;SOCKET sock=socket(AF_INET,type,0); if (s(╥_╥)ock == INVALID_SOCKET ) &e??msp;{ &eヽ(′?`)ノmsp; return 0; } return sock; &(???)emsp;} / int MyS(′_`)endto(SOCKET so?ckTo, const char FAR * buf(╯‵□′)╯,int len,cha??r *addr,USHORT port) { //設置發(fā)送數據到的 套接字及地址結構 SOCKADDR_IN addrTo; addrTo.sin_addr.S_un.S_addr=inet_addr(addr); addrTo.sin_family=AF_INET; addrTo.sin_port=hto??ns(port)??;&e??msp; return sendto( sockT(′▽?zhuān)?o, buf, len, 0, (sockaddr*)&am??p;addrTo, sizeof(socka( ?° ?? ?°)ddr) ); } / bool MyConnect(SOCKET sockTo, char *addr,USHORT port) { int Result;?? &em??s??p;//設置連接到的 套接字及地址結構 SOCKADDR_IN addrTo;&??emsp; addrTo.sin_addr.S_un.S_a(′▽?zhuān)?ddr=(i??net_addr(addr)); addrTo.sin_family=AF_INET; addrTo.sin_(′ω`*)port=htons(port); &??emsp;//連接&emsp??; Result = connect(sockTo,(sockaddr *)&addrTo,sizeof(SOCKADDR_??IN)); if(SOCKET_ERROR == Result) { return false; }&emsp(◎_◎;); return true; } /&e??msp; int MyRecvFrom(SOCKET s, char FAR * buf,int len,c(?Д?)har *addr,USHORT port) { //設置發(fā)送數據到的 套接字及地址結構 SOCKADDR_IN addrFrom; addrFrom.sin_addr.S_(′?_?`)un.S_addr=inet_addr(addr); ad??drFro???m.sin_family=AF_INET; addrFrom(′_ゝ`).sin_port=htons(port);&em??sp; int addr(′▽?zhuān)?len = sizeof(SOCKADD(′▽?zhuān)?R_IN)??; return recvfrom( s, buf, len, 0, (SOCKADDR *)&addrFrom, &addrlen); } / int ChName(char *fname,char *tname);//域名轉化 bool SetD??NSHead(char *name,char *buf) { &ems??p; memset(buf,0,sizeof(DnsHead))??; //設置頭部 DnsHead *DnsH = (D(╬?益?)nsHead *)buf; DnsH->ID = (USHORT)1; DnsH->tag = htons(0x0100);&em??sp;?? DnsH->numQ = htons(1); DnsH->numA = 0; DnsQuery *DnsQ =(DnsQuery *) ( buf+ sizeof(DnsHead) );&emsp(╯‵□′)╯; int NameLen = ChName(name,(char *)DnsQ); //設置查詢(xún)信息 DnsQ = (DnsQu(′?`*)ery *)( (char *)DnsQ + NameLen ); DnsQ->classes = htons(1);&e(′?`*)msp; DnsQ->type = htons(1);&em(′?`*)sp; re??turn true; } //顯示錯誤信息&ヽ(′ー`)ノems(′?ω?`)p; void displayErrWSA(char *str)&(╯‵□′)╯ems(′-ι_-`)p; { printf("\n%s,err = %d\n",str,WSAGetLastError());&ヽ(′▽?zhuān)?/emsp; getchar(); } //域名轉化 int ChName(char *fname,char *tname)&e??msp; { int j =0; int i =strlen(fname)-1; tname[i+2] = 0; int k = i+1; for (; i>=0;i--,k--) (′?ω?`){ if (fname[i] == '.') ??{ tname[k] = j; j=0(°o°); ˉ\_(ツ)_/ˉ ??} &em??sp;else { tname[k] = fname[i]; j++; } } tname[k] = j; return strlen(tname)+1; } DNS域名解析流程剖析 域名解析的流程,每個(gè)步驟如下: 1) 客戶(hù)端通過(guò)瀏覽器訪(fǎng)問(wèn)域名網(wǎng)站,法樣發(fā)起查詢(xún)該域名的流程 IP 地址的 DNS 請求。該請求發(fā)送到了本地 DNS 服務(wù)器上。本地 DNS 服務(wù)器會(huì )首先查詢(xún)它的緩存記錄,如果緩存中有此條記錄,就可以直接返回結果。如果沒(méi)有,本地 DNS 服務(wù)器還要向 DNS 根(gen)服務(wù)器進(jìn)行查詢(xún)。&e??msp; 2) 本地 DNS 服務(wù)器向根服務(wù)器發(fā)送 DNS 請求,請求域名的 IP 地址。 3) 根服務(wù)器經(jīng)過(guò)查詢(xún),沒(méi)有記錄該域名及 IP 地址的對應(????)關(guān)系。但??是會(huì )告訴本地 DNS 服務(wù)器,可以到域名服務(wù)器上繼續查詢(xún),并給??出域名服務(wù)器的地址(.com 服務(wù)器)。 4) 本地 DNS 服務(wù)器向(xiang) .com 服務(wù)(◎_◎;)器發(fā)送 DNS 請求,請求域名、的 IP 地址。 5).com 服務(wù)器收到請??求后,不會(huì )直接返回域名和 IP 地址的對應關(guān)系,而是告訴本地 DNS 服務(wù)器,該域名可以在 baidu.com 域名服務(wù)器上進(jìn)行解析獲取 IP 地址,并告訴域名服務(wù)器的地址(⊙_⊙)。 6) 本地 DNS 服務(wù)器向域名服務(wù)器發(fā)送 DNS 請求,請求域名的 IP 地址。 &ems??p;7) 服務(wù)器收到請求后,在自己的緩存表中發(fā)現了該域名和 IP 地址的對應關(guān)系,并將IP地址返回給本地 DNS 服務(wù)器。 8) 本地 DNS 服務(wù)器將獲取到與域名對應的 IP 地址返回給客戶(hù)端,并且將域名和 IP 地址的對應關(guān)系保存在緩存中,以備下次別的用戶(hù)查詢(xún)時(shí)使用。?? &(??-)?emsp;域名解析有??哪些注意事項?域名解析基本知識詳解&ヽ(′ー`)ノemsp; 一、A記錄解析 A記錄解析是最為常見(jiàn)的域名解析方式,記錄類(lèi)型選擇”A”,記錄值填寫(xiě)空間商提供的主機IP地址(╯°□°)╯,MX優(yōu)先級不需要ヽ(′ー`)ノ設置,TTL設置默認的3600即可。選擇A記錄時(shí),需要設定域名或(╬ ò﹏ó)者子域名指向,通常需要注意以下3點(diǎn): 1. 做A記錄時(shí), 對應值必須是IP地址; &??emsp;2. 主機名必須填寫(xiě),用@可以表示主機名為空; 3. 泛域名解析,請在主機名處輸入*,增加A記錄即可。&emsp(╬ ò﹏ó); A記錄對于網(wǎng)站優(yōu)化來(lái)說(shuō)是蜘蛛最為喜歡的一種方式,因為蜘蛛每次爬取網(wǎng)站都是固定的一個(gè)IP,能夠避免不必要的錯誤。不過(guò)A記錄對于使用不同網(wǎng)絡(luò )訪(fǎng)問(wèn)網(wǎng)站的用戶(hù)來(lái)說(shuō),有一定的短處,例如網(wǎng)站放在電信服務(wù)器上,如果是聯(lián)通的用戶(hù)訪(fǎng)問(wèn),網(wǎng)站打開(kāi)速度就會(huì )有一定的影響。 二、CNAME記錄解析 (╬ ò﹏ó) CNAME類(lèi)型解析設置的方法和A記錄類(lèi)型基本是一樣的,其中將記錄類(lèi)型修改為”CNAME”,并且記錄值填寫(xiě)服務(wù)器主機地址即可。不過(guò)對應的值不是一個(gè)固定的IP,而是主機的別名地址,以新網(wǎng)為例別名解析步驟ヽ(′?`)ノ為: 1. 在主機名處填寫(xiě)www或者其他名稱(chēng); 2(╬?益?). 在記錄類(lèi)型選擇類(lèi)型為CNAME記錄;??&emsp??; 3. 在記錄值填寫(xiě)別名地址; 4. 點(diǎn)擊立即添加,完成添加別名解析。 三、MX記錄解析MX記錄是相對用到較少的一種解析,MX記錄是做郵箱解析使用的。記錄類(lèi)型選擇MX,線(xiàn)路類(lèi)型選擇通用或者同時(shí)添加三條線(xiàn)路類(lèi)型為電信、網(wǎng)通、教育網(wǎng)的記錄;記錄值填寫(xiě)郵局商提供的服務(wù)器IP地址或別名地址;TTL設置默認的36??00即可,MX優(yōu)先級填寫(xiě)郵局提供商要求的數(O_O)據,或是默認10,有??多條MX記錄的時(shí)候,優(yōu)先級要設置不一樣的數據。
&ems(?_?;)p;c語(yǔ)言域名解析方法是怎樣的?以上就給大家介紹了關(guān)于c語(yǔ)言域名解析方法的問(wèn)題,大家在做c語(yǔ)言域名解析的時(shí)候,就可以?按照上面的步驟去做,這個(gè)ヾ(′?`)?是需要耐心的去做的,千萬(wàn)不(bu)要著(zhù)急,要不然就可能會(huì )出錯了。如果大家在做(???)c語(yǔ)言域名解析的過(guò)程中,還有不懂的地方,可以咨詢(xún)新網(wǎng)。電話(huà):18942436707
網(wǎng) 址:http://www.hunqingrc.com/
地 址:上海市長(cháng)寧66號