【发布时间】: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