Android域名解析优先ipv6,IPv6 域名解析原理及编程实现
IPv6 域名解析原理及編程實現
2009-09-24 09:36:51
舊日重來
隨著 IPv4
資源逐漸耗盡,IPv6 (Internet Protocol version 6) 網絡的部署已開始進行,相信已經有不少朋友已經開始使用 v6 的網絡了。和 IPv4 最顯著的不同是每個 v6 的 IP
地址包含 128 位(16 個字節),相比 v4 來說極大的擴展了地址空間。但是,這也使得 v6 的網絡在使用時特別是編程的時候和 v4
的情況不大兼容。本文介紹了針對 IPv6 的 DNS 域名解析知識和編程實現。
由于 DNS 協議的特點,原有的 DNS 系統幾乎不需要做什么改變就已經直接支持 IPv6 的域名解析了。有意思的是,客戶機并不用接入 v6
的網絡甚至根本不需要安裝 v6 組件(例如默認的 Windows XP 系統)就可以請求解析 v6 的地址,只需要系統可以與一個有效的 DNS
服務器建立連接(例如通過 DHCP 自動獲取的 DNS 服務器),而無論這個 DNS 服務器是 v6 還是 v4 的。事實上,解析 v6 地址與 v4
唯一的不同就是 v4 查詢域名的 A 記錄而 v6 查詢域名的 AAAA 記錄。
下面的例子演示了如何通過 Windows 的 nslookup 命令和
BIND 中的 dig 命令查詢
gipv6.aulddays.com 這個
IPv6 域名的方法(注意,使用的
OpenDNS 服務器 208.67.222.222 就是通過 IPv4 連接的):
>nslookup -querytype=AAAA gipv6.aulddays.com
Server: resolver
Address:1.opendns.com 208.67.222.222
Non-authoritative answer:
Name: gipv6.aulddays.com
Address: 2001:4860:b004::68
>dig AAAA gipv6.aulddays.com
; <<>> DiG 9.4.2 <<>> AAAA gipv6.aulddays.com
; (1 server found)
;; global options: printcmd
;; Got answer:
;; ->>HEADER<
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;gipv6.aulddays.com. IN AAAA
;; ANSWER SECTION:
gipv6.aulddays.com. 1800 IN AAAA 2001:4860:b004::68
;; Query time: 360 msec
;; SERVER: 208.67.222.222#53(208.67.222.222)
;; WHEN: Sat Sep 19 16:13:18 2009
;; MSG SIZE rcvd: 64
下面說說如何在程序中解析 IPv6 的域名。傳統的 v4 地址是使用 gethostbyname()
函數解析,雖然可以通過修改編譯選項的方式強制它工作在 v6 狀態,但這樣也失去了兼容性。為此,最好使用更新的 getaddrinfo()
函數,該函數同時支持 v4 和 v6 域名的解析,VC++ 中的示例代碼如下:
#include "stdio.h"
#include "Ws2tcpip.h"
#pragma comment(lib, "Ws2_32.lib") // getaddrinfo 需要的 lib
int main(int argc, char * argv[])
{
const char *strDomain2Resolve = "gipv6.aulddays.com";
// 初始化 Winsock
WSADATA wsaData;
int nStatus = WSAStartup(MAKEWORD(2,2), &wsaData);
if (NO_ERROR != nStatus)
{
printf("WSAStartup() 錯誤\n");
return -1;
}
addrinfo Hints, *AddrList;
memset(&Hints, 0, sizeof(Hints));
Hints.ai_family = PF_INET6; // IPv6 address family
// 進行域名解析
nStatus = getaddrinfo(strDomain2Resolve, NULL, &Hints, &AddrList);
if (NO_ERROR != nStatus)
{
// 處理出錯的情況,
// 例如目標域名沒有對應的 AAAA 記錄
printf("getaddrinfo() 失敗,錯誤信息為 %d: %s\n",
nStatus, gai_strerror(nStatus));
return -1;
}
// 打印所有找到的地址(一個域名可能對應多個 IP 地址)
printf("已解析出下列地址:\n");
char pBuf[64]; // 打印緩沖
for(addrinfo *i = AddrList; i; i = i->ai_next)
{
// 取得一個解析出的地址
in6_addr DnsAddr = ((sockaddr_in6 *)i->ai_addr)->sin6_addr;
// 得到可打印版本
inet_ntop(AF_INET6, &DnsAddr, pBuf, 64);
printf("%s\n", pBuf);
}
// 一般來說,客戶端程序應輪詢或使用解析出的 IP 列表中的第一個即可
// (如果解析出多個地址的話)
in6_addr AddrToUse = ((sockaddr_in6 *)AddrList->ai_addr)->sin6_addr;
freeaddrinfo(AddrList);
WSACleanup();
}
注意:本站所有文章除特別說明外均為原創,版權所有,轉載請務必以超鏈接方式注明作者出處,并禁止用作商業用途
總結
以上是生活随笔為你收集整理的Android域名解析优先ipv6,IPv6 域名解析原理及编程实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 医疗行业缩写所表示含义
- 下一篇: 药物用法拉丁文缩写词