Ошибка сегментации при получении информации о хосте - PullRequest
0 голосов
/ 19 мая 2011

Это происходит при вызове с высоким параллелизмом, кажется, что результат 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 ]

1 голос
/ 19 мая 2011

Ваш код неверен. Вы передаете результат inet_addr(), приведенный к указателю, но на самом деле вам нужен адрес этого:

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

(Другие комментарии о том, что вы должны использовать in_addr_t вместо unsigned long int, тоже верны, но маловероятно, что именно это вызывает вашу проблему).

1 голос
/ 19 мая 2011

Первый параметр gethostbyaddr должен быть указателем на структуру in_addr, а не указателем на long. Смотри http://pubs.opengroup.org/onlinepubs/009695399/functions/gethostbyaddr.html.

0 голосов
/ 19 мая 2011

Согласно документации , найденной здесь , вы передаете неправильные значения:

gethostbyaddr() принимает struct in_addr или struct 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);
...