来自维基百科的GetAddrInfo示例将无效

时间:2013-11-26 09:32:58

标签: c++ sockets networking operating-system

我最近一直在学习如何使用getaddrinfo()。我提到维基百科的一个例子: http://en.wikipedia.org/wiki/Getaddrinfo
我对示例代码进行了一些小的修改,用Visual C ++ 2005编译它 修改后的版本如下:

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并完成了测试。一些结果是预期的,而另一些则是奇怪的:

  

测试:localhost
  主机名:localhost
  
  测试:www.yahoo.com.tw
  主机名:w2.rc.vip.gq1.yahoo.com
  主机名:w2.rc.vip.sp1.yahoo.com

第一个结果是预期的,但第二个结果(www.yahoo.com.tw)很奇怪。我无法通过浏览器连接到“w2.rc.vip.gq1.yahoo.com”和“w2.rc.vip.sp1.yahoo.com”。

有谁可以解释为什么我得到了上述结果以及为什么维基百科的原始示例不起作用?非常感谢。

1 个答案:

答案 0 :(得分:0)

示例和您的代码工作得很好。

直接连接到Yahoo负载均衡器的地址不应该正常工作,因为它意味着根据域,子域和路由将您的请求转发到前端交付服务器。

您可以在wiki上找到有关Load balancing及其工作原理的更多信息。

对于错误,请在重新测试之前尝试刷新DNS缓存。可以在Windows上使用ipconfig /flushdns来完成。