NAZWA¶
getaddrinfo - tłumaczenie adresów i usług sieciowych
SKŁADNIA¶
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
int getaddrinfo(const char *node, const char *service,
const struct addrinfo *hints,
struct addrinfo **res);
void freeaddrinfo(struct addrinfo *res);
const char *gai_strerror(int errcode);
OPIS¶
Uwaga! To tłumaczenie może być nieaktualne!
Funkcja
getaddrinfo(3) łączy w pojedynczym interfejsie
funkcjonalność udostępnianą przez funkcje
getipnodebyname(3),
getipnodebyaddr(3),
getservbyname (3)
i
getservbyport(3). Przystosowana do wielowątkowości funkcja
getaddrinfo(3) tworzy jedną lub więcej struktur adresowych
gniazda, które mogą być wykorzystane przez funkcje systemowe
bind(2) i
connect(2) do utworzenia gniazda klienta lub serwera.
Funkcja
getaddrinfo(3) nie jest ograniczona do tworzenia struktur
adresowych gniazd IPv4. Gniazda IPv6 mogą również być
tworzone za jej pomocą, o ile dostępne jest wspomaganie dla IPv6. Te
struktury adresowe gniazd mogą być bezpośrednio wykorzystane
przez
bind(2) i
connect(2) do sporządzenia gniazda klienta
lub serwera.
Struktura
addrinfo używana przez tę funkcję zawiera
następujące pola:
struct addrinfo {
int ai_flags;
int ai_family;
int ai_socktype;
int ai_protocol;
size_t ai_addrlen;
struct sockaddr *ai_addr;
char *ai_canonname;
struct addrinfo *ai_next;
};
getaddrinfo(3) ustawia
res, aby wskazywało na dynamicznie
zaalokowaną listę struktur
addrinfo, dowiązaną do
pola
ai_next. Istnieje kilka powodów, dla których lista
może zawierać więcej niż jedną strukturę
addrinfo, włączając w to: posiadanie przez host wielu
interfejsów sieciowych oraz dostępność tej samej
usługi poprzez wiele protokołów gniazda (na przykład, gdy
jednym z nich jest
SOCK_STREAM, a innym
SOCK_DGRAM).
Pola
ai_family,
ai_socktype i
ai_protocol mają to samo
znaczenie jako odpowiednie parametry wywołania systemowego
socket(2). Funkcja
getaddrinfo(3) zwraca adresy gniazd IPv4 lub
IPv6 (
ai_family zostanie ustawione albo na
PF_INET albo na
PF_INET6).
Parametr
hints określa preferowany rodzaj gniazda lub
protokół. Wartość NULL dla
hints określa,
że akceptowany jest dowolny adres sieciowy lub protokół.
Jeśli parametr ten ma wartość różną od
NULL, wskazuje on na strukturę
addrinfo, w której pola
ai_family,
ai_socktype i
ai_protocol określają
preferowany rodzaj gniazda.
PF_UNSPEC w
ai_family określa
dowolną rodzinę protokołów (na przykład IPv4 lub
IPv6). 0 w
ai_socktype lub
ai_protocol stwierdza, że
akceptowalny jest również dowolny rodzaj gniazda lub
protokół. Pole
ai_flags zawiera dodatkowe, zdefiniowane
poniżej, opcje. Wiele znaczników podaje się jako ich logiczne
OR. Wszystkie pozostałe pola parametru
hints muszą
zawierać albo 0 albo wskaźnik NULL.
Parametry
node i
service mogą być równe NULL, ale
nie oba naraz.
node zawiera albo adres sieciowy w postaci numerycznej
(w formacie dziesiętnych liczb rozdzielonych kropkami dla IPv4, a w
formacie szesnastkowym dla IPv6) albo nazwę hosta, dla której adresy
sieciowe będą poszukiwane i rozwiązane. Jeśli pole
ai_flags parametru
hints zawiera znacznik
AI_NUMERICHOST,
to parametr
node musi być adresem sieciowym w postaci numerycznej.
Znacznik
AI_NUMERICHOST eliminuje jakiekolwiek, potencjalnie
długotrwałe, poszukiwania adresu sieciowego hosta.
Funkcja
getaddrinfo(3) tworzy listę struktur
addrinfo, po
jednej dla każdej podstawy ograniczenia adresów sieciowych
narzuconej przez parametr
hints. Gdy
ai_flags w
hints
zawiera znacznik
AI_CANONNAME, to
ai_canonname jest ustawiane
tak, aby wskazywało na oficjalną nazwę hosta.
ai_family,
ai_socktype i
ai_protocol zawierają parametry tworzenia
gniazda. Wskaźnik do adresu gniazda jest umieszczany w polu
ai_addr, a długość adresu gniazda w bajtach jest
umieszczana w polu
ai_addrlen.
Gdy
node jest równe NULL, inicjalizacja adresu sieciowego w
każdej ze struktur gniazda zależy od znacznika
AI_PASSIVE,
który jest ustawiany w polu
ai_flags parametru
hints. Gdy
znacznik
AI_PASSIVE jest ustawiony, to adres sieciowy w każdej ze
struktur gniazda pozostanie nieokreślony. Jest to wykorzystywane przez
programy serwerów, które zamierzają przyjmować
połączenia od klientów na dowolny adres sieciowy. Gdy znacznik
AI_PASSIVE nie jest ustawiony, to adres sieciowy zostanie ustawiony na
adres interfejsu loopback. Jest to wykorzystywane przez programy klienckie,
które zamierzają połączyć się z serwerem
działającym na tym samym hoście.
service ustawia numer portu w adresie sieciowym każdej ze struktur
gniazda. Jeśli
service jest różne od NULL, to numer
portu pozostanie niezainicjalizowany.
Funkcja
freeaddrinfo(3) zwalnia pamięć przydzieloną dla
dynamicznie zaalokowanej listy
res.
WARTOŚĆ ZWRACANA¶
getaddrinfo(3) zwraca 0, gdy zakończy się pomyślnie, a w
przeciwnym razie jeden z następujących niezerowych kodów
błędów:
- EAI_FAMILY
- Zupełny brak wsparcia dla żądanej rodziny
adresów.
- EAI_SOCKTYPE
- Zupełny brak wsparcia dla żądanego rodzaju
gniazda.
- EAI_BADFLAGS
- ai_flags zawiera nieprawidłowe znaczniki.
- EAI_NONAME
- node lub service jes nieznane. Ten
błąd jest również zwracany, gdy zarówno
node, jak i service są równe NULL.
- EAI_SERVICE
- Żądana usługa nie jest dostępna dla
zadanego rodzaju gniazda. Może ona jednak być dostępna dla
innego rodzaju gniazda.
- EAI_ADDRFAMILY
- Podany host nie posiada żadnego adresu sieciowego dla
zadanej rodziny adresów.
- EAI_NODATA
- Podany host istnieje, ale nie zdefiniowano dla niego
żadnego adresu sieciowego.
- EAI_MEMORY
- Brak pamięci.
- EAI_FAIL
- Serwer nazw zwrócił błąd
trwały.
- EAI_AGAIN
- Serwer nazw zwrócił błąd tymczasowy.
Należy spróbować później.
- EAI_SYSTEM
- Inny błąd systemowy; szczegółowe
informacje zawarte są w errno.
Funkcja
gai_strerror(3) tłumaczy te kody błędów na
czytelny dla człowieka napis, odpowiedni dla zgłaszania
błędów.
ZOBACZ TAKŻE¶
getipnodebyname(3),
getipnodebyaddr(3)
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 getaddrinfo
Prosimy o pomoc w aktualizacji stron man - więcej informacji można
znaleźć pod adresem
http://sourceforge.net/projects/manpages-pl/.