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
• 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
– The mapping between hostnames and IP
addresses is done by the domain name
system (DNS)
Domain name system
• Mapping between names and
• <-->
• References
– See 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
– 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
– 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
– Otherwise it recursively asks the next level
• Example: gethostbyname(“”) ---> --> edu --> --> -->>edu
– Optimizations
• Replication and caching
#include <netdb.h>
struct hostent *gethostbyname(const char
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
#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
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

Advanced UNIX programming Fall 2002 Instructor: Ashok Srinivasan Lecture 25