我很困惑。
我正在使用getaddrinfo
获取给定网络托管服务商的地址信息。
在这种情况下,我一直在使用www.cmu.edu
。
我的代码工作了一段时间,但后来停止了。
奇怪的是,我显然遇到了错误,但是当打印出错误代码时,它会显示“成功”。
以下是相关的代码:
struct addrinfo *res = NULL;
struct addrinfo hint;
memset(&hint, 0, sizeof(hint));
hint.ai_family = AF_UNSPEC;
hint.ai_socktype = SOCK_DGRAM;
hint.ai_flags = 0;
hint.ai_protocol = 17;
if (getaddrinfo(host, portNo, &hint, &res))
{
perror("getaddrinfo");
return 0;
}
Host和portNo是包含主机(在本例中为“www.cmu.edu
”)和端口(在本例中为“80”)的字符串。
他们肯定包含正确的东西,没有额外的空格或类似的东西。
编辑:谢谢大家!我现在至少有一个适当的错误信息,即使我仍然不知道为什么事情停止工作。错误消息是:
Servname not supported for ai_socktype
我一直在寻找导致此错误的可能原因,但我没有找到任何结果。正如我所说的,这段代码工作得更早,并且在没有改变任何东西的情我推断它可能是我使用的端口号,但我已经改变了几次而没有任何改变。
有什么见解?我没有附加端口号或除主机之外的任何东西。我只是想让它发挥作用。
答案 0 :(得分:9)
由于当时无疑有意义的原因, 1 getaddrinfo
通过errno
not 报告大多数错误,这意味着{{1通常是无益的。您还必须检查其返回值。我将crib from wikipedia:
perror
顺便提一下,请注意,如果您尝试查找不存在或没有A或AAAA记录的域名,则实施方式之间没有达成共识。您可能会得到 err = getaddrinfo("www.example.com", NULL, NULL, &result);
if (err)
{
if (err == EAI_SYSTEM)
fprintf(stderr, "looking up www.example.com: %s\n", strerror(errno));
else
fprintf(stderr, "looking up www.example.com: %s\n", gai_strerror(err));
return -1;
}
,EAI_NONAME
,EAI_NODATA
或EAI_FAIL
,或 >成功但将EAI_SYSTEM
设置为result
或设置为空NULL
。好极了。 (有关详细信息,请参阅https://sourceware.org/glibc/wiki/NameResolver。)
1 许多较新的POSIX API试图摆脱struct addrinfo
,这是一个好主意中的,但结果是在实践中很头疼,因为现在你必须知道哪些函数的返回值比0 /成功,-1 /错误更复杂。