gpt4 book ai didi

c - getaddrinfo - 错误 : Success

转载 作者:太空狗 更新时间:2023-10-29 15:20:00 24 4
gpt4 key购买 nike

我很困惑。

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

我一直在寻找这个错误的可能原因,但我没有找到任何东西。正如我所说,这段代码在早些时候运行并且在我没有做任何更改的情况下停止了。我推断这可能是我使用的端口号,但我已经更改了几次并没有改变。

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

最佳答案

出于当时无疑有意义的原因,1 getaddrinfo 确实通过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 中的任何,< em>或您可能会成功,但result 设置为NULL 或空洞的struct addrinfo。好极了。 (有关这方面的更多详细信息,请参阅 https://sourceware.org/glibc/wiki/NameResolver。)

1 许多较新的 POSIX API 正试图摆脱 errno,这抽象是个好主意,但是事实证明这在实践中很头疼,因为现在你必须知道哪些函数的返回值比 0/success,-1/error 更复杂。

关于c - getaddrinfo - 错误 : Success,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17914550/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com