Book description
UNIX Network Programming, Volume 1: The Sockets Networking API, Third Edition
"Everyone will want this book because it provides a great mix of practical experience, historical perspective, and a depth of understanding that only comes from being intimately involved in the field. I've already enjoyed and learned from reading this book, and surely you will too."
--Sam Leffler
The classic guide to UNIX networking APIs... now completely updated!
To build today's highly distributed, networked applications and services, you need deep mastery of sockets and other key networking APIs. One book delivers comprehensive, start-to-finish guidance for building robust, high-performance networked systems in any environment: UNIX Network Programming, Volume 1, Third Edition.
Building on the legendary work of W. Richard Stevens, this edition has been fully updated by two leading network programming experts to address today's most crucial standards, implementations, and techniques. New topics include:
POSIX Single UNIX Specification Version 3
IPv6 APIs (including updated guidance on IPv6/IPv4 interoperability)
The new SCTP transport protocol
IPsec-based Key Management Sockets
FreeBSD 4.8/5.1, Red Hat Linux 9.x, Solaris 9, AIX 5.x, HP-UX, and Mac OS X implementations
New network program debugging techniques
Source Specific Multicast API, the key enabler for widespread IP multicast deployment
The authors also update and extend Stevens' definitive coverage of these crucial UNIX networking standards and techniques:
TCP and UDP transport
Sockets: elementary, advanced, routed, and raw
I/O: multiplexing, advanced functions, nonblocking, and signal-driven
Daemons and inetd
UNIX domain protocols
ioctl operations
Broadcasting and multicasting
Threads
Streams
Design: TCP iterative, concurrent, preforked, and prethreaded servers
Since 1990, network programmers have turned to one source for the insights and techniques they need: W. Richard Stevens' UNIX Network Programming. Now, there's an edition specifically designed for today's challenges--and tomorrow's.
Table of contents
-
The Sockets Networking API
- Addison-Wesley Professional Computing Series
- Foreword
- Preface
-
1. Introduction and TCP/IP
-
1. Introduction
-
- 1.1. Introduction
- 1.2. A Simple Daytime Client
- 1.3. Protocol Independence
- 1.4. Error Handling: Wrapper Functions
- 1.5. A Simple Daytime Server
- 1.6. Roadmap to Client/Server Examples in the Text
- 1.7. OSI Model
- 1.8. BSD Networking History
- 1.9. Test Networks and Hosts
- 1.10. Unix Standards
- 1.11. 64-Bit Architectures
- 1.12. Summary
- Exercises
-
-
2. The Transport Layer: TCP, UDP, and SCTP
-
- 2.1. Introduction
- 2.2. The Big Picture
- 2.3. User Datagram Protocol (UDP)
- 2.4. Transmission Control Protocol (TCP)
- 2.5. Stream Control Transmission Protocol (SCTP)
- 2.6. TCP Connection Establishment and Termination
- 2.7. TIME_WAIT State
- 2.8. SCTP Association Establishment and Termination
- 2.9. Port Numbers
- 2.10. TCP Port Numbers and Concurrent Servers
- 2.11. Buffer Sizes and Limitations
- 2.12. Standard Internet Services
- 2.13. Protocol Usage by Common Internet Applications
- 2.14. Summary
- Exercises
-
-
1. Introduction
-
2. Elementary Sockets
-
3. Sockets Introduction
-
- 3.1. Introduction
- 3.2. Socket Address Structures
- 3.3. Value-Result Arguments
- 3.4. Byte Ordering Functions
- 3.5. Byte Manipulation Functions
- 3.6. inet_aton, inet_addr, and inet_ntoa Functions
- 3.7. inet_pton and inet_ntop Functions
- 3.8. sock_ntop and Related Functions
- 3.9. readn, writen, and readline Functions
- 3.10. Summary
- Exercises
-
- 4. Elementary TCP Sockets
-
5. TCP Client/Server Example
-
- 5.1. Introduction
- 5.2. TCP Echo Server: main Function
- 5.3. TCP Echo Server: str_echo Function
- 5.4. TCP Echo Client: main Function
- 5.5. TCP Echo Client: str_cli Function
- 5.6. Normal Startup
- 5.7. Normal Termination
- 5.8. POSIX Signal Handling
- 5.9. Handling SIGCHLD Signals
- 5.10. wait and waitpid Functions
- 5.11. Connection Abort before accept Returns
- 5.12. Termination of Server Process
- 5.13. SIGPIPE Signal
- 5.14. Crashing of Server Host
- 5.15. Crashing and Rebooting of Server Host
- 5.16. Shutdown of Server Host
- 5.17. Summary of TCP Example
- 5.18. Data Format
- 5.19. Summary
- Exercises
-
-
6. I/O Multiplexing: The select and poll Functions
-
- 6.1. Introduction
- 6.2. I/O Models
- 6.3. select Function
- 6.4. str_cli Function (Revisited)
- 6.5. Batch Input and Buffering
- 6.6. shutdown Function
- 6.7. str_cli Function (Revisited Again)
- 6.8. TCP Echo Server (Revisited)
- 6.9. pselect Function
- 6.10. poll Function
- 6.11. TCP Echo Server (Revisited Again)
- 6.12. Summary
- Exercises
-
-
7. Socket Options
-
- 7.1. Introduction
- 7.2. getsockopt and setsockopt Functions
- 7.3. Checking if an Option Is Supported and Obtaining the Default
- 7.4. Socket States
-
7.5. Generic Socket Options
- SO_BROADCAST Socket Option
- SO_DEBUG Socket Option
- SO_DONTROUTE Socket Option
- SO_ERROR Socket Option
- SO_KEEPALIVE Socket Option
- SO_LINGER Socket Option
- SO_OOBINLINE Socket Option
- SO_RCVBUF and SO_SNDBUF Socket Options
- SO_RCVLOWAT and SO_SNDLOWAT Socket Options
- SO_RCVTIMEO and SO_SNDTIMEO Socket Options
- SO_REUSEADDR and SO_REUSEPORT Socket Options
- SO_TYPE Socket Option
- SO_USELOOPBACK Socket Option
- 7.6. IPv4 Socket Options
- 7.7. ICMPv6 Socket Option
-
7.8. IPv6 Socket Options
- IPV6_CHECKSUM Socket Option
- IPV6_DONTFRAG Socket Option
- IPV6_NEXTHOP Socket Option
- IPV6_PATHMTU Socket Option
- IPV6_RECVDSTOPTS Socket Option
- IPV6_RECVHOPLIMIT Socket Option
- IPV6_RECVHOPOPTS Socket Option
- IPV6_RECVPATHMTU Socket Option
- IPV6_RECVPKTINFO Socket Option
- IPV6_RECVRTHDR Socket Option
- IPV6_RECVTCLASS Socket Option
- IPV6_UNICAST_HOPS Socket Option
- IPV6_USE_MIN_MTU Socket Option
- IPV6_V6ONLY Socket Option
- IPV6_XXX Socket Options
- 7.9. TCP Socket Options
-
7.10. SCTP Socket Options
- SCTP_ADAPTION_LAYER Socket Option
- SCTP_ASSOCINFO Socket Option
- SCTP_AUTOCLOSE Socket Option
- SCTP_DEFAULT_SEND_PARAM Socket Option
- SCTP_DISABLE_FRAGMENTS Socket Option
- SCTP_EVENTS Socket Option
- SCTP_GET_PEER_ADDR_INFO Socket Option
- SCTP_I_WANT_MAPPED_V4_ADDR Socket Option
- SCTP_INITMSG Socket Option
- SCTP_MAXBURST Socket Option
- SCTP_MAXSEG Socket Option
- SCTP_NODELAY Socket Option
- SCTP_PEER_ADDR_PARAMS Socket Option
- SCTP_PRIMARY_ADDR Socket Option
- SCTP_RTOINFO Socket Option
- SCTP_SET_PEER_PRIMARY_ADDR Socket Option
- SCTP_STATUS Socket Option
- 7.11. fcntl Function
- 7.12. Summary
- Exercises
-
-
8. Elementary UDP Sockets
-
- 8.1. Introduction
- 8.2. recvfrom and sendto Functions
- 8.3. UDP Echo Server: main Function
- 8.4. UDP Echo Server: dg_echo Function
- 8.5. UDP Echo Client: main Function
- 8.6. UDP Echo Client: dg_cli Function
- 8.7. Lost Datagrams
- 8.8. Verifying Received Response
- 8.9. Server Not Running
- 8.10. Summary of UDP Example
- 8.11. connect Function with UDP
- 8.12. dg_cli Function (Revisited)
- 8.13. Lack of Flow Control with UDP
- 8.14. Determining Outgoing Interface with UDP
- 8.15. TCP and UDP Echo Server Using select
- 8.16. Summary
- Exercises
-
-
9. Elementary SCTP Sockets
-
- 9.1. Introduction
- 9.2. Interface Models
- 9.3. sctp_bindx Function
- 9.4. sctp_connectx Function
- 9.5. sctp_getpaddrs Function
- 9.6. sctp_freepaddrs Function
- 9.7. sctp_getladdrs Function
- 9.8. sctp_freeladdrs Function
- 9.9. sctp_sendmsg Function
- 9.10. sctp_recvmsg Function
- 9.11. sctp_opt_info Function
- 9.12. sctp_peeloff Function
- 9.13. shutdown Function
- 9.14. Notifications
- 9.15. Summary
- Exercises
-
-
10. SCTP Client/Server Example
-
- 10.1. Introduction
- 10.2. SCTP One-to-Many-Style Streaming Echo Server: main Function
- 10.3. SCTP One-to-Many-Style Streaming Echo Client: main Function
- 10.4. SCTP Streaming Echo Client: str_cli Function
- 10.5. Exploring Head-of-Line Blocking
- 10.6. Controlling the Number of Streams
- 10.7. Controlling Termination
- 10.8. Summary
- Exercises
-
-
11. Name and Address Conversions
-
- 11.1. Introduction
- 11.2. Domain Name System (DNS)
- 11.3. gethostbyname Function
- 11.4. gethostbyaddr Function
- 11.5. getservbyname and getservbyport Functions
- 11.6. getaddrinfo Function
- 11.7. gai_strerror Function
- 11.8. freeaddrinfo Function
- 11.9. getaddrinfo Function: IPv6
- 11.10. getaddrinfo Function: Examples
- 11.11. host_serv Function
- 11.12. tcp_connect Function
- 11.13. tcp_listen Function
- 11.14. udp_client Function
- 11.15. udp_connect Function
- 11.16. udp_server Function
- 11.17. getnameinfo Function
- 11.18. Re-entrant Functions
- 11.19. gethostbyname_r and gethostbyaddr_r Functions
- 11.20. Obsolete IPv6 Address Lookup Functions
- 11.21. Other Networking Information
- 11.22. Summary
- Exercises
-
-
3. Sockets Introduction
-
3. Advanced Sockets
- 12. IPv4 and IPv6 Interoperability
- 13. Daemon Processes and the inetd Superserver
-
14. Advanced I/O Functions
-
- 14.1. Introduction
- 14.2. Socket Timeouts
- 14.3. recv and send Functions
- 14.4. readv and writev Functions
- 14.5. recvmsg and sendmsg Functions
- 14.6. Ancillary Data
- 14.7. How Much Data Is Queued?
- 14.8. Sockets and Standard I/O
- 14.9. Advanced Polling
- 14.10. Summary
- Exercises
-
- 15. Unix Domain Protocols
-
16. Nonblocking I/O
-
- 16.1. Introduction
-
16.2. Nonblocking Reads and Writes: str_cli Function (Revisited)
- Set descriptors to nonblocking
- Initialize buffer pointers
- Main loop: prepare to call select
- Specify descriptors we are interested in
- Call select
- read from standard input
- Handle nonblocking error
- read returns EOF
- read returns data
- read from socket
- write to standard output
- write OK
- write to socket
- A Simpler Version of str_cli
- Timing of str_cli
- 16.3. Nonblocking connect
- 16.4. Nonblocking connect: Daytime Client
-
16.5. Nonblocking connect: Web Client
- Define file structure
- Define globals and function prototypes
- Process command-line arguments
- Read home page
- Initialize globals
- Establish connection with server
- Send HTTP command to server, read reply
- Create socket, set to nonblocking
- Initiate nonblocking connect
- Handle connection complete
- Build command and send it
- Set flags
- Initiate another connection, if possible
- select: wait for something to happen
- Handle all ready descriptors
- See if descriptor has data
- Performance of Simultaneous Connections
- 16.6. Nonblocking accept
- 16.7. Summary
- Exercises
-
- 17. ioctl Operations
- 18. Routing Sockets
- 19. Key Management Sockets
-
20. Broadcasting
-
- 20.1. Introduction
- 20.2. Broadcast Addresses
- 20.3. Unicast versus Broadcast
- 20.4. dg_cli Function Using Broadcasting
- 20.5. Race Conditions
- 20.6. Summary
- Exercises
-
-
21. Multicasting
-
- 21.1. Introduction
- 21.2. Multicast Addresses
- 21.3. Multicasting versus Broadcasting on a LAN
- 21.4. Multicasting on a WAN
- 21.5. Source-Specific Multicast
-
21.6. Multicast Socket Options
- IP_ADD_MEMBERSHIP, IPV6_JOIN_GROUP, MCAST_JOIN_GROUP
- IP_DROP_MEMBERSHIP, IPV6_LEAVE_GROUP, MCAST_LEAVE_GROUP
- IP_BLOCK_SOURCE, MCAST_BLOCK_SOURCE
- IP_UNBLOCK_SOURCE, MCAST_UNBLOCK_SOURCE
- IP_ADD_SOURCE_MEMBERSHIP, MCAST_JOIN_SOURCE_GROUP
- IP_DROP_SOURCE_MEMBERSHIP, MCAST_LEAVE_SOURCE_GROUP
- IP_MULTICAST_IF, IPV6_MULTICAST_IF
- IP_MULTICAST_TTL, IPV6_MULTICAST_HOPS
- IP_MULTICAST_LOOP, IPV6_MULTICAST_LOOP
- 21.7. mcast_join and Related Functions
- 21.8. dg_cli Function Using Multicasting
- 21.9. Receiving IP Multicast Infrastructure Session Announcements
-
21.10. Sending and Receiving
- Create sending socket
- Create receiving socket and bind multicast address and port
- Join multicast group and turn off loopback
- fork and call appropriate functions
- Obtain hostname and form datagram contents
- Send datagram, then go to sleep
- Allocate socket address structure
- Read and print datagrams
- Example
- 21.11. Simple Network Time Protocol (SNTP)
- 21.12. Summary
- Exercises
-
-
22. Advanced UDP Sockets
-
- 22.1. Introduction
- 22.2. Receiving Flags, Destination IP Address, and Interface Index
- 22.3. Datagram Truncation
- 22.4. When to Use UDP Instead of TCP
- 22.5. Adding Reliability to a UDP Application
- 22.6. Binding Interface Addresses
- 22.7. Concurrent UDP Servers
- 22.8. IPv6 Packet Information
- 22.9. IPv6 Path MTU Control
- 22.10. Summary
- Exercises
-
-
23. Advanced SCTP Sockets
-
- 23.1. Introduction
- 23.2. An Autoclosing One-to-Many-Style Server
- 23.3. Partial Delivery
- 23.4. Notifications
- 23.5. Unordered Data
- 23.6. Binding a Subset of Addresses
-
23.7. Determining Peer and Local Address Information
- Set events and call echo function
- Loop waiting for message
- Check for notifications
- Loop while waiting for data
- Display message
- Check if it is notification we want
- Gather and print peer addresses
- Gather and print local addresses
- Process each address
- Print address
- Determine address size
- Move address pointer
- Running the Code
- 23.8. Finding an Association ID Given an IP Address
- 23.9. Heartbeating and Address Failure
- 23.10. Peeling Off an Association
- 23.11. Controlling Timing
- 23.12. When to Use SCTP Instead of TCP
- 23.13. Summary
- Exercises
-
- 24. Out-of-Band Data
-
25. Signal-Driven I/O
-
- 25.1. Introduction
- 25.2. Signal-Driven I/O for Sockets
-
25.3. UDP Echo Server Using SIGIO
- Queue of received datagrams
- Array indexes
- Initialize queue of received datagrams
- Establish signal handlers and set socket flags
- Initialize signal sets
- Block SIGIO and wait for something to do
- Unblock SIGIO and send reply
- Block SIGIO
- Check for queue overflow
- Read datagram
- Increment counters and index
- 25.4. Summary
- Exercises
-
-
26. Threads
-
- 26.1. Introduction
- 26.2. Basic Thread Functions: Creation and Termination
- 26.3. str_cli Function Using Threads
- 26.4. TCP Echo Server Using Threads
- 26.5. Thread-Specific Data
- 26.6. Web Client and Simultaneous Connections (Continued)
- 26.7. Mutexes: Mutual Exclusion
- 26.8. Condition Variables
- 26.9. Web Client and Simultaneous Connections (Continued)
- 26.10. Summary
- Exercises
-
-
27. IP Options
-
- 27.1. Introduction
- 27.2. IPv4 Options
- 27.3. IPv4 Source Route Options
- 27.4. IPv6 Extension Headers
- 27.5. IPv6 Hop-by-Hop Options and Destination Options
-
27.6. IPv6 Routing Header
- Create source route
- Look up destination and create socket
- Set sticky IPV6_RTHDR option and call worker function
- Turn on IPV6_RECVRTHDR option and set up msghdr struct
- Set up modifiable fields and call recvmsg
- Find and process route header
- Echo packet
- Determine number of segments in route
- Loop through each segment
- 27.7. IPv6 Sticky Options
- 27.8. Historical IPv6 Advanced API
- 27.9. Summary
- Exercises
-
-
28. Raw Sockets
-
- 28.1. Introduction
- 28.2. Raw Socket Creation
- 28.3. Raw Socket Output
- 28.4. Raw Socket Input
-
28.5. ping Program
- Include IPv4 and ICMPv4 headers
- Define proto structure
- Include IPv6 and ICMPv6 headers
- Define proto structures for IPv4 and IPv6
- Length of optional data
- Handle command-line options
- Process hostname argument
- Create socket
- Perform protocol-specific initialization
- Set socket receive buffer size
- Send first packet
- Set up msghdr for recvmsg
- Infinite loop reading all ICMP messages
- Get pointer to ICMP header
- Check for ICMP echo reply
- Print all received ICMP messages if verbose option specified
- Set ICMPv6 receive filter
- Request IPV6_HOPLIMIT ancillary data
- Get pointer to ICMPv6 header
- Check for ICMP echo reply
- Print all received ICMP messages if verbose option specified
- Build ICMPv4 message
- Calculate ICMP checksum
- Send datagram
- Internet checksum algorithm
-
28.6. traceroute Program
- Define proto structure
- Include IPv6 headers
- Define proto structures
- Set defaults
- Process command-line arguments
- Process hostname or IP address argument and finish initialization
- Create raw socket
- Set ICMPv6 receive filter
- Create UDP socket and bind source port
- Establish signal handler for SIGALRM
- Main loop; set TTL or hop limit and send three probes
- Set destination port and send UDP datagram
- Read ICMP message
- Print reply
- Set alarm and read each ICMP message
- Get pointer to ICMP header
- Process ICMP “time exceeded in transit” message
- Process ICMP “port unreachable” message
- Handle other ICMP messages
- Example
-
28.7. An ICMP Message Daemon
- UDP Echo Client That Uses Our icmpd Daemon
- UDP Echo Client Examples
-
icmpd Daemon
- client array
- Initialize client array
- Create sockets
- Check listening Unix domain socket
- Check raw ICMP sockets
- Check connected Unix domain sockets
- Read client data and possibly a descriptor
- Get port number bound to UDP socket
- Indicate success to client
- close client’s UDP socket
- Handle errors and termination of client
- Check message type, notify application
- Check for UDP error, find client
- Build icmpd_err structure
- 28.8. Summary
- Exercises
-
-
29. Datalink Access
-
- 29.1. Introduction
- 29.2. BSD Packet Filter (BPF)
- 29.3. Datalink Provider Interface (DLPI)
- 29.4. Linux: SOCK_PACKET and PF_PACKET
- 29.5. libpcap: Packet Capture Library
- 29.6. libnet: Packet Creation and Injection Library
-
29.7. Examining the UDP Checksum Field
- Process command-line options
- Process destination name and port
- Process local name and port
- Create raw socket and open packet capture device
- Change permissions and establish signal handlers
- Perform test and cleanup
- Choose packet capture device
- Open device
- Obtain network address and subnet mask
- Compile packet filter
- Load filter program
- Determine datalink type
- volatile variables
- Establish signal handler and jump buffer
- Handle siglongjmp
- Send DNS query and read reply
- Examine received UDP checksum
- Allocate buffer and initialize pointer
- Build DNS query
- Write UDP datagram
- Declare raw socket descriptor
- Create raw socket and enable IP_HDRINCL
- Initialize packet header pointers
- Zero header
- Update lengths
- Fill in UDP header and calculate UDP checksum
- Fill in IP header
- Fetch and print packet capture statistics
- Example
- libnet Output Functions
- 29.8. Summary
- Exercises
-
-
30. Client/Server Design Alternatives
-
- 30.1. Introduction
- 30.2. TCP Client Alternatives
- 30.3. TCP Test Client
- 30.4. TCP Iterative Server
- 30.5. TCP Concurrent Server, One Child per Client
- 30.6. TCP Preforked Server, No Locking Around accept
- 30.7. TCP Preforked Server, File Locking Around accept
- 30.8. TCP Preforked Server, Thread Locking Around accept
- 30.9. TCP Preforked Server, Descriptor Passing
- 30.10. TCP Concurrent Server, One Thread per Client
- 30.11. TCP Prethreaded Server, per-Thread accept
- 30.12. TCP Prethreaded Server, Main Thread accept
- 30.13. Summary
- Exercises
-
-
31. Streams
-
- 31.1. Introduction
- 31.2. Overview
- 31.3. getmsg and putmsg Functions
- 31.4. getpmsg and putpmsg Functions
- 31.5. ioctl Function
-
31.6. Transport Provider Interface (TPI)
- Open transport provider, bind local address
- Fill in server’s address, establish connection
- Read data from server, copy to standard output
- Fill in T_bind_req structure
- Call putmsg
- Call getmsg to read high-priority message
- Process reply
- Fill in request structure and send to provider
- Read response
- Wait for connection to be established
- Read control and data; process reply
- Send orderly release to peer
- 31.7. Summary
- Exercises
-
- A. IPv4, IPv6, ICMPv4, and ICMPv6
- B. Virtual Networks
- C. Debugging Techniques
- D. Miscellaneous Source Code
-
E. Solutions to Selected Exercises
- Chapter 1
- Chapter 2
- Chapter 3
- Chapter 4
- Chapter 5
- Chapter 6
- Chapter 7
- Chapter 8
- Chapter 9
- Chapter 10
- Chapter 11
- Chapter 12
- Chapter 13
- Chapter 14
- Chapter 15
- Chapter 16
- Chapter 17
- Chapter 18
- Chapter 20
- Chapter 21
- Chapter 22
- Chapter 24
- Chapter 25
- Chapter 26
- Chapter 27
- Chapter 28
- Chapter 29
- Chapter 30
- Chapter 31
- Bibliography
Product information
- Title: The Sockets Networking API: UNIX® Network Programming Volume 1, Third Edition
- Author(s):
- Release date: November 2003
- Publisher(s): Addison-Wesley Professional
- ISBN: 0131411551
You might also like
book
Hands-On Network Programming with C
A comprehensive guide to programming with network sockets, implementing internet protocols, designing IoT devices, and much …
book
Network Programming with Go
Go combines the best parts of many other programming languages. It’s fast, scalable, and designed for …
book
Linux Kernel Networking: Implementation and Theory
Linux Kernel Networking takes you on a guided in-depth tour of the current Linux networking implementation …
book
Network Programming with Go Language: Essential Skills for Programming, Using and Securing Networks with Open Source Google Golang
Dive into key topics in network architecture implemented with the Google-backed open source Go programming language. …