我一直在學習如何最近使用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」。
任何人都可以解釋爲什麼我得到了上述結果,爲什麼維基百科最初的例子沒有工作?非常感謝。
您爲雅虎獲得的兩個結果可能是兩個負載平衡服務器或其他東西,他們可能不允許任何東西,除了「www.yahoo.com.tw」連接。 –
這個'WSANO_DATA'在哪裏出現? – glglgl
到@glglgl:'WSANO_DATA'發生在我試圖調用'getnameinfo()'後。 –