- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我最近一直在学习如何使用 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
替换为其他域名并进行了测试。有些结果在意料之中,有些结果很奇怪:
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”。
谁能解释为什么我得到上述结果以及为什么来自维基百科的原始示例不起作用?非常感谢。
最佳答案
示例和您的代码运行良好。
直接连接到 Yahoo 的负载均衡器地址应该不起作用,因为它意味着将您的请求转发到基于域、子域和路由的前端交付服务器。
您可以在 wiki 上找到更多关于 Load balancing 的信息及其工作原理。
至于错误,请尝试在重新测试之前刷新您的 DNS 缓存。可以在 Windows 上使用 ipconfig/flushdns
来完成。
关于c++ - 来自维基百科的 GetAddrInfo 示例将不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20213150/
我是一名优秀的程序员,十分优秀!