4

我很迷茫。

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

我一直在寻找导致此错误的可能原因,但没有发现任何东西。正如我所说,这段代码在早些时候运行,并且在我没有更改任何内容的情况下就停止了。我推断它可能是我使用的端口号,但我已经更改了几次,没有任何改变。

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

4

1 回答 1

10

由于当时无疑是有道理的原因,1 getaddrinfo不会通过 报告大多数错误,这意味着通常没有帮助您还必须检查它的返回值。我将从维基百科上婴儿床errnoperror

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;
}

顺便说一句,请注意,如果您尝试查找不存在或没有 A 或 AAAA 记录的域名会发生什么,实现之间没有达成共识。您可能会得到, , , or中的任何一个,或者您可能会成功,但设置为或 为 vacuous 。耶。(有关这方面的更多详细信息,请参阅https://sourceware.org/glibc/wiki/NameResolver。)EAI_NONAMEEAI_NODATAEAI_FAILEAI_SYSTEMresultNULLstruct addrinfo

1许多较新的 POSIX API 都在尝试摆脱errno,这在抽象上是个好主意,但在实践中却令人头疼,因为现在您必须知道哪些函数的返回值比 0 更复杂/成功,-1/错误。

于 2013-07-29T01:02:17.050 回答