C getaddrinfo-错误:成功

C getaddrinfo-错误:成功,c,getaddrinfo,C,Getaddrinfo,我很困惑 我正在使用getaddrinfo获取给定web主机的地址信息 在这种情况下,我一直在使用www.cmu.edu 我的代码运行了一段时间,但后来停止了 奇怪的是,我显然遇到了一个错误,但当错误代码被打印出来时,它会显示“成功” 以下是相关的代码位: struct addrinfo *res = NULL; struct addrinfo hint; memset(&hint, 0, sizeof(hint)); hint.ai_family = AF_UNSPEC; hint.

我很困惑

我正在使用
getaddrinfo
获取给定web主机的地址信息

在这种情况下,我一直在使用
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;
}
主机和端口号是包含主机(在本例中为“
www.cmu.edu
”)和端口(在本例中为“80”)的字符串

它们肯定包含正确的东西,没有额外的空间或类似的东西

编辑:谢谢大家!我现在至少有一个适当的错误消息,即使我仍然不知道为什么事情停止工作。错误消息是:

Servname not supported for ai_socktype
我一直在寻找这个错误的可能原因,但我没有发现任何东西。正如我所说的,这段代码运行得更早,并且停止了,我没有做任何更改。我推断它可能是我使用的端口号,但我已经更改了好几次,没有任何更改


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

出于当时毫无疑问是有道理的原因,1
getaddrinfo
不会通过
errno
报告大多数错误,这意味着
perror
通常没有帮助。您还必须检查其返回值。我将:

顺便说一句,请注意,如果您试图查找一个不存在或没有a或AAAA记录的域名,那么在实现之间没有共识。您可能会获得
EAI\u NONAME
EAI\u NODATA
EAI\u FAIL
、或
EAI\u SYSTEM
,或者您可能会获得成功,但
结果
设置为
NULL
或设置为空的
struct addrinfo
。耶。(有关详细信息,请参见。)


1许多较新的POSIX API正试图摆脱
errno
,这在抽象上是一个好主意,但在实践中却是一个令人头痛的问题,因为现在您必须知道哪些函数的返回值比0/success,-1/error更复杂。

您不能使用
peror(s)
由于它扩展到几乎
fprintf(2,“%s:%s\n”,s,strerror(errno))
getaddrinfo
不会接触
errno
,除非返回代码是
EAI\u SYSTEM
。如果返回代码不是
EAI_SYSTEM
,则对
getaddrinfo
的返回代码使用
gai_strerror
,如果返回代码是
EAI_SYSTEM
,则使用
peror
,如果返回代码为0,则正常进行。您应该使用错误消息中的
getaddrinfo()
的返回值,远程服务器似乎不支持socktype,请尝试更改hint.ai_socktype=SOCK_流和hint.ai_协议=0?谢谢!这起作用了,现在一切看起来都在起作用!谢谢现在,我至少有了一些诊断方法。
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;
}