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