Różnice między wybraną wersją a wersją aktualną.
Both sides previous revision Poprzednia wersja Nowa wersja | Poprzednia wersja | ||
sk2:sockets_netdbs [2020/10/20 00:19] jkonczak |
sk2:sockets_netdbs [2023/10/17 14:03] (aktualna) jkonczak |
||
---|---|---|---|
Linia 10: | Linia 10: | ||
#include <arpa/inet.h> | #include <arpa/inet.h> | ||
#include <netdb.h> | #include <netdb.h> | ||
+ | #include <cstdio> | ||
int main() { | int main() { | ||
| | ||
- | std::thread t1([&]{ | + | std::thread t1([]{ |
sleep(1); | sleep(1); | ||
gethostbyname("spam.org"); | gethostbyname("spam.org"); | ||
}); | }); | ||
| | ||
- | std::thread t2([&]{ | + | std::thread t2([]{ |
- | hostent* ret = gethostbyname("fc.put.poznan.pl"); | + | hostent* ret = gethostbyname("cat.put.poznan.pl"); |
sleep(2); | sleep(2); | ||
printf("%s: %s\n", ret->h_name, inet_ntoa(**(in_addr**)ret->h_addr_list)); | printf("%s: %s\n", ret->h_name, inet_ntoa(**(in_addr**)ret->h_addr_list)); | ||
Linia 36: | Linia 37: | ||
<html><small></html> | <html><small></html> | ||
Kompilator GCC udostępnia wiele rozszerzeń "łatających" braki standardów [[https://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html]].\\ | Kompilator GCC udostępnia wiele rozszerzeń "łatających" braki standardów [[https://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html]].\\ | ||
- | Towarzysząca mu biblioteka [[https://www.gnu.org/software/libc/|glibc]] wprowadza między innymi funkcję ''gethostbyname_r'' (funkcje ''*_r'' są reentrant, tj. można je łatwiej stosować w aplikacjach wielowątkowych [[https://en.wikipedia.org/wiki/Reentrancy_%28computing%29]]). ''gethostbyname_r'' może być używana współbieżnie. | + | Towarzysząca mu biblioteka [[https://www.gnu.org/software/libc/|glibc]] wprowadza między innymi funkcję ''[[https://www.gnu.org/software/libc/manual/html_node/Host-Names.html#index-gethostbyname_005fr|gethostbyname_r]]'' (funkcje ''*_r'' są reentrant, tj. można je łatwiej stosować w aplikacjach wielowątkowych [[https://en.wikipedia.org/wiki/Reentrancy_%28computing%29]]). ''gethostbyname_r'' może być używana współbieżnie. |
<code cpp> | <code cpp> | ||
Linia 42: | Linia 43: | ||
int status, retval; | int status, retval; | ||
char buffer[4096]; | char buffer[4096]; | ||
- | retval = gethostbyname_r("fc.put.poznan.pl", &he, buffer, sizeof(buffer), &resptr, &status); | + | retval = gethostbyname_r("cat.put.poznan.pl", &he, buffer, sizeof(buffer), &resptr, &status); |
if(retval) | if(retval) | ||
error(1,0,"gethostbyname_r error: %s", hstrerror(status)); | error(1,0,"gethostbyname_r error: %s", hstrerror(status)); | ||
Linia 74: | Linia 75: | ||
};</code><html></small></html> | };</code><html></small></html> | ||
- | Pełen opis funkcji ''getaddrinfo'' i struktury ''addrinfo'' znajdziesz na stronie manuala do getaddrinfo (''man getaddrinfo''). | + | Pełen opis funkcji ''getaddrinfo'' i struktury ''addrinfo'' znajdziesz na stronie manuala do getaddrinfo (''man getaddrinfo'') <html><small></html> lub w standardzie POSIX ([[https://pubs.opengroup.org/onlinepubs/9699919799/functions/freeaddrinfo.html|[1]]], [[https://pubs.opengroup.org/onlinepubs/9699919799/functions/getnameinfo.html|[2]]], [[https://pubs.opengroup.org/onlinepubs/9699919799/functions/gai_strerror.html|[3]]])<html></small></html>. |
+ | \\ | ||
+ | Uwaga: ''getaddrinfo'' w razie sukcesu zwraca ''0'', a w przypadku błędu zwraca jego kod. | ||
Przykłady użycia: | Przykłady użycia: | ||
Linia 92: | Linia 95: | ||
addrinfo * resolved; | addrinfo * resolved; | ||
| | ||
+ | // Z sieci bezprzewodowej PP (lub innych używających serwerów nazw z podsieci 150.254.5.0/24) | ||
+ | // proszę zmienić "pool.ntp.org" na "onet.pl" - Dział Obsługi i Eksploatacji z niezrozumiałych | ||
+ | // przyczyn cenzuruje odpowiedzi z DNS | ||
int res = getaddrinfo("pool.ntp.org", "ntp", &hints, &resolved); | int res = getaddrinfo("pool.ntp.org", "ntp", &hints, &resolved); | ||
| |