Advanced UNIX programming Fall 2002 Instructor: Ashok Srinivasan Lecture 25 Acknowledgements: The syllabus and power point presentations are modified versions of those by T. Baker and X. Yuan Announcements • Reading assignment – Chapter 9 • Sections 9.1 to 9.9 – Midterm Monday – Clarifications on project and HW3 – Midterm review Week 9 Topics • Socket options – getsockopt, setsockopt – fcntl – ioctl • Introduction to UDP – TCP vs UDP – UDP interface Week 9 Topics ... continued • Name and address conversions – Domain name system – gethostbyname – gethostbyaddr – uname – gethostname – getservbyname – getservbyport Name and address conversions • Names are easier to use – Names add a layer of indirection • Numeric addresses can be changed without modifying the name • A program can be more portable by using a name – The mapping between hostnames and IP addresses is done by the domain name system (DNS) Domain name system • Mapping between names and addresses • xi.cs.fsu.edu <--> 128.186.121.41 • References – See http://www.internic.net/faqs/authoritativedns.html for information on • DNS organization • Why they should be the sole authority! Domain name system ... continued • Hierarchical naming scheme – Name space partitioned into subdomains – Top level of domains • .com, .edu, .gov, .org, .us, .ca, .in, etc – Each domain can have subdomains • Distributed delegation of naming authority – Each domain has the authority to allow names within that domain – Naming follows organization boundary not physical network boundary Resource records • Each server keeps resource records (RRs) – Information • IP address, record type, name, etc • Some relevant RR types – A : Maps a hostname to an IPv4 address – AAAA: Maps a hostname to an IPv6 address – PTR: Pointer records, map IP addresses to hostnames – MX: Mail exchanger for a host – CNAME: Canonical name • Used to assign CNAME records for common services Name servers • Name server – When a name server receives a DNS request, if the server is the authority for the name, it finds the resource record and replies – Otherwise it recursively asks the next level • Example: gethostbyname(“www.cs.yale.edu”) xi.cs.fsu.edu ---> cs.fsu.edu --> edu --> yale.edu -->cs.yale.edu -->yale.edu-->edu -->cs.fsu.edu-->xi.cs.fsu.edu – Optimizations • Replication and caching gethostbyname #include <netdb.h> struct hostent *gethostbyname(const char *hostname) struct hostent { char *h_name; char **h_aliases; int h_addrtype; int h_length; char **h_addr_list; }; • This function queries A or AAAA records gethostbyaddr #include <netdb.h> struct hostent *gethostbyaddr(const char *addr, size_t len, int family) – addr is a pointer to an in_addr structure – len = 4 for IPv4 and 16 for IPv6 – This function queries PTR records • See example1.c and example2.c – These two system calls incur significant communication overhead • You can observe this in example1a.c uname and gethostbyname • • Information on name, os, and hardware #include <sys/utsname.h> int uname (struct utsname *name) struct utsname { char sysname[_UTS_NAMESIZE]; char nodename[_UTS_NODESIZE]; char release[_UTS_NAMESIZE]; char version[_UTS_NAMESIZE]; char machine[_UTS_NAMESIZE]; } – See example2.c – gethostbyname can be used to get host name getservbyname and getservbyport • Get service information – Not querying the DNS, but a system specific file, for example /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; char** s_aliases; int s_port; char *s_proto; } • See example3.c and example4.c