25.01.2015 Views

C Socket Programming Tutorial- Writing Client/Server Programs in C ...

C Socket Programming Tutorial- Writing Client/Server Programs in C ...

C Socket Programming Tutorial- Writing Client/Server Programs in C ...

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

C <strong>Socket</strong> <strong>Programm<strong>in</strong>g</strong> <strong>Tutorial</strong> SHARE Session 5958<br />

<strong>Writ<strong>in</strong>g</strong> <strong>Client</strong>/<strong>Server</strong> <strong>Programs</strong> <strong>in</strong> C<br />

Us<strong>in</strong>g <strong>Socket</strong>s (A <strong>Tutorial</strong>)<br />

Part I<br />

Session 5958<br />

Greg Granger<br />

grgran@sas<br />

sas.com<br />

SAS Slide 1<br />

Institute Inc.<br />

SAS/C & C++ Compiler R&D<br />

Cary, NC Feb. 1998<br />

Cary, NC<br />

SAS/C & C++ Support<br />

SAS Institute<br />

Cary, NC


C <strong>Socket</strong> <strong>Programm<strong>in</strong>g</strong> <strong>Tutorial</strong> SHARE Session 5958<br />

Part I: <strong>Socket</strong> <strong>Programm<strong>in</strong>g</strong> Overview<br />

<strong>Socket</strong>s (to me)<br />

Network<strong>in</strong>g (or what’s natural about natural logs)<br />

TCP/IP (and what it means to your life)<br />

More <strong>Socket</strong>s (we didn’t get enough the first time)<br />

SAS Slide 2<br />

Institute Inc.<br />

SAS/C & C++ Compiler R&D<br />

Cary, NC Feb. 1998<br />

Cary, NC


C <strong>Socket</strong> <strong>Programm<strong>in</strong>g</strong> <strong>Tutorial</strong> SHARE Session 5958<br />

What is “<strong>Socket</strong>s”<br />

An Application <strong>Programm<strong>in</strong>g</strong> Interface (API) used<br />

for InterProcess Communications (IPC). [A well<br />

def<strong>in</strong>ed method of connect<strong>in</strong>g two processes,<br />

locally or across a network]<br />

Protocol and Language Independent<br />

Often referred to as Berkeley <strong>Socket</strong>s or BSD<br />

<strong>Socket</strong>s<br />

SAS Slide 3<br />

Institute Inc.<br />

SAS/C & C++ Compiler R&D<br />

Cary, NC Feb. 1998<br />

Cary, NC


C <strong>Socket</strong> <strong>Programm<strong>in</strong>g</strong> <strong>Tutorial</strong> SHARE Session 5958<br />

Connections and Associations<br />

In <strong>Socket</strong> terms a connections between two<br />

processes <strong>in</strong> called an association.<br />

An association can be abstractly def<strong>in</strong>ed as a 5-<br />

tuple which specifies the two processes and a<br />

method of communication. For example:<br />

• {protocol, local-addr, local-process, foreign-addr, foreign-process}<br />

A half-association is a s<strong>in</strong>gle “side” of an<br />

association (a 3-tuple<br />

tuple)<br />

• {protocol, addr, process}<br />

SAS Slide 4<br />

Institute Inc.<br />

SAS/C & C++ Compiler R&D<br />

Cary, NC Feb. 1998<br />

Cary, NC


C <strong>Socket</strong> <strong>Programm<strong>in</strong>g</strong> <strong>Tutorial</strong> SHARE Session 5958<br />

Network<strong>in</strong>g Terms<br />

packet - the smallest unit that can be transferred<br />

“through” the network by itself<br />

protocol - a set of rules and conventions between<br />

the communicat<strong>in</strong>g participants<br />

A collection of protocol layers is referred to as a<br />

“protocol suite”, “protocol family” or “protocol<br />

stack”. TCP/IP is one such protocol suite.<br />

SAS Slide 5<br />

Institute Inc.<br />

SAS/C & C++ Compiler R&D<br />

Cary, NC Feb. 1998<br />

Cary, NC


C <strong>Socket</strong> <strong>Programm<strong>in</strong>g</strong> <strong>Tutorial</strong> SHARE Session 5958<br />

Introduction to TCP/IP<br />

What (the heck) is TCP/IP<br />

Internet Protocol (IP)<br />

User Datagram Protocol (UDP)<br />

Transmission Control Protocol (TCP)<br />

TCP/IP Applications<br />

Name Resolution Process<strong>in</strong>g<br />

TCP/IP Network Diagram<br />

SAS Slide 6<br />

Institute Inc.<br />

SAS/C & C++ Compiler R&D<br />

Cary, NC Feb. 1998<br />

Cary, NC


C <strong>Socket</strong> <strong>Programm<strong>in</strong>g</strong> <strong>Tutorial</strong> SHARE Session 5958<br />

What is TCP/IP<br />

Transmission Control Protocol/Internet Protocol<br />

A network protocol suite for <strong>in</strong>terprocess<br />

communication<br />

The protocol of the Internet<br />

Open, nonproprietary<br />

Integrated <strong>in</strong>to UNIX operat<strong>in</strong>g systems<br />

Many popular network<strong>in</strong>g applications<br />

• telnet • NFS (network file system)<br />

• X11 GUI • SMTP (mail)<br />

• www • ftp (file transfer protocol)<br />

SAS Slide 7<br />

Institute Inc.<br />

SAS/C & C++ Compiler R&D<br />

Cary, NC Feb. 1998<br />

Cary, NC


C <strong>Socket</strong> <strong>Programm<strong>in</strong>g</strong> <strong>Tutorial</strong> SHARE Session 5958<br />

TCP/IP Architectural Model<br />

Process (message)<br />

REXEC / SMTP / TELNET / FTP<br />

/ DNS / RPC / Local Apps.<br />

Transport (message)<br />

TCP<br />

UDP<br />

Network (packets)<br />

ICMP<br />

IP<br />

(R)ARP<br />

Data L<strong>in</strong>k (frames)<br />

Ethernet Token-R<strong>in</strong>g FDDI X.25<br />

SNA Hyperchannel Proprietary<br />

SAS Slide 8<br />

Institute Inc.<br />

SAS/C & C++ Compiler R&D<br />

Cary, NC Feb. 1998<br />

Cary, NC


C <strong>Socket</strong> <strong>Programm<strong>in</strong>g</strong> <strong>Tutorial</strong> SHARE Session 5958<br />

Internet Protocol (IP)<br />

Establishes a “virtual” network between hosts,<br />

<strong>in</strong>dependent of the underly<strong>in</strong>g network topology<br />

Provides “rout<strong>in</strong>g” throughout the network, us<strong>in</strong>g<br />

IP address<strong>in</strong>g. For example: 149.173.70.9<br />

Features<br />

• Best-effort packet delivery<br />

• Connectionless (stateless)<br />

• Unreliable<br />

TCP<br />

IP<br />

UDP<br />

Physical Network<br />

SAS Slide 9<br />

Institute Inc.<br />

SAS/C & C++ Compiler R&D<br />

Cary, NC Feb. 1998<br />

Cary, NC


C <strong>Socket</strong> <strong>Programm<strong>in</strong>g</strong> <strong>Tutorial</strong> SHARE Session 5958<br />

User Datagram Protocol (UDP)<br />

Application Interface to IP - Packet Oriented<br />

Establishes a “port”, which allows IP to dist<strong>in</strong>guish<br />

among processes runn<strong>in</strong>g on the same host<br />

Features resemble IP semantics<br />

• Connectionless<br />

• Unreliable<br />

• Checksums (optional)<br />

TCP<br />

IP<br />

UDP<br />

Physical Network<br />

SAS Slide 10<br />

Institute Inc.<br />

SAS/C & C++ Compiler R&D<br />

Cary, NC Feb. 1998<br />

Cary, NC


C <strong>Socket</strong> <strong>Programm<strong>in</strong>g</strong> <strong>Tutorial</strong> SHARE Session 5958<br />

Transmission Control Protocol (TCP)<br />

Connection-oriented<br />

Stream Data Transfer<br />

Reliable<br />

Flow-Control<br />

Full-Duplex<br />

TCP<br />

Suited for critical data transfer applications<br />

IP<br />

UDP<br />

Physical Network<br />

SAS Slide 11<br />

Institute Inc.<br />

SAS/C & C++ Compiler R&D<br />

Cary, NC Feb. 1998<br />

Cary, NC


C <strong>Socket</strong> <strong>Programm<strong>in</strong>g</strong> <strong>Tutorial</strong> SHARE Session 5958<br />

SAS Slide 12<br />

Institute Inc.<br />

SAS/C & C++ Compiler R&D<br />

Cary, NC Feb. 1998<br />

Cary, NC<br />

The Importance of Ports<br />

Both the TCP and UDP protocols use 16 bit<br />

identifiers called ports to uniquely identify the<br />

processes <strong>in</strong>volved <strong>in</strong> a socket.<br />

In UNIX the first 1024 ports for both protocols are<br />

called “well known ports” and are def<strong>in</strong>ed <strong>in</strong> the file<br />

/etc/services. <strong>Programs</strong> that b<strong>in</strong>d to these ports<br />

require “root” access.<br />

These numbers are managed by the Internet<br />

Assigned Numbers Authority (IANA). A complete<br />

list of these assignments and more <strong>in</strong>formation<br />

about IANA can be found <strong>in</strong> RFC 1700


C <strong>Socket</strong> <strong>Programm<strong>in</strong>g</strong> <strong>Tutorial</strong> SHARE Session 5958<br />

How stuff gets around (rout<strong>in</strong>g)<br />

TCP/IP packets are routed based on their<br />

dest<strong>in</strong>ation IP address (ex: 10.24.2.123)<br />

Packets are passed from one network segment to<br />

another by mach<strong>in</strong>es called “routers” until the<br />

packet arrives at the network segment attached to<br />

the host with the dest<strong>in</strong>ation IP address.<br />

Routers that act as gates to larger networks are<br />

called gateways.<br />

SAS Slide 13<br />

Institute Inc.<br />

SAS/C & C++ Compiler R&D<br />

Cary, NC Feb. 1998<br />

Cary, NC


C <strong>Socket</strong> <strong>Programm<strong>in</strong>g</strong> <strong>Tutorial</strong> SHARE Session 5958<br />

<br />

<br />

<br />

<br />

<br />

<br />

Name Resolution Process<strong>in</strong>g<br />

Associates an IP address to a “name” (hostname)<br />

Structured method of identify<strong>in</strong>g hosts with<strong>in</strong> an <strong>in</strong>ternet<br />

The Doma<strong>in</strong> Name System (DNS) implements a hierarchical<br />

nam<strong>in</strong>g scheme which maps names like “mvs“<br />

mvs.sas.com” to<br />

an IP address<br />

DNS is implemented by a set of cooperat<strong>in</strong>g servers<br />

Mach<strong>in</strong>es that process DNS requests are called nameservers<br />

A set of library rout<strong>in</strong>es called “the resolver” ” provide the<br />

logic to query nameservers<br />

SAS Slide 14<br />

Institute Inc.<br />

SAS/C & C++ Compiler R&D<br />

Cary, NC Feb. 1998<br />

Cary, NC


C <strong>Socket</strong> <strong>Programm<strong>in</strong>g</strong> <strong>Tutorial</strong> SHARE Session 5958<br />

TCP Ports<br />

TCP/UDP/IP Diagram<br />

64K<br />

Dev1.sas.com<br />

(149.179.3.3)<br />

REXEC<br />

<strong>Server</strong><br />

port 512<br />

1023<br />

Well-known Ports<br />

0<br />

0<br />

Well-known Ports<br />

1023<br />

IP Rout<strong>in</strong>g<br />

REXEC client<br />

REXEC client<br />

Dev2.sas.com<br />

(149.179.83.6)<br />

UDP Ports<br />

64K<br />

<strong>in</strong>ternet<br />

<strong>Server</strong>1.net.sas.com<br />

(149.193.2.194)<br />

Name<strong>Server</strong><br />

SAS Slide 15<br />

Institute Inc.<br />

SAS/C & C++ Compiler R&D<br />

Cary, NC Feb. 1998<br />

Cary, NC


C <strong>Socket</strong> <strong>Programm<strong>in</strong>g</strong> <strong>Tutorial</strong> SHARE Session 5958<br />

Back to <strong>Socket</strong>s<br />

<strong>Socket</strong> Def<strong>in</strong>ition and Components<br />

<strong>Socket</strong> Library Functions<br />

Primary <strong>Socket</strong> Header Files<br />

Sample <strong>Client</strong>/<strong>Server</strong> Dialog<br />

Ancillary <strong>Socket</strong> Topics<br />

Beyond <strong>Socket</strong>s<br />

SAS Slide 16<br />

Institute Inc.<br />

SAS/C & C++ Compiler R&D<br />

Cary, NC Feb. 1998<br />

Cary, NC


C <strong>Socket</strong> <strong>Programm<strong>in</strong>g</strong> <strong>Tutorial</strong> SHARE Session 5958<br />

Def<strong>in</strong>ition and Components<br />

<strong>Socket</strong> - endpo<strong>in</strong>t of communication<br />

<strong>Socket</strong>s - An application programm<strong>in</strong>g <strong>in</strong>terface<br />

(API) for <strong>in</strong>terprocess communication (IPC)<br />

Attributes:<br />

• Protocol Independent<br />

• Language Independent<br />

• <strong>Socket</strong>s implies (not requires) TCP/IP and C<br />

<strong>Socket</strong> and Connection Association<br />

• A local host can be identified by it’s protocol, IP address and port.<br />

• A connection adds the IP address & port of the remote host.<br />

SAS Slide 17<br />

Institute Inc.<br />

SAS/C & C++ Compiler R&D<br />

Cary, NC Feb. 1998<br />

Cary, NC


C <strong>Socket</strong> <strong>Programm<strong>in</strong>g</strong> <strong>Tutorial</strong> SHARE Session 5958<br />

System calls<br />

SAS Slide 18<br />

Institute Inc.<br />

SAS/C & C++ Compiler R&D<br />

Cary, NC Feb. 1998<br />

Cary, NC<br />

• startup / close<br />

• data transfer<br />

• options control<br />

• other<br />

<strong>Socket</strong> Library Function<br />

Network configuration lookup<br />

• host address<br />

• ports for services<br />

• other<br />

Utility functions<br />

• data conversion<br />

• address manipulation<br />

• error handl<strong>in</strong>g


C <strong>Socket</strong> <strong>Programm<strong>in</strong>g</strong> <strong>Tutorial</strong> SHARE Session 5958<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

socket()<br />

b<strong>in</strong>d()<br />

listen()<br />

accept()<br />

Primary <strong>Socket</strong> Calls<br />

- create a new socket and return its descriptor<br />

- associate a socket with a port and address<br />

- establish queue for connection requests<br />

- accept a connection request<br />

- <strong>in</strong>itiate a connection to a remote host<br />

connect() - <strong>in</strong>itiate a connection to a remote host<br />

recv()<br />

- receive data from a socket descriptor<br />

send()<br />

- send data to a socket descriptor<br />

close()<br />

- “one-way” close of a socket descriptor<br />

SAS Slide 19<br />

Institute Inc.<br />

SAS/C & C++ Compiler R&D<br />

Cary, NC Feb. 1998<br />

Cary, NC


C <strong>Socket</strong> <strong>Programm<strong>in</strong>g</strong> <strong>Tutorial</strong> SHARE Session 5958<br />

<br />

<br />

<br />

<br />

<br />

<br />

Network Database Adm<strong>in</strong>istration functions<br />

gethostbyname - given a hostname, returns a structure<br />

which specifies its DNS name(s) and IP address(es<br />

es)<br />

getservbyname - given service name and protocol, returns a<br />

structure which specifies its name(s) and its port address<br />

gethostname - returns hostname of local host<br />

getservbyname, getservbyport, getservent<br />

getprotobyname, getprotobynumber, getprotobyent<br />

getnetbyname, getnetbyaddr, getnetent<br />

SAS Slide 20<br />

Institute Inc.<br />

SAS/C & C++ Compiler R&D<br />

Cary, NC Feb. 1998<br />

Cary, NC


C <strong>Socket</strong> <strong>Programm<strong>in</strong>g</strong> <strong>Tutorial</strong> SHARE Session 5958<br />

<br />

<br />

<br />

<br />

<br />

<strong>Socket</strong> Utility Functions<br />

ntohs/ntohl<br />

ntohl - convert short/long from network byte order<br />

(big endian) ) to host byte order<br />

htons/htonl<br />

htonl - convert short/long from host byte order to<br />

network byte order<br />

<strong>in</strong>et_ntoa<br />

ntoa/<strong>in</strong>et_addr<br />

- convert 32-bit IP address (network<br />

byte order to/from a dotted decimal str<strong>in</strong>g)<br />

perror() - pr<strong>in</strong>t error message (based on “errno“<br />

errno”) to stderr<br />

herror() - pr<strong>in</strong>t error message for gethostbyname() to stderr<br />

(used with DNS)<br />

SAS Slide 21<br />

Institute Inc.<br />

SAS/C & C++ Compiler R&D<br />

Cary, NC Feb. 1998<br />

Cary, NC


C <strong>Socket</strong> <strong>Programm<strong>in</strong>g</strong> <strong>Tutorial</strong> SHARE Session 5958<br />

<br />

Primary Header Files<br />

Include file sequence may affect process<strong>in</strong>g (order is<br />

important!)<br />

• <br />

- prerequisite typedefs<br />

• <br />

- names for “errno“<br />

errno” ” values (error numbers)<br />

- struct sockaddr; ; system prototypes and constants<br />

• <br />

• <br />

• <br />

• <br />

- network <strong>in</strong>fo lookup prototypes and structures<br />

- struct sockaddr_<strong>in</strong>; byte order<strong>in</strong>g macros<br />

- utility function prototypes<br />

SAS Slide 22<br />

Institute Inc.<br />

SAS/C & C++ Compiler R&D<br />

Cary, NC Feb. 1998<br />

Cary, NC


C <strong>Socket</strong> <strong>Programm<strong>in</strong>g</strong> <strong>Tutorial</strong> SHARE Session 5958<br />

Sample TCP <strong>Client</strong> / <strong>Server</strong> Session<br />

Iterative <strong>Server</strong><br />

socket()<br />

b<strong>in</strong>d()<br />

Remote <strong>Client</strong><br />

socket()<br />

listen()<br />

gethostbyname()<br />

accept()<br />

connect()<br />

recv()/send()<br />

recv()/send()<br />

close()<br />

close()<br />

SAS Slide 23<br />

Institute Inc.<br />

SAS/C & C++ Compiler R&D<br />

Cary, NC Feb. 1998<br />

Cary, NC


C <strong>Socket</strong> <strong>Programm<strong>in</strong>g</strong> <strong>Tutorial</strong> SHARE Session 5958<br />

<br />

<br />

<br />

<br />

<br />

Ancillary <strong>Socket</strong> Topics<br />

UDP versus TCP<br />

Controll<strong>in</strong>g/manag<strong>in</strong>g socket characteristics<br />

• get/setsockopt<br />

setsockopt() - keepalive, , reuse, nodelay<br />

• fcntl() - async signals, block<strong>in</strong>g<br />

• ioctl() - file, socket, rout<strong>in</strong>g, <strong>in</strong>terface options<br />

Block<strong>in</strong>g versus Non-block<strong>in</strong>g socket<br />

Signal based socket programm<strong>in</strong>g (SIGIO)<br />

Implementation specific functions<br />

SAS Slide 24<br />

Institute Inc.<br />

SAS/C & C++ Compiler R&D<br />

Cary, NC Feb. 1998<br />

Cary, NC


C <strong>Socket</strong> <strong>Programm<strong>in</strong>g</strong> <strong>Tutorial</strong> SHARE Session 5958<br />

<br />

<br />

<br />

<br />

Design Considerations<br />

Data representation and conversion<br />

<strong>Server</strong> design alternatives<br />

Security Issues<br />

Portability Considerations<br />

SAS Slide 25<br />

Institute Inc.<br />

SAS/C & C++ Compiler R&D<br />

Cary, NC Feb. 1998<br />

Cary, NC


C <strong>Socket</strong> <strong>Programm<strong>in</strong>g</strong> <strong>Tutorial</strong> SHARE Session 5958<br />

<br />

<br />

<br />

<br />

<br />

Data Representation<br />

Transport Protocols detail data exchange/movement;<br />

applications must <strong>in</strong>terpret the data!<br />

Byte order affects data - not just addresses<br />

Text is often sent <strong>in</strong> ASCII, but ASCII versus EBCDIC is<br />

decided by the application-level protocol<br />

Structure alignment and float<strong>in</strong>g po<strong>in</strong>t pose problems<br />

External Data Representation (XDR) can be used (even<br />

without RPC)<br />

SAS Slide 26<br />

Institute Inc.<br />

SAS/C & C++ Compiler R&D<br />

Cary, NC Feb. 1998<br />

Cary, NC


C <strong>Socket</strong> <strong>Programm<strong>in</strong>g</strong> <strong>Tutorial</strong> SHARE Session 5958<br />

<br />

<br />

<br />

SAS Slide 27<br />

Institute Inc.<br />

SAS/C & C++ Compiler R&D<br />

Cary, NC Feb. 1998<br />

Cary, NC<br />

S<strong>in</strong>gle Threaded<br />

• more complex code (must track multiple concurrent requests)<br />

• generally lower system overhead<br />

• crash of thread disables service<br />

Multi-Task<strong>in</strong>g<br />

• less complex code (written only for handl<strong>in</strong>g only one connection)<br />

• higher system overhead (each task requires it’s own process space)<br />

• highly crash resistant (one or more tasks can fail without los<strong>in</strong>g<br />

service)<br />

[Multi-]Threaded<br />

<strong>Server</strong> Design Alternatives<br />

• shares less complex code of Multi-Task<strong>in</strong>g model<br />

• system overhead between S<strong>in</strong>gle-Threaded and Multi-Task<strong>in</strong>g model<br />

• crash resistant (but one badly behaved thread ‘can’ crash service)


C <strong>Socket</strong> <strong>Programm<strong>in</strong>g</strong> <strong>Tutorial</strong> SHARE Session 5958<br />

<br />

<br />

<br />

<br />

Security Considerations<br />

<strong>Socket</strong> semantics do NOT address security problems, such<br />

as:<br />

• IP and adapter addresses<br />

• Userid and passwords<br />

• data encryption<br />

• traces<br />

UNIX systems require “root” privilege when a program b<strong>in</strong>ds<br />

a “reserved” (


C <strong>Socket</strong> <strong>Programm<strong>in</strong>g</strong> <strong>Tutorial</strong> SHARE Session 5958<br />

Limit applications to “standard” socket rout<strong>in</strong>es, BSD 4.x<br />

Implement a portable transport module<br />

Ma<strong>in</strong>frame Environment - Distribute exist<strong>in</strong>g applications<br />

<br />

<br />

Portability Considerations<br />

• API Programmer’s Reference - Details<br />

• SAS/C, C/370, Interl<strong>in</strong>k, , Open Connect, NSC<br />

OS/2 - REXX <strong>Socket</strong>s, Programmer’s Toolkit<br />

MS W<strong>in</strong>dows <strong>Socket</strong>s 1.1 - 2 WINSOCK.DLL<br />

(http://www.stardust.com ftp.stardust.com:/pub/w<strong>in</strong>sock<br />

w<strong>in</strong>sock)<br />

SAS Slide 29<br />

Institute Inc.<br />

SAS/C & C++ Compiler R&D<br />

Cary, NC Feb. 1998<br />

Cary, NC


C <strong>Socket</strong> <strong>Programm<strong>in</strong>g</strong> <strong>Tutorial</strong> SHARE Session 5958<br />

<br />

<br />

<br />

<br />

Summary<br />

Basic network<strong>in</strong>g and features of TCP/IP protocols<br />

<strong>Socket</strong> library organization<br />

<strong>Socket</strong> library cod<strong>in</strong>g techniques<br />

Awareness of more advanced topics<br />

What’s Next<br />

<br />

Session 5959 - Part II - <strong>Client</strong>/<strong>Server</strong> Application<br />

SAS Slide 30<br />

Institute Inc.<br />

SAS/C & C++ Compiler R&D<br />

Cary, NC Feb. 1998<br />

Cary, NC


C <strong>Socket</strong> <strong>Programm<strong>in</strong>g</strong> <strong>Tutorial</strong> SHARE Session 5958<br />

Bibliography<br />

Internetwork<strong>in</strong>g with TCP/IP: Volumes I, II & III, Douglas<br />

Comer, Prentice Hall, 1991 (ISBN Vol I: 0134685059, Vol<br />

III: 0138487146)<br />

The Whole Internet User’s Guide & Catalog by Ed Kroll;<br />

O’Reilly & Associates<br />

UNIX Network <strong>Programm<strong>in</strong>g</strong> by W. Richard Stevens;<br />

Prentice Hall, 1990 (ISBN 0139498761)<br />

<strong>Socket</strong> API Programmer’s Reference<br />

UNIX “man” pages<br />

TCP/IP Illustrated: Volumes 1 & 2, W. Richard Stevens (v2<br />

with Gary R. Wright); Addison-Wesley Publish<strong>in</strong>g Company,<br />

1994<br />

SAS Slide 31<br />

Institute Inc.<br />

SAS/C & C++ Compiler R&D<br />

Cary, NC Feb. 1998<br />

Cary, NC

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!