Advanced UNIX programming Fall 2002 Instructor: Ashok Srinivasan Lecture 25

advertisement
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
Download