【问题标题】:Segmentation fault when getting host information获取主机信息时出现分段错误
【发布时间】:2011-05-19 09:23:59
【问题描述】:

高并发调用时出现,gethostbyname的结果好像没有缓存?

static int proxy_getaddr(char *HostName)
{
    struct hostent*     Host;
    Host=gethostbyname(HostName);

    if(!Host)
    {
        unsigned long int addr=inet_addr(HostName);
        if(addr!=-1)
            Host=gethostbyaddr((char*)addr,sizeof(addr),AF_INET);
    }
    ...

这是核心转储:

0x00000034f40e98b1 in gethostbyaddr () from /lib64/libc.so.6
0x000000000040182c in proxy_getaddr (HostName=0x48d75be0 "stackoverflow.com")

我该如何解决这个问题?

【问题讨论】:

    标签: c network-programming


    【解决方案1】:

    gethostbyaddr 的第一个参数应该是指向 in_addr 结构的指针,而不是指向 long 的指针。见http://pubs.opengroup.org/onlinepubs/009695399/functions/gethostbyaddr.html

    【讨论】:

      【解决方案2】:

      您的代码不正确。您将inet_addr() 的结果传递给一个指针,但您真正想要的是这个地址

      Host = gethostbyaddr(&addr, sizeof(addr), AF_INET);
      

      (您应该使用 in_addr_t 而不是 unsigned long int 的其他 cmets 也是正确的,但这不太可能导致您的问题)。

      【讨论】:

      • 所以gethostbyaddr 可以在内部同时使用unsigned long intin_addr_t
      • @DriverBoy: 不完全是,但in_addr_t 被定义为“正好是 32 位的无符号整数类型。”,所以只要你的 unsigned long int平台与该描述相匹配,它可能会起作用。不过,您仍应将其更改为 in_addr_t
      • 好像不行,我又遇到这个问题了:stackoverflow.com/questions/6095026/…
      • @DriverBoy:JeremyP 有正确的答案 - h_addrNULL。顺便说一句,不需要调用inet_addr()gethostbyaddr() 的后备路径,因为gethostbyname() 在给定IP 地址而不是主机名的情况下可以正常工作。
      • 但是为什么h_addr 等于NULL?我什至运行了nscd 来缓存名称解析结果...
      【解决方案3】:

      根据documentation found here,你传入了错误的值:

      gethostbyaddr() 接受一个结构体in_addr 或结构体in6_addr 并为您提供一个相应的主机名(如果有的话),所以它有点类似于gethostbyname()。至于参数,即使 addr 是一个char*,你实际上想要传递一个指向结构in_addr的指针。 len 应为sizeof(struct in_addr),类型应为AF_INET

      以下是引用网站的一些示例代码:

      struct hostent *he;
      struct in_addr ipv4addr;
      struct in6_addr ipv6addr;
      
      inet_pton(AF_INET, "192.0.2.34", &ipv4addr);
      he = gethostbyaddr(&ipv4addr, sizeof ipv4addr, AF_INET);
      printf("Host name: %s\n", he->h_name);
      
      inet_pton(AF_INET6, "2001:db8:63b3:1::beef", &ipv6addr);
      he = gethostbyaddr(&ipv6addr, sizeof ipv6addr, AF_INET6);
      printf("Host name: %s\n", he->h_name);
      

      【讨论】:

      • 高并发调用时出现,gethostbyname的结果好像没有缓存?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-14
      • 2023-04-04
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多