NAZWA¶
gethostbyname, gethostbyaddr, sethostent, endhostent, herror, hstrerror -
zwróć wpis sieciowy komputera
SKŁADNIA¶
#include <netdb.h>
extern int h_errno;
struct hostent *gethostbyname(const char *nazwa);
#include <sys/socket.h> /* dla AF_INET */
struct hostent *gethostbyaddr(const char *adres,
int dlug, int typ);
void sethostent(int stayopen);
void endhostent(void);
void herror(const char *s);
const char *hstrerror(int err);
/* rozszerzenia GNU */
struct hostent *gethostbyname2(const char *nazwa, int af);
int gethostbyname_r (const char *nazwa,
struct hostent *ret, char *buf, size_t buflen,
struct hostent **result, int *h_errnop);
int gethostbyname2_r (const char *nazwa, int af,
struct hostent *ret, char *buf, size_t buflen,
struct hostent **result, int *h_errnop);
OPIS¶
Uwaga! To tłumaczenie może być nieaktualne!
Funkcja
gethostbyname() dla danego komputera
nazwa zwraca
strukturę typu
hostent.
Nazwa jest tutaj albo nazwą
komputera, albo adresem IPv4 w standardowej notacji z kropkami, albo adresem
IPv6 w notacji ze średnikami (i być może kropkami).
(Proszę przeczytać RFC 1984, aby uzyskać opis adresów
IPv6). Jeżeli
nazwa jest adresem Ipv4 lub IPv6, to
gethostbyname() nie wykonuje żadnych sprawdzeń i po prostu
kopiuje
nazwę do pola
h_name oraz jej odpowiednik
struct
in_addr do pola
h_addr_list[0] zwracanej struktury
hostent.
Jeżeli
nazwa nie kończy się kropką oraz ustawiono
zmienną środowiskową
HOSTALIASES, to wyszukiwanie
nazwy zacznie się od pliku z aliasami, wskazywanego przez
HOSTALIASES. (format tego pliku opisany jest w
hostname(7)).
Bieżąca domenta i jej domeny nadrzędne są przeszukiwane,
chyba że
nazwa kończy się kropką.
Funkcja
gethostbyaddr() zwraca strukturę typu
hostent dla
zadanego adresu
adres o długości
dlug i typie adresu
typ. Obecnie jedynym poprawnym typem adresu jest
AF_INET.
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.
(Przestarzała) funkcja
herror() wypisuje na standardowe wyjście
błędów 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.
Funkcje
gethostbyname() i
gethostbyaddr() używają do
odpytywania serwera kombinacji któregokolwiek bądź wszystkich
serwerów nazw
named(8), wydzielonych linii z
/etc/hosts,
oraz Systemu Informacji Sieciowej (Network Information Service - NIS lub YP),
w zależności od zawartości linii
order w pliku
/etc/host.conf. (Proszę przeczytać
resolv+(8)).
Domyślnie najpierw odpytywane są serwery
named(8), a
następnie przeglądany jest
/etc/hosts.
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 zerem tablica alternatywnych nazw
komputera.
- h_addrtype
- Typ adresu; obecnie zawsze jest to AF_INET.
- h_length
- Długość adresu w bajtach.
- h_addr_list
- Zakończona zerem tablica adresów sieciowych
komputera w sieciowym porządku bajtów (network byte order).
- 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.
BŁĘDY¶
Zmienna
h_errno może przyjmować następujące
wartości:
- HOST_NOT_FOUND
- Podany komputer jest nieznany.
- NO_ADDRESS lub NO_DATA
- Żądana nazwa jest poprawna, ale nie ma adresu
IP.
- 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 resolver configuration file
- /etc/hosts
- plik bazy danych komputerów
ZGODNE Z¶
BSD 4.3.
UWAGI¶
Standard SUS-v2 jest błędny i określa parametr
len funkcji
gethostbyaddr() jako mający typ
size_t. (No nie jest
właściwe, ponieważ musi to być typ
int, którym
size_t nie jest. POSIX 1003.1-2001 używa
socklen_t, co jest
OK)
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.
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
gethostbyname_r() i
gethostbyname2_r(). Zwracają one 0 w przypadku powodzenia i
niezero w razie błędu. Wynik funkcji jest przechowywany w strukturze
o adresie
ret. Po wywołaniu funkcji *
result będzie
NULL w razie błędu albo wskaźnikiem do wyniku, gdy funkcja
zakończy się powodzeniem. Pomocnicze dane są przechowywane w
buforze
buf o długości
buflen. (Jeżeli bufor jest
za mały, to funkcje te zwrócą
ERANGE.) Globalna zmienna
h_errno nie jest modyfikowana, ale numer błędu jest
przekazywany w zmiennej, której adres został podany w
h_errnop.
POSIX 1003.1-2001 traktuje
gethostbyaddr() i
gethostbyname() jako
spuściznę i wprowadza
struct hostent *getipnodebyaddr (const void *restrict addr,
socklen_t len, int type, int *restrict error_num);
struct hostent *getipnodebyname (const char *name,
int type, int flags, int *error_num);
ZOBACZ TAKŻE¶
resolver(3),
hosts(5),
hostname(7),
resolv+(8),
named(8)
Powyższe tłumaczenie pochodzi z nieistniejącego już Projektu
Tłumaczenia Manuali i
może nie być aktualne. W razie
zauważenia różnic między powyższym opisem a
rzeczywistym zachowaniem opisywanego programu lub funkcji, prosimy o
zapoznanie się z oryginalną (angielską) wersją strony
podręcznika za pomocą polecenia:
- man --locale=C 3 gethostbyname
Prosimy o pomoc w aktualizacji stron man - więcej informacji można
znaleźć pod adresem
http://sourceforge.net/projects/manpages-pl/.