sourCEntral - mobile manpages

pdf

gethostbyname

NAZWA

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

BIBLIOTEKA

Standardowa biblioteka C (libc, -lc)

SKŁADNIA

#include <netdb.h>

void sethostent(int stayopen);
void endhostent(void);

[[deprecated]] extern int h_errno;

[[deprecated]] struct hostent *gethostbyname(const char *name);
[[deprecated]] struct hostent *gethostbyaddr(const void
addr[.len],
socklen_t
len, int type);

[[deprecated]] void herror(const char *s);
[[deprecated]] const char *hstrerror(int
err);

/* Rozszerzenie systemu V/POSIX */
struct hostent *gethostent(void);

/* GNU extensions */
[[deprecated]]
struct hostent *gethostbyname2(const char *
name, int af);

int gethostent_r(struct hostent *restrict ret,
char
buf[restrict .buflen], size_t buflen,
struct hostent **restrict
result,
int *restrict
h_errnop);

[[deprecated]]
int gethostbyaddr_r(const void
addr[restrict .len], socklen_t len,
int
type,
struct hostent *restrict
ret,
char
buf[restrict .buflen], size_t buflen,
struct hostent **restrict
result,
int *restrict
h_errnop);
[[deprecated]]
int gethostbyname_r(const char *restrict
name,
struct hostent *restrict
ret,
char
buf[restrict .buflen], size_t buflen,
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 .buflen], size_t buflen,
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():
Since glibc 2.19:
_DEFAULT_SOURCE
glibc up to and including 2.19:
_BSD_SOURCE || _SVID_SOURCE

herror(), hstrerror():
Since glibc 2.19:
_DEFAULT_SOURCE
glibc 2.8 to glibc 2.19:
_BSD_SOURCE || _SVID_SOURCE
Before glibc 2.8:
none

h_errno:
Since glibc 2.19
_DEFAULT_SOURCE || _POSIX_C_SOURCE < 200809L
glibc 2.12 to glibc 2.19:
_BSD_SOURCE || _SVID_SOURCE || _POSIX_C_SOURCE < 200809L
Before glibc 2.12:
none

OPIS

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 length 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)).

Historia
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; /* oficjalna nazwa komputera */
char **h_aliases; /* lista aliasów */
int h_addrtype; /* typ adresu komputera */
int h_length; /* długość adresu */
char **h_addr_list; /* lista adresów */
}
#define h_addr h_addr_list[0] /* dla zachowania zgodności */
/* z wcześniejszymi wersjami */

Struktra hostent składa się z:

h_name

Oficjalna nazwa komputera.

h_aliases

Zakończona wskaźnikiem null tablica alternatywnych nazw komputera.

h_addrtype

Typ adresu; obecnie zawsze jest to AF_INET lub AF_INET6.

h_length

Długość adresu w bajtach.

h_addr_list

Zakończona wskaźnikiem null tablica adresów sieciowych komputera (w sieciowym porządku bajtów).

h_addr

Pierwszy adres z h_addr_list - dla zachowania zgodności ze wcześniejszymi wersjami

WARTOŚĆ ZWRACANA

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.

BŁĘDY

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

Podany komputer jest nieznany.

NO_DATA

Żą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.

NO_RECOVERY

Wystąpił trwały błąd serwera nazw.

TRY_AGAIN

Autorytatywny serwer nazw zwrócił tymczasowy błąd. Proszę spróbować ponownie później.

PLIKI

/etc/host.conf

plik konfiguracyjny biblioteki resolver

/etc/hosts

plik bazy danych komputerów

/etc/nsswitch.conf

plik konfiguracyjny serwisów nazw (NSS)

ATRYBUTY

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

img

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.

STANDARDY

POSIX.1-2001 definiuje gethostbyname(), gethostbyaddr(), sethostent(), endhostent(), gethostent() i h_errno; gethostbyname(), gethostbyaddr() i h_errno są oznaczone jako starzejące się. POSIX.1-2008 usuwa definicje gethostbyname(), gethostbyaddr() oraz h_errno, zalecając używanie zamiast nich funkcjigetaddrinfo(3) i getnameinfo(3).

UWAGI

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.

W oryginalnej implementacji BSD, argument len funkcji gethostbyname() był typu int. Standard SUS-v2 jest błędny i określa parametr len funkcji gethostbyaddr() jako będący typu size_t. (Nie jest to właściwe, ponieważ musi to być typ int, którym size_t nie jest. POSIX.1-2001 używa socklen_t, co jest OK). Patrz także accept(2).

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

Rozszerzenie System V/POSIX
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().

Rozszerzenia GNU
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 ma także wielowątkowe wersje gethostent_r(), gethostbyaddr_r(), gethostbyname_r() i gethostbyname2_r(). Proces wywołujący przekazuje strukturę hostent w ret, który będzie wypełniony, gdy funkcja zakończy się pomyślnie, oraz tymczasowy bufor roboczy buf o rozmiarze buflen. Po pomyślnym wywołaniu, result będzie wskazywał na wynik. W razie błędu lub gdy nie znaleziono żadnego wpisu result będzie ustawiony na NULL. Funkcje zwracają one 0 w przypadku powodzenia lub liczbę różną od zera w razie błędu. Oprócz błędów, które mogą zwrócić niewielowątkowe wersje tych funkcji, funkcje mogą zwróć błąd RANGE, jeśli buf jest za mały - w takim wypadku należy powtórzyć wywołanie funkcji z większym buforem. Globalna zmienna h_errno nie jest modyfikowana, ale numer błędu jest przekazywany w zmiennej, której adres został podany w h_errnop.

BŁĘDY

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

ZOBACZ TAKŻE

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

TŁUMACZENIE

Autorami polskiego tłumaczenia niniejszej strony podręcznika są: Robert Luberda <robert AT debian DOT org> i Michał Kułach <michal DOT kulach AT gmail DOT 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.

pdf