2013-11-26 17 views
3

我一直在學習如何最近使用getaddrinfo()。我稱爲維基百科中的示例: http://en.wikipedia.org/wiki/Getaddrinfo
我提出了一些小的修改示例代碼用Visual C++ 2005
修改後的版本被如下編譯它:
維基百科的GetAddrInfo示例不起作用

int main(){ 

// Initialize Winsock 
iResult = WSAStartup(MAKEWORD(2,2), &wsaData); 

if (iResult != 0) { 
    printf("WSAStartup failed with error: %d\n", iResult); 
    return 1; 
} 

struct addrinfo *res; 
int error; 

/* resolve the domain name into a list of addresses */ 
error = getaddrinfo("www.example.com", NULL, NULL, &result); 
if (error != 0) 
{ 
    fprintf(stderr, "%d\n", error); 
    fprintf(stderr, "error in getaddrinfo: %s\n", gai_strerror(error)); 

    exit(EXIT_FAILURE); 
} 

/* loop over all returned results and do inverse lookup */ 
for (res = result; res != NULL; res = res->ai_next) 
{ 
    char hostname[NI_MAXHOST] = ""; 

    error = getnameinfo(res->ai_addr, res->ai_addrlen, hostname, NI_MAXHOST, NULL, 0, 0); 
    if (error != 0) 
    { 
     fprintf(stderr, "%d\n", WSAGetLastError()); 
     fprintf(stderr, "error in getnameinfo: %s\n", gai_strerror(error)); 
     continue; 
    } 
    if (*hostname != '\0') 
     printf("hostname: %s\n", hostname); 
} 

freeaddrinfo(result); 

getchar(); 

return 0; 
} 

執行結果是令人驚訝的是,返回錯誤失敗:WSANO_DATA。儘管如此,我可以通過谷歌瀏覽器連接到www.example.com
我還用代碼中的其他域名替換了www.example.com並完成了測試。一些結果的預期,而另一些奇怪:

test: localhost
hostname: localhost

test: www.yahoo.com.tw
hostname: w2.rc.vip.gq1.yahoo.com
hostname: w2.rc.vip.sp1.yahoo.com

的第一個結果是意料之中的,但第二個(www.yahoo.com.tw)很奇怪。我無法通過瀏覽器連接到「w2.rc.vip.gq1.yahoo.com」和「w2.rc.vip.sp1.yahoo.com」。

任何人都可以解釋爲什麼我得到了上述結果,爲什麼維基百科最初的例子沒有工作?非常感謝。

+1

您爲雅虎獲得的兩個結果可能是兩個負載平衡服務器或其他東西,他們可能不允許任何東西,除了「www.yahoo.com.tw」連接。 –

+0

這個'WSANO_DATA'在哪裏出現? – glglgl

+0

到@glglgl:'WSANO_DATA'發生在我試圖調用'getnameinfo()'後。 –

回答

0

的例子,你的代碼的工作就好了。

直接連接到雅虎的負載均衡器的地址,因爲它的意思轉發您的請求,基於域,子域和路由前端傳送服務器不應該工作。

你可以找到關於維基更多信息之約Load balancing和如何工作的。

至於錯誤,請嘗試重新測試之前刷新您的DNS緩存。它可以在Windows上使用ipconfig /flushdns完成。

+0

感謝您的回覆。 –

+0

我試過'ipconfig/flushdns',但代碼仍然沒有與'www.example.com'一起使用。儘管如此,我在'cmd' shell中使用'nslookup'來解析'www.example.com'並獲得IP地址,'93.184.216.119',這是從Google DNS'8.8.8.8'回覆的。然後,我將產生的IP傳遞給'nslookup',並得到了失敗的消息: _「*** google-public-dns-a.google.com找不到92.184.216.119:不存在的域._」 這是否意味着Google DNS的問題無法解析「www.example.com」的主機名? –