我很迷茫.
我正在使用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;
}
Run Code Online (Sandbox Code Playgroud)
Host和portNo是包含主机(在本例中为" www.cmu.edu")和端口(在本例中为"80")的字符串.
他们肯定包含正确的东西,没有额外的空间或类似的东西.
编辑:谢谢大家!我现在至少有一个适当的错误信息,即使我仍然不知道为什么事情停止工作.错误消息是:
Servname not supported for ai_socktype
Run Code Online (Sandbox Code Playgroud)
我一直在寻找这个错误的可能原因,我没有找到任何东西.正如我所说的,这段代码工作得更早,并且在没有改变任何东西的情 我推断它可能是我使用的端口号,但我已经改变了几次而没有任何改变.
任何见解?我没有附加端口号或除主机之外的任何东西.我只是想让它运转起来.
对于无疑在当时是有道理的理由,1 getaddrinfo并没有通过报告大多数错误errno,这意味着perror通常是无益的.您还必须检查其返回值.我将来自维基百科:
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;
}
Run Code Online (Sandbox Code Playgroud)
顺便提一下,请注意,如果您尝试查找不存在或没有A或AAAA记录的域名,则实现之间没有达成共识.你可能会得到任何的EAI_NONAME,EAI_NODATA,EAI_FAIL,或者EAI_SYSTEM,或者你可能会成功,但result集要么NULL还是一个空洞struct addrinfo.好极了.(有关详细信息,请参阅https://sourceware.org/glibc/wiki/NameResolver.)
1许多较新的POSIX API试图摆脱errno,这在抽象中是一个好主意,但在实践中却变得令人头疼,因为现在你必须知道哪些函数的返回值比0更复杂/ success,-1 /错误.