【问题标题】:How can I fix `getaddrinfo` definitions not being found?如何修复找不到“getaddrinfo”定义?
【发布时间】:2019-10-20 21:25:10
【问题描述】:

当我尝试编译我的代码时出现以下错误:

main.c:13:40: note: each undeclared identifier is reported only once for each function it appears in
main.c:17:14: error: ‘EAI_ADDRFAMILY’ undeclared (first use in this function); did you mean ‘EAI_FAMILY’?
         case EAI_ADDRFAMILY:
              ^~~~~~~~~~~~~~
              EAI_FAMILY
main.c:29:14: error: ‘EAI_NODATA’ undeclared (first use in this function); did you mean ‘EAI_NONAME’?
         case EAI_NODATA:
              ^~~~~~~~~~
              EAI_NONAME

我尝试过包含不同的标头(例如netinet/in.h)以及使用不同的标准(gnu90gnu99gnu11)进行编译,但似乎没有任何方法可以解决错误。

以下是我的代码:

// Name: main.c
// Compile: gcc -std=gnu11 main.c
// Error:
//   main.c: In function ‘main’:
//   main.c:18:14: error: ‘EAI_ADDRFAMILY’ undeclared (first use in this function); did you mean ‘EAI_FAMILY’?
//            case EAI_ADDRFAMILY:
//                 ^~~~~~~~~~~~~~
//                 EAI_FAMILY
//   main.c:18:14: note: each undeclared identifier is reported only once for each function it appears in
//   main.c:30:14: error: ‘EAI_NODATA’ undeclared (first use in this function); did you mean ‘EAI_NONAME’?
//            case EAI_NODATA:
//                 ^~~~~~~~~~
//                 EAI_NONAME

#include <stddef.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>

int main()
{
    struct addrinfo* res;
    char* domain = "google.com";

    switch(getaddrinfo(domain, "http", NULL, &res))
    {
        case 0:
            break;
        case EAI_ADDRFAMILY:
            break;
        case EAI_AGAIN:
            break;
        case EAI_BADFLAGS:
            break;
        case EAI_FAIL:
            break;
        case EAI_FAMILY:
            break;
        case EAI_MEMORY:
            break;
        case EAI_NODATA:
            break;
        case EAI_NONAME:
            break;
        case EAI_SERVICE:
            break;
        case EAI_SOCKTYPE:
            break;
    }

    return 0;
}

【问题讨论】:

  • 好的,我搜索了一下,确实手册页指出上述定义应该在netdb.h 中。但是,它们至少不适用于我系统上的标头和 the open group 的标头,而且似乎也是您的标头。然而,它们是在addrinfo.h 中定义的,但这会产生关于多重定义的冲突。这就是困扰我的地方,有时手册页只是一团混乱
  • 嗯,当我在我的系统上检查 netdb.h 时,它似乎确实在那里,但只有在定义 __USE_GNU 时。我得看看那个标志是怎么启用的。
  • 另外,您可以使用gai_strerror() 将任何返回的结果转换为可读的字符串以进行错误输出。然而,这意味着您不能对错误做出反应,只能对消息做出反应并退出。
  • 请参阅 this answer 以自行启用 __USE_GNU
  • Take a look here 我有时发现使用 posix 函数非常困难,因为纪录片有时是如此模棱两可,而我以前从未使用过_GNU_SOURCE

标签: c tcp network-programming getaddrinfo


【解决方案1】:

事实证明,虽然EAI_ADDRFAMILYEAI_NODATA 这两个定义是在我的系统上的netdb.h 中定义的,但它们没有启用,因为它要求定义__USE_GNU .

要启用__USE_GNU(间接),我们在文件顶部定义_GNU_SOURCE。工作文件如下:

// Name: main.c
// Compile: gcc -std=gnu11 main.c

#define _GNU_SOURCE // Need for EAI_ADDRFAMILY and EAI_NODATA

#include <stddef.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>

int main()
{
    struct addrinfo* res;
    char* domain = "google.com";

    switch(getaddrinfo(domain, "http", NULL, &res))
    {
        case 0:
            break;
        case EAI_ADDRFAMILY:
            break;
        case EAI_AGAIN:
            break;
        case EAI_BADFLAGS:
            break;
        case EAI_FAIL:
            break;
        case EAI_FAMILY:
            break;
        case EAI_MEMORY:
            break;
        case EAI_NODATA:
            break;
        case EAI_NONAME:
            break;
        case EAI_SERVICE:
            break;
        case EAI_SOCKTYPE:
            break;
    }

    return 0;
}

【讨论】:

  • 但请注意,这些代码从 posix 中排除可能是有原因的,如here所述
猜你喜欢
  • 1970-01-01
  • 2019-08-17
  • 2022-07-25
  • 2017-06-19
  • 2022-10-13
  • 2021-11-13
  • 1970-01-01
  • 2014-01-04
  • 1970-01-01
相关资源
最近更新 更多