gethostbyname(3) Library Functions Manual gethostbyname(3)

gethostbyname, gethostbyaddr, sethostent, gethostent, endhostent, h_errno, herror, hstrerror, gethostbyaddr_r, gethostbyname2, gethostbyname2_r, gethostbyname_r, gethostent_r - zwraca wpis sieciowy komputera

Standardowa biblioteka C (libc-lc)

#include <netdb.h>
void sethostent(int stayopen);
void endhostent(void);
[[przestarzałe]] extern int h_errno;
[[deprecated]] struct hostent *gethostbyname(const char *name);
[[deprecated]] struct hostent *gethostbyaddr(const void addr[.size],
                                             socklen_t size, int type);
[[przestarzałe]] void herror(const char *s);
[[przestarzałe]] const char *hstrerror(int err);
/* Rozszerzenie systemu V/POSIX */
struct hostent *gethostent(void);
/* Rozszerzenia GNU */
[[przestarzałe]]
struct hostent *gethostbyname2(const char *name, int af);
int gethostent_r(struct hostent *restrict ret,
                 char buf[restrict .bufsize], size_t bufsize,
                 struct hostent **restrict result,
                 int *restrict h_errnop);
[[deprecated]]
int gethostbyaddr_r(const void addr[restrict .size], socklen_t size,
                 int type,
                 struct hostent *restrict ret,
                 char buf[restrict .bufsize], size_t bufsize,
                 struct hostent **restrict result,
                 int *restrict h_errnop);
[[deprecated]]
int gethostbyname_r(const char *restrict name,
                 struct hostent *restrict ret,
                 char buf[restrict .bufsize], size_t bufsize,
                 struct hostent **restrict result,
                 int *restrict h_errnop);
[[deprecated]]
int gethostbyname2_r(const char *restrict name, int af,
                 struct hostent *restrict ret,
                 char buf[restrict .bufsize], size_t bufsize,
                 struct hostent **restrict result,
                 int *restrict h_errnop);
Wymagane ustawienia makr biblioteki glibc (patrz feature_test_macros(7)):

gethostbyname2(), gethostent_r(), gethostbyaddr_r(), gethostbyname_r(), gethostbyname2_r():

    Od glibc 2.19:
        _DEFAULT_SOURCE
    glibc do 2.19 włącznie:
        _BSD_SOURCE || _SVID_SOURCE

herror(), hstrerror():

    Od glibc 2.19:
        _DEFAULT_SOURCE
    glibc 2.8 do glibc 2.19:
        _BSD_SOURCE || _SVID_SOURCE
    Przed glibc 2.8:
        brak

h_errno:

    Od glibc 2.19
        _DEFAULT_SOURCE || _POSIX_C_SOURCE < 200809L
    glibc 2.12 do glibc 2.19:
        _BSD_SOURCE || _SVID_SOURCE || _POSIX_C_SOURCE < 200809L
    Przed glibc 2.12:
        brak

Funkcje gethostbyname*(), gethostbyaddr*(), herror() oraz hstrerror() są przestarzałe. Aplikacje powinny zamiast nich używać getaddrinfo(3), getnameinfo(3) i gai_strerror(3).

Funkcja sethostent() określa, jeżeli stayopen jest prawdziwe (1), że do odpytywania serwera nazw będzie użyte połączenie TCP i to połączenie będzie otwarte podczas kolejnych zapytań. W przeciwnym wypadku serwer nazw będzie odpytywany przy użyciu datagramów UDP.

Funkcja endhostent() kończy połączenie TCP odpytywania serwera nazw.

Funkcja gethostbyname() dla danego komputera name zwraca strukturę typu hostent. name jest tutaj albo nazwą komputera, albo adresem IPv4 w standardowej notacji z kropkami (jak opisano w inet_addr(3)). Jeżeli name jest adresem IPv4, to gethostbyname() nie wykonuje żadnych sprawdzeń i po prostu kopiuje name do pola h_name oraz jej odpowiednik struct in_addr do pola h_addr_list[0] zwracanej struktury hostent. Jeżeli name nie kończy się kropką oraz ustawiono zmienną środowiskową HOSTALIASES, to wyszukiwanie name zacznie się od pliku z aliasami, wskazywanego przez HOSTALIASES (format tego pliku opisany jest w hostname(7)). Bieżąca domena i jej domeny nadrzędne są przeszukiwane, chyba że name kończy się kropką.

The gethostbyaddr() function returns a structure of type hostent for the given host address addr of size len and address type type. Valid address types are AF_INET and AF_INET6 (defined in <sys/socket.h>). The host address argument is a pointer to a struct of a type depending on the address type, for example a struct in_addr * (probably obtained via a call to inet_addr(3)) for address type AF_INET.

(Przestarzała) funkcja herror() wypisuje na standardowe wyjście błędów stderr komunikat błędu przypisany do bieżącej wartości zmiennej h_errno.

(Przestarzała) funkcja hstrerror() dla przekazanego numeru błędu (zazwyczaj h_errno) zwraca odpowiadający mu komunikat błędu.

Zapytania o nazwy domenowe z gethostbyname() i gethostbyaddr() polegają na skonfigurowanych źródłach Name Service Switch (nsswitch.conf(5)) lub lokalnym serwerze nazw (named(8)). Domyślną akcją jest odpytanie skonfigurowanych źródeł Name Service Switch (nsswitch.conf(5), a jeśli się to nie powiedzie, lokalnego serwera nazw (named(8)).

Plik nsswitch.conf(5) jest współczesnym sposobem kontrolowania kolejności wyszukiwań komputerów.

W glibc 2.4 i wcześniejszych, do określenia kolejności wyszukiwań komputerów służyło słowo kluczowe order zdefiniowane w /etc/host.conf (host.conf(5)).

Struktura hostent zdefiniowana w <netdb.h> następująco:


struct hostent {
    char  *h_name;            /* official name of host */
    char **h_aliases;         /* alias list */
    int    h_addrtype;        /* host address type */
    int    h_length;          /* size of address */
    char **h_addr_list;       /* list of addresses */
}
#define h_addr h_addr_list[0] /* for backward compatibility */

Struktra hostent składa się z:

Oficjalna nazwa komputera.
Zakończona wskaźnikiem null tablica alternatywnych nazw komputera.
Typ adresu; obecnie zawsze jest to AF_INET lub AF_INET6.
The size of the address in bytes.
Zakończona wskaźnikiem null tablica adresów sieciowych komputera (w sieciowym porządku bajtów).
Pierwszy adres z h_addr_list - dla zachowania zgodności ze wcześniejszymi wersjami

Funkcje gethostbyname() i gethostbyaddr() zwracają strukturę hostent lub wskaźnik null w przypadku błędu. W razie błędu, zmienna h_errno przechowuje numer błędu. Wartość zwrócona, jeśli jest różna od null, może wskazywać na statyczne dane, patrz UWAGI poniżej.

Zmienna h_errno może przyjmować następujące wartości:

Podany komputer jest nieznany.
Żądana nazwa jest prawidłowa, lecz nie posiada adresu IP. Inny typ żądania skierowany do serwera nazw dla tej domeny może zwrócić odpowiedź. Stała NO_ADDRESS jest synonimem NO_DATA.
Wystąpił trwały błąd serwera nazw.
Autorytatywny serwer nazw zwrócił tymczasowy błąd. Proszę spróbować ponownie później.

/etc/host.conf
plik konfiguracyjny biblioteki resolver
/etc/hosts
plik bazy danych komputerów
/etc/nsswitch.conf
plik konfiguracyjny serwisów nazw (NSS)

Informacje o pojęciach używanych w tym rozdziale można znaleźć w podręczniku attributes(7).

Interfejs Atrybut Wartość
gethostbyname() Bezpieczeństwo wątkowe MT-niebezpieczne race:hostbyname env locale
gethostbyaddr() Bezpieczeństwo wątkowe MT-niebezpieczne race:hostbyaddr env locale
sethostent(), endhostent(), gethostent_r() Bezpieczeństwo wątkowe MT-niebezpieczne race:hostent env locale
herror(), hstrerror() Bezpieczeństwo wątkowe MT-bezpieczne
gethostent() Bezpieczeństwo wątkowe MT-niebezpieczne race:hostent race:hostentbuf env locale
gethostbyname2() Bezpieczeństwo wątkowe MT-niebezpieczne race:hostbyname2 env locale
gethostbyaddr_r(), gethostbyname_r(), gethostbyname2_r() Bezpieczeństwo wątkowe MT-bezpieczne env locale

W powyższej tabeli, hostent w race:hostent oznacza, że jeśli któraś z funkcji sethostent(), gethostent(), gethostent_r() lub endhostent() jest używana równolegle w różnych wątkach programu, może nastąpić sytuacja wyścigu danych.

POSIX.1-2008.
GNU.
Brak.

POSIX.1-2001.
Oznaczone jako wychodzące z użycia w POSIX.1-2001. Usunięte w POSIX.1-2008, z zaleceniem stosowania w zamian getaddrinfo(3) i getnameinfo(3).

Funkcje gethostbyname() i gethostbyaddr() mogą zwracać wskaźniki do danych statycznych, które mogą być nadpisane przez kolejne wywołania. Kopiowanie struct hostent nie wystarcza, ponieważ zawiera ona wskaźniki - wymagane jest skopiowanie wszystkiego.

In the original BSD implementation the size argument of gethostbyname() was an int. The SUSv2 standard is buggy and declares the size argument of gethostbyaddr() to be of type size_t. (That is wrong, because it has to be int, and size_t is not. POSIX.1-2001 makes it socklen_t, which is OK.) See also accept(2).

Prototyp BSD funkcji gethostbyaddr() używa const char * dla trzeciego argumentu.

POSIX wymaga, aby wywołanie gethostent() zwróciło następny wpis w bazie danych komputerów. Jeśli używany jest DNS/BIND nie ma to większego sensu, ale może być uzasadnione, jeśli baza danych komputerów jest plikiem, który można odczytać linia po linii. Wiele systemów funkcja o tej nazwie czyta plik /etc/hosts. Może być on dostępny tylko wtedy, gdy biblioteka została skompilowana bez wsparcia dla DNS-u. Wersja glibc ignoruje wpisy IPv6. Ta funkcja nie jest wielowątkowa, glibc dodaje jej wielowątkową wersję gethostent_r().

Glibc2 ma także funkcję gethostbyname2(), która działa jak gethostbyname(), ale pozwala określić rodzinę adresów, do której musi należeć zadany adres.

glibc2 also has reentrant versions gethostent_r(), gethostbyaddr_r(), gethostbyname_r(), and gethostbyname2_r(). The caller supplies a hostent structure ret which will be filled in on success, and a temporary work buffer buf of size bufsize. After the call, result will point to the result on success. In case of an error or if no entry is found result will be NULL. The functions return 0 on success and a nonzero error number on failure. In addition to the errors returned by the nonreentrant versions of these functions, if buf is too small, the functions will return ERANGE, and the call should be retried with a larger buffer. The global variable h_errno is not modified, but the address of a variable in which to store error numbers is passed in h_errnop.

gethostbyname() nie rozpoznaje komponentów oddzielonego kropkami łańcucha adresu IPv4, jeśli są one wyrażone jako liczby szesnastkowe.

getaddrinfo(3), getnameinfo(3), inet(3), inet_ntop(3), inet_pton(3), resolver(3), hosts(5), nsswitch.conf(5), hostname(7), named(8)

Autorami polskiego tłumaczenia niniejszej strony podręcznika są: Robert Luberda <robert@debian.org> i Michał Kułach <michal.kulach@gmail.com>

Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać zapoznając się z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.

Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy dyskusyjnej manpages-pl-list@lists.sourceforge.net.

24 grudnia 2024 r. Linux man-pages 6.12