190 likes | 313 Views
Name and Address Conversions Juha Jääskeläinen. Chapter 11. Sisältö. DNS gethostbyname gethostbyaddr getservbyname & getservbyport getaddrinfo gai_strerror freeaddrinfo getnameinfo re_entrant ongelmat Hylätyt Ipv6 funktiot Yhteenveto. Domain Name System. IP osoitteet nimiksi
E N D
Name and Address Conversions Juha Jääskeläinen Chapter 11
Sisältö • DNS • gethostbyname • gethostbyaddr • getservbyname & getservbyport • getaddrinfo • gai_strerror • freeaddrinfo • getnameinfo • re_entrant ongelmat • Hylätyt Ipv6 funktiot • Yhteenveto
Domain Name System • IP osoitteet nimiksi • Host Name • Yksinkertainen: solaris, freebsd • FQDN: solaris.unpbook.com. • Resource Records • A, AAAA, PTR, MX, CNAME aix IN A 192.168.42.2 IN AAAA 3ffe:b80:1f8d:2:204:acff:fe17:bf38 IN MX 5 aix.unpbook.com. IN MX 10 mailhost.unpbook.com. ....
Tyypillinen rakenne Application Application code Function call Function return UDP Request Local name server other name servers Resolver code UDP Reply Resolver configuration files
DNS:n vaihtoehdot • Staattiset tiedostot • /etc/hosts • Network Information System (NIS) • Light Weight Directory Access Protocol (LDAP) • Paljon muita OS kohtaisia virityksiä
gethostbyname #include <netdb.h> struct hostent *gethostbyname(const char *hostname); Paluuarvot: NULL virhe (h_errno asetettu) • Yrittää löytää IP-osoitteen nimen avulla • Ainoastaan Ipv4 osoitteille
Hostent rakenne struct hostent { char *h_name; /* official (canonical) name of host */ char **h_aliases; /* pointer to array of pointers to alias names */ int h_addrtype;/* host address type: AF_INET */ int h_length; /* length of address: 4 */ char **h_addr_list;/* ptr to array of ptrs with IPv4 addrs */ }; Virhekoodit: (h_errno) HOST_NOT_FOUND TRY_AGAIN NO_RECOVERY NO_DATA (NO_ADDRESS)
gethostbyaddr #include <netdb.h> struct hostent *gethostbyaddr(const char *addr, socklen_t len, int family); Paluuarvot: NULL virhe (h_errno asetettu) • Hakee nimen osoitteen avulla • Käyttää hyväkseen PTR kenttiä
getservbyname&getservbyport • /etc/services #include <netdb.h> struct servent *getservbyname(const char *servname, const char *protoname); struct servent *getservbyport(int port, const char *protoname); struct servent { char *s_name; /* official service name */ char **s_aliases; /* alias list */ int s_port; /* port number, network byteorder */ char *s_proto; /* protocol to use */ };
getaddrinfo • IPv6 versio DNS hauista • Sisältää nimi-osoite ja palvelu-portti -muunnokset #include <netdb.h> int getaddrinfo(const char *hostname, const char *service, const struct addrinfo *hints, struct addrinfo **result); Paluuarvo: 0 - OK, muut virhe Esimerkki funktion palautuksesta: Figure 11.5
Struct addrinfo struct addrinfo { int ai_flags; /* AI_PASSIVE, AI_CANONNAME */ int ai_family; /* AF_xxx */ int ai_socktype; /* SOCK_xxx */ int ai_protocol; /* 0 or IPPROTO_xxx for IPv4 and IPv6 */ socklen_t ai_addrlen; /* length of ai_addr */ char *ai_canonname; /* ptr to canonical name for the host */ struct sockaddr *ai_addr; /* ptr to socket address structure */ struct addrinfo *ai_next; /* ptr to next structure in list */ };
Vihjeet • Liput • AI_PASSIVE • AI_CANONNAME • AI_NUMERICHOST • AI_NUMERICSERV • AI_V4MAPPED • AI_ALL • AI_ADDRCONFIG
Vihjeet • Perhe • AF_INET, AF_INET6, AF_UNSPEC • Sokettityyppi • 0, SOCK_DGRAM, SOCK_STREAM, SOCK_SEQPACKET • Protokolla • 0, IPPROTO_TCP, IPPROTO_UDP
gai_strerror • Tulostaa getaddrinfo:n virheen #include <netdb.h> const char *gai_strerror(int error);
freeaddrinfo • Hoitaa muistin vapauttamisen #include <netdb.h> void freeaddrinfo(struct addrinfo *ai); • Käy läpi linkitetyn listan, vapauttaen muistin
getnameinfo • Vastakohta getaddrinfo:lle • Etsii osoitetta vastaavan nimen #include <netdb.h> int getnameinfo(const struct sockaddr *sockaddr, socklen_t addrlen, char *host, socklen_t hostlen, char *serv, socklen_t servlen); • Pituuden (hostlen, servlen) avulla määrätään mitä halutaan • Käyttäjän pitää varata muisti
re-entrant • gethostbyname ja gethostbyaddr -funktiot käyttävät staattista muuttujaa sockaddr:n tallentamiseen • Ongelmia säikeiden kanssa • gethostbyname_r • gethostbyaddr_r • Käyttäjän pitää varata muistiä • Käytännössä pitää varata maksimi
Hylättyjä IPv6 funktioita • gethostbyname2 • Toimii samaan tapaan kuin gethostbyname jos AF on IPv4 • getipnodebyname & freehostent • Korvattu getaddrinfo funktiolla • Varasi dynaamisesti muistin hostent-rakenteelle
Yhteenveto • gethostbyname ja gethostbyaddr olivat ensimmäisiä tähän tarkoitukseen käytettyjä funktioita • getaddrinfo ja getnameinfo ovat IPv6:n myötä tulleet uudet vastineet • getservbyname funktiota käytetään palvelun nimen ja porttien kanssa toimimiseen • Tämän tarjoamat tiedot pohjautuvat yleensä tekstitiedostoon • Esitettyjen tapojen lisäksi on olemassa res_ -alkuisia funktioita