Chapter 1 Introduction And Overview
1.1 Internet Applications Using TCP/IP
1.2 Designing Applications For A Distributed Environment
1.3 Standard And Nonstandard Application Protocols
1.4 An Example Of Standard Application Protocol Use
1.5 An Example TELNET Connection
1.6 Using TELNET To Access An Alternative Service
1.7 Application Protocols And Software Flexibility
1.8 Viewing Services From The Provider's Perspective
1.9 The Remainder Of This Text
1.10 Summary
Chapter 2 The Client Server Model And Software Design
2.1 Introduction
2.2 Motivation
2.3 Terminology And Concepts
2.3.1 Clients And Servers
2.3.2 Privilege And Complexity
2.3.3 Standard Vs. Nonstandard Client Software
2.3.4 Parameterization Of Clients
2.3.5 Connectionless Vs. Connection-Oriented Servers
2.3.6 Stateless Vs. Stateful Servers
2.3.7 A Stateless File Server Example
2.3.8 A Stateful File Server Example
2.3.9 Identifying A Client
2.3.10 Statelessness Is A Protocol Issue
2.3.11 Servers As Clients
2.4 Summary
Chapter 3 Concurrent Processing In Client-Server Software
3.1 Introduction
3.2 Concurrency In Networks
3.3 Concurrency In Servers
3.4 Terminology And Concepts
3.4.1 The Process Concept
3.4.2 Sharing Of Local And Global Variables
3.4.3 Procedure Calls
3.5 An Example Of Concurrent Process Creation
3.5.1 A Sequential C Example
3.5.2 A Concurrent Version
3.5.3 Timeslicing
3.5.4 Singly-Threaded Process Assumption
3.5.5 Making Processes Diverge
3.6 Executing New Code
3.7 Context Switching And Protocol Software Design
3.8 Concurrency And Asynchronous I/O
3.9 Summary
Chapter 4 Application Interface To Protocols
4.1 Introduction
4.2 Loosely Specified Protocol Software Interface
4.2.1 Advantages And Disadvantages
4.3 Interface Functionality
4.4 Conceptual Interface Specification
4.5 System Calls
4.6 Two Basic Approaches To Network Communication
4.7 The Basic I/O Functions Available In Linux
4.8 Using Linux I/O With TCP/IP
4.9 Summary
Chapter 5 The Socket API
5.1 Introduction
5.2 Berkeley Sockets
5.3 Specifying A Protocol Interface
5.4 The Socket Abstraction
5.4.1 Socket Descriptors And File Descriptors
5.4.2 System Data Structures For Sockets
5.4.3 Making A Socket Active Or Passive
5.5 Specifying An Endpoint Address
5.6 A Generic Address Structure
5.7 Major System Calls In The Socket API
5.7.1 The Socket Call
5.7.2 The Connect Call
5.7.3 The Send Call
5.7.4 The Recv Call
5.7.5 The Close Call
5.7.6 The Bind Call
5.7.7 The Listen Call
5.7.8 The Listen Call
5.7.9 Using Read And Write With Sockets
5.7.10 Summary Of Socket Calls
5.8 Utility Routines For Integer Conversion
5.9 Using Socket Calls In A Program
5.10 Symbolic Constants For Socket Call Parameters
5.11 Summary
Chapter 6 Algorithms And Issues In Client Software Design
6.1 Introduction
6.2 Learning Algorithms Instead Of Details
6.3 Client Architecture
6.4 Identifying The Location Of A Server
6.5 Parsing An Address Argument
6.6 Looking Up A Domain Name
6.7 Looking Up A Well-Known Port By Name
6.8 Port Numbers And Network Byte Order
6.9 Looking Up A Protocol By Name
6.10 The TCP Client Algorithm
6.11 Allocation A Socket
6.12 Choosing A Local Protocol Port Number
6.13 A Fundamental Problem In Choosing A Local IP Address
6.14 Connecting A TCP Socket To A Server
6.15 Communicating With The Server Using TCP
6.16 Receiving A Response From A TCP Connection
6.17 Closing A TCP Connection
6.17.1 The Need For Partial Close
6.17.2 A Partial Close Operation
6.18 Programming A UDP Client
6.19 Connected And Unconnected UDP Sockets
6.20 Using Connect With UDP
6.21 Communicating With A Server Using UDP
6.22 Closing A Socket That Uses UDP
6.23 Partial Close For UDP
6.24 A Warning About UDP Unreliability
6.25 Summary
Chapter 7 Example Client Software
7.1 Introduction
7.2 The Importance Of Small Examples
7.3 Hiding Details
7.4 An Example Procedure Library For Client Programs
7.5 Implementation Of ConnectTCP
7.6 Implementation Of ConnectUDP
7.7 A Procedure That Forms Connections
7.8 Using The Example Library
7.9 The DAYTIME Service
7.10 Implementation Of A TCP Client For DAYTIME
7.11 Reading From A TCP Connection
7.12 The TIME Service
7.13 Accessing The TIME Service
7.14 Accurate Times And Network Delays
7.15 A UDP Client For The TIME Service
7.16 The ECHO Service
7.17 A TCP Client For The ECHO Service
7.18 A UDP Client For The ECHO Service
7.19 Summary
Chapter 8 Algorithms And Issues In Server Software Design
8.1 Introduction
8.2 The Conceptual Server Algorithm
8.3 Concurrent Vs. Iterative Servers
8.4 Connection-Oriented Vs. Connectionless Access
8.5 Transport Protocol Semantics
8.5.1 TCP Semantics
8.5.2 UDP Semantics
8.6 Choice Of Transport
8.7 Connection-Oriented Servers
8.8 Connectionless Servers
8.9 Failure,Reliability,And Statelessness
8.10 Optimizing Stateless Servers
8.11 Four Basic Types Of Servers
8.12 Request Processing Time
8.13 Iterative Server Algorithms
8.14 An Iterative,Connection-Oriented Server Algorithm
8.15 Binding To A Well-Known Address Using INADDR_ANY
8.16 Placing The Socket In Passive Mode
8.17 Accepting Connections And Using Them
8.18 An Iterative,Connectionless Server Algorithm
8.19 Forming A Reply Address In A Connectionless Server
8.20 Concurrent Server Algorithms
8.21 Master And Slaves
8.22 A Concurrent,Connectionless Server Algorithm
8.23 A Concurrent,Connection-Oriented Server Algorithm
8.24 Implementations Of Server Concurrency
8.25 Using Separate Programs As Slaves
8.26 Apparent Concurrency Using A Single Thread
8.27 When To Use Each Server Type
8.28 A Summary of Server Types
8.29 The Important Problem Of Server Deadlock
8.30 Alternative Implementations
8.31 Summary
Chapter 9 Iterative,Connectionless Servers(UDP)
9.1 Introduction
9.2 Creating A Passive Socket
9.3 Process Structure
9.4 An Example TIME Server
9.5 Summary
Chapter 10 Iterative,Connection-Oriented Servers(TCP)
10.1 Introduction
10.2 Allocation A Passive TCP Socket
10.3 A Server For The DAYTIME Service
10.4 Process Structure
10.5 An Example DAYTIME Server
10.6 Closing Connections
10.7 Connection Termination And Server Vulnerability
10.8 Summary
Chapter 11 Concurrent,Connection-Oriented Servers(TCP)
11.1 Introduction
11.2 EHO Service
11.3 Iterative Vs. Concurrent Implementations
11.4 Process Structure
11.5 An Example Concurrent ECHO Server
11.6 Cleaning Up Errant Processes
11.7 Summary
Chapter 12 Using Threads For Concurrency(YCP)
12.1 Introduction
12.2 Overview Of Linux Threads
12.3 Advantages Of Threads
12.5 Descriptors,Delay,And Exit
12.6 Thread Exit
12.7 Thread Coordination And Synchronization
12.7.1 Mutex
12.7.2 Semaphore
12.7.3 Condition Variable
12.8 An Example Server Using Threads
12.9 Monitor And Control
12.10 Summary
Chapter 13 Single-Thread,Concurrent Servers(TCP)
13.1 Introduction
13.2 Data-driven Processing In a Server
13.3 Data-Driven Processing With A Single Thread
13.4 Process Structure Of A Single-Thread Server
13.5 An Example Single-Thread ECHO Server
13.6 Summary
Chapter 14 Multiprotocol Servers(TCP,UDP)
14.1 Introduction
14.2 The Motivation For Reducing The Number Of Servers
14.3 Multiprotocol Server Design
14.4 Process Structure
14.5 An Example Multiprotocol DAYTIME Server
14.6 The Concept Of Shared Code
14.7 Concurrent Multiprotocol Servers
14.8 Summary
Chapter 15 Multiservice Servers(TCP,UDP)
15.1 Introduction
15.2 Consolidation Servers
15.3 A Connectionless,Multiservice Server Design
15.4 A Connection-Oriented,Multiservice Server Design
15.5 A Concurrent,Connection-Oriented,Multiservice Server
15.6 A Single-Thread,Multiservice Server Implementation
15.7 Invoking Separate Programs From A Multiservice Server
15.8 Multiservice,Multiprotocol Designs
15.9 An Example Multiservice Server
15.10 Static and Dynamic Server Configuration
15.11 The Super Server,Inetd
15.12 An Example Inetd Server
15.13 A List Of Server Variations
15.14 Summary
Chapter 16 Uniform,Efficient Management Of Server Concurrency
16.1 Introduction
16.2 Choosing Between An Iterative And A Concurrent Design
16.3 Level Of Concurrency
16.4 Demand-Driven Concurrency
16.5 The Cost Of Concurrency
16.6 Overhead And Delay
16.7 Small Delays Can Matter
16.8 Slave Preallocation
16.8.1 Preallocation In Linux
16.8.2 Preallocation In A Connection-Oriented Server
16.8.3 Mutex,File Locking,and Concurrent Calls To Accept
16.8.4 Preallocation In A Connectionless Server
16.8.5 Preallocation,Bursty Traffic,And NFS
16.8.6 Preallocation On A Multiprocessor
16.9 Delayed Slave Allocation
16.10 The Uniform Basis For Both Techniques
16.11 Combining Techniques
16.12 Summary
Chapter 17 Concurrency In Clients
17.1 Introduction
17.2 The Advantages Of Concurrency
17.3 The Motivation For Exercising Control
17.4 Concurrent Contact With Multiple Servers
17.5 Implementing Concurrent Clients
17.6 Single-Thread Implementations
17.7 An Example Concurrent Client That Uses ECHO
17.8 Execution Of The Concurrent Client
17.9 Concurrency In The Example Code
17.10 Summary
Chapter 18 Tunneling At The Transport And Application Levels
18.1 Introduction
18.2 Multiprotocol Environments
18.3 Mixing Network Technologies
18.4 Dynamic Circuit Allocation
18.5 Encapsulation And Tunneling
18.6 Tunneling Through An IP Internet
18.7 Application-Level Tunneling Between Clients And Servers
18.8 Tunneling,Encapsulation,And Dialup Phone Lines
18.9 Summary
Chapter 19 Application Level Gateways
19.1 Introduction
19.2 Clients And Servers In Constrained Environments
19.2.1 The Reality Of Limited Access
19.2.2 Computers With Limited Functionality
19.2.3 Connectivity Constraints That Arise From Security
19.3 Using Application Gateways
19.4 Interoperability Through A Mail Gateway
19.5 Implementation Of A Mail Gateway
19.6 A Comparison Of Application Gateways And Tunneling
19.7 Application Gateways And Limited Internet Connectivity
19.8 Application Gateways Used For Security
19.9 Application Gateways And The Extra Hop Problem
19.10 An Example Application Gateway
19.11 Implementation Of An Application Gateway
19.12 Code For The Application Gateway
19.13 An Example Gateway Exchange
19.14 Using Rfcd With .forward Or Slocal
19.15 A General-Purpose Application Gateway
19.16 Operation Of SLIRP
19.17 How SLIRP Handles Connections
19.18 IP Addressing And SLIRP
19.19 Summary
Chapter 20 External Data Representation(XDR)
20.1 Introduction
20.2 Representations Of Data
20.3 Asymmetric Conversion And The N-Squared Problem
20.4 Network Standard Byte Order
20.5 A De Facto Standard External Data Representation
20.6 XDR Data Types
20.7 Implicit Types
20.8 Software Support For Using XDR
20.9 XDR Library Routines
20.10 Building A Message One Piece At A time
20.11 Conversion Routines In The XDR Library
20.12 XDR Streams,I/O,and TCP
20.13 Records,Record Boundaries,And Datagram I/O
20.14 Summary
Chapter 21 Remote Procedure Call Concept(RPC)
21.1 Introduction
21.2 Remote Procedure Call Model
21.3 Two Paradigms For Building Distributed Programs
21.4 A Conceptual Model For Conventional Procedure Calls
21.5 An Extension Of the Procedural Model
21.6 Execution Of Conventional Procedure Call And Return
21.7 The Procedural Model In Distributed Systems
21.8 Analogy Between Client-Server And RPC
21.9 Distributed Computation As A Program
21.10 Sun Microsystems' Remote Procedure Call Definition
21.11 Remote Programs And Procedures
21.12 Reducing The Number Of Arguments
21.13 Identifying Remote Programs And Procedures
21.14 Accommodating Multiple Versions Of A Remote Program
21.15 Mutual Exclusion For Procedures In A Remote Program
21.16 Communication Semantics
21.17 At Least Once Semantics
21.18 RPC Retransmission
21.19 Mapping A Remote Program To A Protocol Port
21.20 Dynamic Port Mapping
21.21 RPC Port Mapper Algorithm
21.22 ONC RPC Message Format
21.23 Marshaling Arguments For A Remote Procedure
21.24 Authentication
21.25 An Example Of RPC Message Representation
21.26 An Example Of The UNIX Authentication Field
21.27 Summary
Chapter 22 Distributed Program Generation(Rpcgen Concept)
22.1 Introduction
22.2 Using Remote Procedure Calls
22.3 Programming Mechanisms To Support RPC
22.4 Dividing A Program Into Local And Remote Procedures
22.5 Adding Code For RPC
22.6 Stub Procedures
22.7 Multiple Remote Procedures And Dispatching
22.8 Name Of The Client-Side Stub Procedure
22.9 Using Rpcgen To Generate Distributed Programs
22.10 Rpcgen Output And Interface Procedures
22.11 Rpcgen Input And Output
22.12 Uaing Rpcgen To Build A Client And Server
22.13 Summary
Chapter 23 Distributed Program Generation(Rpcgen Example)
23.1 Introduction
23.2 An Example To Illustrate Rpcgen
23.3 Dictionary Operations
23.4 Eight Steps To A Distributed Application
23.5 Step1:Build A Conventional Application Program
23.6 Step2:Divide The Program Into Two Parts
23.7 Step3:Create An Rpcgen Specification
23.8 Step4:Run Rpcgen
23.9 The .h File Produced By Rpcgen
23.10 The XDR Conversion File Produced By Rpcgen
23.11 The Client Code Produced By Rpcgen
23.12 The Server Code Produced By Rpcgen
23.13 Step5:Write Stub Interface Procedures
23.13.1 Client-Side Interface Routines
23.13.2 Server-Side Interface Routines
23.14 Step6:Compile And Link The Client Program
23.15 Step7:Compile And Link The Server Program
23.16 Step8:Start The Server And Execute The Client
23.17 Using The Make Utility
23.18 Summary
Chapter 24 Network File System Concepts(NFS)
24.1 Introduction
24.2 Remote File Access Vs. Transfer
24.3 Operations On Remote Files
24.4 File Access Among Heterogeneous Computers
24.5 Stateless Servers
24.6 NFS And UNIX File Semantics
24.7 Review Of The UNIX File System
24.7.1 Basic Definitions
24.7.2 A Byte Sequence Without Record Boundaries
24.7.3 A File's Owner And Group Identifiers
24.7.4 Protection And Group Identifiers
24.7.5 The Open-Read-Write-Close Paradigm
24.7.6 Data Transfer
24.7.7 Permission To Search A Directory
24.7.8 Random Access
24.7.9 Seeking Beyond The End Of File
24.7.10 File Names And Paths
24.7.11 Semantics Of Write During Concurrent Access
24.7.12 File Names And Paths
24.7.13 Inode:Information Stored With A File
24.7.14 Stat Operation
24.7.15 The File Naming Mechanism
24.7.16 File System Mounts
24.7.17 File Name Resolution
24.7.18 Symbolic Links
24.8 Files Under NFS
24.9 NFS File Types
24.10 NFS File Modes
24.11 NFS File Attributes
24.12 NFS Client And Server
24.13 NFS Client Operation
24.14 NFS Client And UNIX Systems
24.15 NFS Mounts
24.16 File Handle
24.17 Handles Replace Path Names
24.18 File Positioning With A Stateless Server
24.19 Operations On Directories
24.20 Reading A Directory Statelessly
24.21 Multiple Hierarchies In An NFS Server
24.22 The Mount Protocol
24.23 Transport Protocols For NFS
24.24 Summary
Chapter 25 Network File System Protocols(NFS,Mount)
25.1 Introduction
25.2 Using RPC To Define A Protocol
25.3 Defining A Protocol With Data Structures And Procedures
25.4 NFS Constant,Type,And Data Declarations
25.4.1 NFS Constants
25.4.2 NFS Typedef Declarations
25.4.3 NFS Data Structures
25.5 NFS Procedures
25.6 Semantics Of NFS Operations
25.6.1 NFSPROC3_NULL(Procedure0)
25.6.2 NFSPROC3_GETATTR(Procedure1)
25.6.3 NFSPROC3_SETATTR(Procedure2)
25.6.4 NFSPROC3_LOOKUP(Procedure3)
25.6.5 NFSPROC3_ACCESS(Procedure4)
25.6.6 NFSPROC3_READLINK(Procedure5)
25.6.7 NFSPROC3_READ(Procedure6)
25.6.8 NFSPROC3_WRITE(Procedure7)
25.6.9 NFSPROC3_CREATE(Procedure8)
25.6.10 NFSPROC3_MKDIR(Procedure9)
25.6.11 NFSPROC3_SYMLINK(Procedure10)
25.6.12 NFSPROC3_MKNOD(Procedure11)
25.6.13 NFSPROC3_REMOVE(Procedure12)
25.6.14 NFSPROC3_RMDIR(Procedure13)
25.6.15 NFSPROC3_RENAME(Procedure14)
25.6.16 NFSPROC3_LINK(Procedure15)
25.6.17 NFSPROC3_READDIR(Procedure16)
25.6.18 NFSPROC3_READDIRPLUS(Procedure17)
25.6.19 NFSPROC3_FSSTAT(Procedure18)
25.6.20 NFSPROC3_FSINFO(Procedure19)
25.6.21 NFSPROC3_PATHCONF(Procedure20)
25.6.22 NFSPROC3_COMMIT(Procedure21)
25.7 The Mount Protocol
25.7.1 Mount Constant Definitions
25.7.2 Mount Type Definitions
25.7.3 Mount Data Structures
25.8 Procedures In The Mount Protocol
25.9 Semantics of Mount Operations
25.9.1 MOUNTPROC3_NULL(Procedure0)
25.9.2 MOUNTPROC3_MNT(Procedure1)
25.9.3 MOUNTPROC3_DUMP(Procedure2)
25.9.4 MOUNTPROC3_UMNT(Procedure3)
25.9.5 MOUNTPROC3_UMNTALL(Procedure4)
25.9.6 MOUNTPROC3_EXPORT(Procedure5)
25.10 NFS And Mount Authentication
25.11 File Locking
25.12 Changes In NFS Between Versions 3 And 4
25.13 Summary
Chapter 26 A TELNET Client(Program Structure)
26.1 Introduction
26.2 Overview
26.2.1 The User's Terminal
26.2.2 Command And Control Information
26.2.3 Terminals,Windows,and Files
26.2.4 The Need For Concurrency
26.2.5 A Process Model For A TELNET Client
26.3 A TELNET Client Algorithm
26.4 Terminal I/O In Linux
26.4.1 Controlling A Device Driver
26.5 Establishing Terminal Modes
26.6 Global Variable Used For Stored State
26.7 Restoring Terminal Modes Before Exit
26.8 Client Suspension And Resumption
26.9 Finite State Machine Specification
26.10 Embedding Commands In A TELNET Data Stream
26.11 Option Negotiation
26.12 Request/Offer Symmetry
26.13 TELNET Character Definitions
26.14 A Finite State Machine For Data From The Server
26.15 Transitions Among States
26.16 A Finite State Machine Implementation
26.17 A Compact FSM Representation
26.18 Keeping The Compact Representation At Run-Time
26.19 Implementation Of A Compact Representation
26.20 Building An FSM Transition Matrix
26.21 The Socket Output Finite State Machine
26.22 Definitions For The Socket Output FSM
26.23 The Option Subnegotiation Finite State Machine
26.24 Definitions For The Option Subnegotiation FSM
26.25 FSM Initialization
26.26 Arguments For The TELNET Client
26.27 The Heart Of The TELNET Client
26.28 Implementation Of The Main FSM
26.29 Summary
Chapter 27 A TENET Client(Implementation Details)
27.1 Introduction
27.2 The FSM Action Procedures
27.3 Recording The Type Of An Option Request
27.4 Performing No Operation
27.5 Responding To WILL/WONT For The Echo Option
27.6 Responding To WILL/WONT For Unsupported Options
27.7 Responding To WILL/WONT For The No Go-Ahead Option
27.8 Generating DO/DON'T For Binary Transmission
27.9 Responding To DO/DON'T For Unsupported Options
27.10 Responding To DO/DON'T For Transmit Binary Option
27.11 Responding To DO/DON'T For The Terminal Type Option
27.12 Option Subnegotiation
27.13 Sending Terminal Type Information
27.14 Terminating Subnegotiation
27.15 Sending A Character To The Server
27.16 Displaying Incoming Data On The User's Terminal
27.17 Using Termcap To Control The User's Terminal
27.18 Writing A Block Of Data To The Server
27.19 Interacting With The Client Process
27.20 Responding To Illegal Commands
27.21 Scripting To A File
27.22 Implementation Of Scripting
27.23 Initialization Of Scripting
27.24 Collecting Characters Of The Script File Name
27.25 Opening A Script File
27.26 Terminating Scripting
27.27 Printing Status Information
27.28 Summary
Chapter 28 Streaming Audio And Video Transport(RTP Concept And Design)
28.1 Introduction
28.2 Streaming Service
28.3 Real-Time Delivery
28.4 Protocol Compensation For Jitter
28.5 Retransmission,Loss,And Recovery
28.6 Real-Time Transport Protocol
28.7 Stream Translation And Jitter Buffers
28.9 RTP Control Protocol(RTCP)
28.10 Synchronizing Multiple Streams
28.11 RTP Transport And Many-To-Many Transmission
28.12 Sessions,Streams,Protocol Ports,And Demultiplexing
28.13 Basic Approaches To Encoding
28.14 Conceptual Organization Of RTP Software
28.15 Process/Thread Structure
28.16 Semantics Of The API
28.17 Jitter Buffer Design And Rebuffering
28.18 Event Handling
28.19 Playback Anomaly And Timestamp Complications
28.20 Size of An Example Real-Time Library
28.21 An Example MP3 Player
28.22 Summary
Chapter 29 Streaming Audio And Video Transport(Example RTP Implementation
29.1 Introduction
29.2 An Integrated Implementation
29.3 Program Architecture
29.4 RTP Definitions
29.5 Manipulation Of Time Values
29.6 RTP Packet Queue Manipulation
29.7 RTP Packet Queue Manipulation
29.8 RTP Input Processing
29.9 Keeping Statistics For RTCP
29.10 RTP Initialization
29.11 RTCP Definitions
29.12 receiving RTCP Sender Reports
29.13 Generating RTCP Receiver Reports
29.14 RTCP Header Creation
29.15 RTCP Delay Computation
29.16 Generation Of An RTCP Bye Message
29.17 Size Of An Integrated Implementation
29.18 Summary
Chapter 30 Practical Hints And Techniques For Linux Servers
30.1 Introduction
30.2 Operating In Background
30.3 Programming A Server To Operate In Background
30.4 Open Descriptors And Inheritance
30.5 Programming A Server To Close Inherited Descriptors
30.6 Signals From The Controlling TTY
30.7 Programming A Server To Change Its Controlling TTY
30.8 Moving To A Safe And Known Directory
30.9 Programming A Server To Change Directories
30.10 The Linux Umask
30.11 Programming A Server To Set Its Umask
30.12 Process Groups
30.13 Programming A Server To Set Its Process Group
30.14 Descriptors For Standard I/O
30.15 Programming A Server To Open Standard Descriptors
30.16 Mutual Exclusion For The Server
30.17 Programming A Server To Avoid Multiple Copies
30.18 Recording A Server's Process ID
30.19 Programming A Server To Record Its Process ID
30.20 Waiting For A Server To Wait For Each Child To Exit
30.22 Extraneous Signals
30.23 Programming A Server To Ignore Extraneous Signals
30.24 Using A System Log Facility
30.24.1 Generating Log Messages
30.24.2 The Advantage Of Indirection And Standard Error
30.24.3 Limitations Of I/O Redirection
30.24.4 A Client-Server Solution
30.24.5 The Syslog Mechanism
30.24.6 Syslog Message Classes
30.24.7 Syslog Facilities
30.24.8 Syslog Priority Levels
30.24.9 Using Syslog
30.24.10 An Example Syslog Configuration File
30.25 Summary
Chapter 31 Deadlock And Starvation In Client-Server Systems
31.1 Introduction
31.2 Definition Of Deadlock
31.3 Difficulty Of Deadlock Detection
31.4 Deadlock Avoidance
31.5 Deadlock Between A Client And Server
31.6 Avoiding Deadlock In A Single Interaction
31.7 Starvation Among A Set Of Clients And A Server
31.8 Busy Connections And Starvation
31.9 Avoiding Blocking Operations
31.10 Processes,Connections,And Other Limits
31.11 Cycles Of Clients And Servers
31.12 Documenting Dependencies
31.13 Summary
Appendix 1 System Calls And Library Routines Used With Sockets
Appendix 2 Manipulation Of Linux File And Socket Descriptors
Bibliography
Index