【问题标题】:What might cause getaddrinfo() to return an error code of "1"?什么可能导致 getaddrinfo() 返回错误代码“1”?
【发布时间】:2012-11-15 10:48:48
【问题描述】:

或多或少是它在标题中所说的。我打电话给 getaddrinfo,如下所示:

struct addrinfo crossplat, *actual_addr;
crossplat.ai_family = AF_UNSPEC; //IPv4 or IPv6.
crossplat.ai_socktype = SOCK_STREAM; 

if(int i = getaddrinfo("localhost", "8000", &crossplat, &actual_addr)!=0){
    cerr << "error code " << i << " received. Meaning: "<<  gai_strerror(i) << endl;
    return -1;
}

自豪地打印:

error code 1 received. Meaning: Unknown error

在我的系统上。

我系统上的 getaddrinfo 手册页:

RETURN VALUE
   getaddrinfo() returns 0 if it succeeds, or one of the following 
   nonzero error codes:

   EAI_ADDRFAMILY....


   ...The gai_strerror() function translates these error codes to a 
       human readable string, suitable for error reporting.

这表明 getaddrinfo 返回的所有非零代码都应该是列出的 EAI_* 系列代码之一。在线搜索表明,gai_strerror() 只会在传递一个错误代码时返回“未知错误”,该错误代码 不是 EAI_* 系列的成员,这似乎排除了“1”是这样的一个代码。

显然我在这里做错了,所以任何帮助将不胜感激!

【问题讨论】:

    标签: c network-programming berkeley-sockets


    【解决方案1】:

    此表达式在 C 中是一个语法错误,但假设您使用的是 C++,它并没有按照您的预期进行分组:

    if (int i = getaddrinfo("localhost", "8000", &crossplat, &actual_addr)!=0){
    

    这会将getaddrinfo("localhost", "8000", &amp;crossplat, &amp;actual_addr) != 0 的结果分配给i,它始终为0 或1。getaddrinfo() 的任何非零返回都将使i 的值为1。

    您需要提前声明i,以便您可以对分配进行附加说明:

    int i;
    if ((i = getaddrinfo("localhost", "8000", &crossplat, &actual_addr)) != 0) {
    

    (当然,完成此操作后,您可能还会将 getaddrinfo() 调用移动到 i 的初始化程序)。

    【讨论】:

    • 啊,做得很好。我通常编写 C,但必须为这个项目使用 g++ 编译,这导致我利用了鲜为人知的特性。感谢您的信息!
    • @JohnDoucette 在条件内使用赋值是产生难以发现的错误的一种非常有效的方法。
    【解决方案2】:

    我认为您需要初始化crossplat.ai_protocolhints 参数上的 man page 部分提到除了您已经初始化的 addrinfo 成员之外,还使用了这个。

    您可能还需要初始化crossplat.ai_flags。只对整个结构进行 memset 可能会更容易:

    struct addrinfo crossplat, *actual_addr;
    memset(&crossplat, 0, sizeof(crossplat));
    crossplat.ai_family = AF_UNSPEC; //IPv4 or IPv6.
    crossplat.ai_socktype = SOCK_STREAM;
    

    【讨论】:

    • 是的,就是这样。应该是自己发现的!谢谢!
    【解决方案3】:

    getaddrinfo.h#define EAI_ADDRFAMILY 1,这意味着:不支持主机名的地址族

    【讨论】:

    • 有趣,但如果是这种情况,为什么 gai_strerror 不能在我的系统上正确翻译它?
    • 不知道确切,但在 gai_strerror() 手册页中没有列出 EAI_ADDRFAMILY,即使它是在 netdb.h 中定义的。也许它忽略了错误,但这会很奇怪......
    • EAI_ADDRFAMILY 的值因不同的 C 库而异 - 例如我的是 -9。
    猜你喜欢
    • 2011-07-08
    • 2012-01-15
    • 2019-01-05
    • 1970-01-01
    • 1970-01-01
    • 2018-02-16
    • 2017-05-30
    • 1970-01-01
    • 2018-06-03
    相关资源
    最近更新 更多