getaddrinfo - 错误:成功

时间:2013-07-29 00:50:17

标签: c getaddrinfo

我很困惑。

我正在使用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

我一直在寻找导致此错误的可能原因,但我没有找到任何结果。正如我所说的,这段代码工作得更早,并且在没有改变任何东西的情我推断它可能是我使用的端口号,但我已经改变了几次而没有任何改变。

有什么见解?我没有附加端口号或除主机之外的任何东西。我只是想让它发挥作用。

1 个答案:

答案 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_NONAMEEAI_NODATAEAI_FAIL >成功但将EAI_SYSTEM设置为result或设置为空NULL。好极了。 (有关详细信息,请参阅https://sourceware.org/glibc/wiki/NameResolver。)

1 许多较新的POSIX API试图摆脱struct addrinfo,这是一个好主意中的,但结果是在实践中很头疼,因为现在你必须知道哪些函数的返回值比0 /成功,-1 /错误更复杂。