【问题标题】:GetAddrInfo example from Wikipedia won't work来自 Wikipedia 的 GetAddrInfo 示例不起作用
【发布时间】:2013-12-11 08:44:33
【问题描述】:

我最近一直在学习如何使用 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。 不过,我可以使用 Google Chrome 连接到 www.example.com
我还在代码中将www.example.com 替换为其他域名并进行了测试。有些结果是意料之中的,有些则很奇怪:

测试:本地主机
主机名:本地主机

测试: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”。

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

【问题讨论】:

  • 您从 Yahoo 获得的两个结果可能是两个负载平衡服务器或其他东西,它们可能不允许除www.yahoo.com.tw 之外的任何东西进行连接。
  • WSANO_DATA 出现在哪里?
  • To @glglgl : WSANO_DATA 发生在我尝试调用 getnameinfo() 之后。

标签: c++ sockets networking operating-system


【解决方案1】:

示例和您的代码运行良好。

直接连接到 Yahoo 负载平衡器的地址不应该起作用,因为它意味着将您的请求转发到基于域、子域和路由的前端交付服务器。

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

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

【讨论】:

  • 感谢您的回复。
  • 我已经尝试过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 can't find 92.184.216.119: Non-existent domain." 是不是说是谷歌DNS的问题无法解析www.example.com的主机名?
猜你喜欢
  • 1970-01-01
  • 2013-11-21
  • 2018-09-02
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-03
相关资源
最近更新 更多