获取主机信息时出现分段错误

时间:2011-05-19 09:23:59

标签: c network-programming

当以高并发性调用时,似乎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")

如何解决此问题?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

您的代码不正确。您正在将inet_addr()的结果传递给指针,但实际需要的是地址

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

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

答案 2 :(得分:0)

根据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);