Ubuntu: gethostbyaddr возвращает NULL с ошибкой HOST_NOT_FOUND - PullRequest
2 голосов
/ 27 июля 2011

Моя машина - Ubuntu Server 10.10.

У меня есть следующий фрагмент кода:

#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <errno.h>

int main(int argc, char *argv[])
{
    struct in_addr addr;
    struct hostent *he;
    /* printf ("sizeof struct in_addr: %i\n", sizeof(struct in_addr)); */
    printf("in_addr: %s\n", argv[1]);
    addr.s_addr = inet_addr(argv[1]);
    if (addr.s_addr == 0 || addr.s_addr == -1)
    {
        perror("inet_addr");
        return 1;
    }
    /* else */
    he = gethostbyaddr(&addr, 4, AF_INET);
    if (he == NULL)
    {
        perror("gethostbyaddr");
        switch (h_errno)
        {
            case HOST_NOT_FOUND:
                printf("HOST_NOT_FOUND\n");
                break;
            case NO_ADDRESS:
                printf("NO_ADDRESS\n");
                break;
                /* case NO_DATA: print ("NO_DATA\n"); break; */
            case NO_RECOVERY:
                printf("NO_RECOVERY\n");
                break;
            case TRY_AGAIN:
                printf("TRY_AGAIN\n");
                break;
        }
        return 1;
    }
    /* else */
    printf("%s\n", he->h_name);
    return 0;
}

Я запускаю его с:

./main 10.50.10.252

(10.50.10.252 - мой IP-адрес eth0)

$ ifconfig
eth0      Link encap:Ethernet  HWaddr 00:0c:29:65:0d:27
          inet addr:10.50.10.252  Bcast:10.50.10.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe65:d27/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1225069 errors:0 dropped:0 overruns:0 frame:0
          TX packets:980849 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:695573851 (695.5 MB)  TX bytes:658044535 (658.0 MB)
          Interrupt:19 Base address:0x2000

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:783434 errors:0 dropped:0 overruns:0 frame:0
          TX packets:783434 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:701737148 (701.7 MB)  TX bytes:701737148 (701.7 MB)

Но вывод:

in_addr: 10.50.10.252
gethostbyaddr: Success
HOST_NOT_FOUND

Я просто не знаю, почему HOST_NOT_FOUND, потому что я мог бы использовать интернет, ssh, scp ... со своей машины.

P.S .: cat / etc / hosts

127.0.0.1       localhost
127.0.1.1       ubuntu.localdomain      ubuntu

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

cat /etc/nsswitch.conf

# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc-reference' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.

passwd:         compat
group:          compat
shadow:         compat

hosts:          files dns
networks:       files

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files

netgroup:       nis

cat /etc/host.conf

# The "order" line is only used by old versions of the C library.
order hosts,bind
multi on

1 Ответ

0 голосов
/ 27 июля 2011

Для обратного поиска DNS поведение контролируется /etc/host.conf. Вы должны указать хосты там. Вам нужно добавить эту строку в ваш /etc/host.conf:

order hosts,bind

См. http://tldp.org/LDP/nag/node82.html.

...