【问题标题】:getaddrinfo - Error: Successgetaddrinfo - 错误:成功
【发布时间】:2013-07-29 00:50:17
【问题描述】:

我很困惑。

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

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

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

【问题讨论】:

  • 您不能使用perror(s),因为它几乎可以扩展到fprintf(2, "%s: %s\n", s, strerror(errno)),并且getaddrinfo 不会触及errno,除非返回码是EAI_SYSTEM。如果返回码不是EAI_SYSTEM,则在getaddrinfo的返回码上使用gai_strerror,如果返回码是EAI_SYSTEM,则使用perror,如果为0..
  • 你应该使用gai_strerror(),返回值为getaddrinfo()
  • 从错误信息来看,远程服务器似乎不支持 socktype,尝试更改 hint.ai_socktype = SOCK_STREAM 和 hint.ai_protocol = 0 ?
  • 谢谢!这行得通,现在看起来他们正在工作!

标签: c getaddrinfo


【解决方案1】:

出于当时毫无疑问的原因,1getaddrinfo 确实通过errno 报告大多数错误,这意味着perror 通常没有帮助。您还必须检查它的返回值。我要crib from wikipedia:

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 记录的域名会发生什么,实现之间并没有达成共识。您可能会获得 任何 EAI_NONAMEEAI_NODATAEAI_FAILEAI_SYSTEM您可能会获得 成功,但result 设置为NULL 或空的struct addrinfo。耶。 (有关这方面的更多详细信息,请参阅https://sourceware.org/glibc/wiki/NameResolver。)

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

【讨论】:

  • 谢谢!现在,我至少可以继续进行诊断了。
猜你喜欢
  • 2017-10-16
  • 2014-10-20
  • 1970-01-01
  • 2018-03-03
  • 1970-01-01
  • 2019-07-26
  • 2018-05-24
  • 2016-04-20
  • 2019-04-06
相关资源
最近更新 更多