【发布时间】: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