TCP/IP网络互连技术系列的第III卷讨论客户/服务器编程和应用,讲述了构筑所有分布式计算系统的客户/服务器计算模型的基本概念,内容包括各种不同的服务器设计方法,以及用来构造客户/服务器的各种工具和技术,包括远程调用RPC。书中包括了用来说明每种设计和工具的运行程序示例的源代码。第III卷有三个版本;本书系Windows Sockets版,讨论在Internet上应用软件通过TCP/IP进行通令的问题,适用于Windows 95,Windows NT,Win32环境政编程和使用Windows Socket API应用编程接口。
Contents\r\n\r\nForeword\r\n\r\nPreface\r\n\r\nChapter 1 Introduction And Overview\r\n\r\n1.1 Use Of TCP/IP\r\n1.2 Designing Applications For A Distributed Environment\r\n1.3 Standard And Nonstandard Application Protocol Use\r\n1.4 An Example Of Standard Application Protocol Use\r\n1.5 An Example Connection\r\n1.6 Using TELNET To Access An Alternative Service\r\n1.7 Application Protocols And Software Flexibility\r\n1.8 Viewing Services From The Provider's Perspective\r\n1.9 The Remainder Of This Text\r\n1.10 Summary\r\n\r\nChapter 2 The Client Server Model And Software Design\r\n\r\n2.1 Introduction\r\n2.2 Motivation\r\n2.3 Terminology And Concepts\r\n2.3.1 Clients And Servers\r\n2.3.2 Privilege And Complexity\r\n2.3.3 Standard Vs.Nonstandard Client Software\r\n2.3.4 Parameterization Of Clients\r\n2.3.5 Connectionless Vs.Connection-Oriented Servers\r\n2.3.6 Stateless Vs.Stateful Servers\r\n2.3.7 A Stateful File Server Example\r\n2.3.8 Statelessness Is A Protocol issue\r\n2.3.9 Severs As Clients\r\n2.4 Summary\r\n\r\nChapter 3 Concurrent Processing In Client-Server Software\r\n\r\n3.1 Introduction\r\n3.2 Concurrency In Networks\r\n3.3 Concurrency In Servers\r\n3.4 Terminology And Concepts\r\n3.4.1 the Process concept\r\n3.4.2 Threads\r\n3.4.3 Programs vs.Threads\r\n3.4.4 Procedure Calls\r\n3.5 An Example Of Concurrent Process Creation\r\n3.5.1 A Sequential C Example\r\n3.5.2 A Concurrent Version\r\n3.5.3 Timeslicing\r\n3.6 Executing New Code\r\n3.7 Context Switching And Protocol Software Design\r\n3.8 Concurrency And Asynchronous I /O\r\n3.9 Summary\r\n\r\nChapter 4 Program Interface To Protocols\r\n\r\n4.1 Introduction\r\n4.2 Loosely Specified Protocol Software Interface\r\n4.2.1 Advantages And Disadvantages\r\n4.3 Interface Functionality\r\n4.4 Conceptual Interface Specification\r\n4.5 System Calls\r\n4.6 Two Basic Approaches To Network Communication\r\n4.7 The Basic I/O Functions Available In UNIX\r\n4.8 Using UNIX I/O With TCP/IP\r\n4.9 Summary\r\n\r\nChapter 5 The Socket Interface\r\n\r\n5.1 Introduction\r\n5.2 Berkeley Sockets\r\n5.3 Specifying A Protocol Interface\r\n5.4 The Socket Abstraction\r\n5.4.1 Socket Descriptors\r\n5.4.2 System Data Structures For Sockets\r\n5.4.3 Using Sockets\r\n5.5 Specifying An Endpoint Address\r\n5.6 A Generic Address Structure\r\n5.7 Major System Calls Used With Sockets\r\n5.7.1 The WSAStartup Function\r\n5.7.2 The WSACleanup Function\r\n5.7.3 The Socket Function\r\n5.7.4 The Connect Function\r\n5.7.5 The Send Function\r\n5.7.6 The Recv Function\r\n5.7.7 The Closescket Function\r\n5.7.8 The Bind Function\r\n5.7.9 The Listen unction\r\n5.7.10 The Accept Function\r\n5.7.11 Summary Of Socket Calls Used With TCP\r\n5.8 Utility Routines For Integer Conversion\r\n5.9 Using Socket Calls In A Program\r\n5.10 Symbolic Constants For Socket Call Parameters\r\n5.11 Summary\r\n\r\nChapter 6 Algorithms And Issues In Client Software Design\r\n\r\n6.1 Introduction\r\n6.2 Learning Algorithms Instead Of Details\r\n6.3 Client Architecture\r\n6.4 Identifying The Location Of A Server\r\n6.5 Parsing An Address Argument\r\n6.6 Looking Up A Domain Name\r\n6.7 Looking Up A Well-Known Port By Name\r\n6.8 Port Numbers And Network Byte Order\r\n6.9 Looking Up A Protocol By Name\r\n6.10 The TCP Client Algorithm\r\n6.11 Allocating A Socket\r\n6.12 Choosing A Local Protocol Port Number\r\n6.13 A Fundamental Problem In Choosing A Local IP Address\r\n6.14 Connecting A TCP Socket To A Server\r\n6.15 Communicating With The Server Using TCP\r\n6.16 Reading A Response From A TCP Connection\r\n6.17 Closing A TCP Connection\r\n6.17.1 The Need For Partial Close\r\n6.17.2 A Partial Close Operation\r\n6.18 Programming A UDP Client\r\n6.19 Connected And Unconnected UDP Sockets\r\n6.20 Using Connect With UDP\r\n6.21 Communicating With A Server Using UDP\r\n6.22 Closing A Socket That Uses UDP\r\n6.23 Partial Close For UDP\r\n6.24 A Warning About UDP Unreliability\r\n6.25 Summary\r\n\r\nChapter 7 Example Client Software\r\n\r\n7.1 Introduction\r\n7.2 The Importance Of Small Examples\r\n7.3 Hiding Details\r\n7.4 An Example Procedure Library For Client Programs\r\n7.5 Implementation Of ConnectTCP\r\n7.6 Implementation Of connected\r\n7.7 A Procedure That Forms Connections\r\n7.8 Using The Example Library\r\n7.9 The DAYTIME Service\r\n7.10 Implementation Of A TCP Client For DAYTIME\r\n7.11 Reading From A TCP Client For DAYTIME\r\n7.12 The TIME Service\r\n7.13 Accessing The TIME Service\r\n7.14 Accurate Times And Network Delays\r\n7.15 A UDP Client For The TIME Service\r\n7.16 The ECHO Service\r\n7.17 A TCP Client For The ECHO Service\r\n7.18 A TCP Client For The ECHO Service\r\n7.19 Summary \r\n\r\nChapter 8 Algorithms And Lssues In Server Software Design\r\n\r\n8.1 Introduction\r\n8.2 The Conceptual Server Algorithm\r\n8.3 Concurrent Vs.Iterative Servers\r\n8.4 Connection-Oriented Vs.Connectionless Access\r\n8.5 Connection-Oriented Servers\r\n8.6 Connectionless Servers\r\n8.7 Failure,Reliability,And Statelessness\r\n8.8 Optimizing Stateless Servers\r\n8.9 Four Basic Types Of Servers\r\n8.10 Request Processing Time\r\n8.11 Iterative Server Algorithms\r\n8.12 An Iterative,Connection-Oriented Server Algorithm\r\n8.13 Binding To A Well-Known Address Using INADDR-ANY\r\n8.14 Placing The Socket In Passive Mode\r\n8.15 Acceptin Connections And Using Them\r\n8.16 An Iterative,Connectionless Server Algorithm\r\n8.17 Forming A Reply Address In A Connectionless Server\r\n8.18 Concurrent Server Algorithms\r\n8.19 Master And Slave Processes\r\n8.20 A Concurrent,Connectionless Server Algorithm\r\n8.21 A Concurrent,Connection-Oriented Server Algorithm\r\n8.22 Using Separate Programs As Slaves\r\n8.23 Apparent Concurrency Using A Single Process\r\n8.24 When To Use Each Server Type\r\n8.25 A Summary of Server Types\r\n8.26 The Important Problem Of Server Deadlock\r\n8.27 Alternative Implementations\r\n8.28 Summary\r\n\r\nChapter 9 Iterative,Connectionless Servers(UDP)\r\n\r\n9.1 Introduction\r\n9.2 Creating A Passive Socket\r\n9.3 Process Structure\r\n9.4 An Example TIME Server\r\n9.5 Summary\r\n\r\nChapter 10 Iterative,Connection-Oriented Servers(TCP)\r\n\r\n10.1 Introduction\r\n10.2 Allocating A Passive TCP Socket\r\n10.3 A Server For The DAYTIME Service\r\n10.4 Process Structure\r\n10.5 An Example DAYTIME Server\r\n10.6 Closing Connections\r\n10.7 Connection Termination And Server Vulnerability\r\n10.8 Summary\r\n\r\nChapter 11 Concurrent ,Connection-Oriented Servers(TCP)\r\n\r\n11.1 Introduction\r\n11.2 Concurrent ECHO\r\n11.3 Iterative Vs.Concurrent Implementations\r\n11.4 Process Structure\r\n11.5 An Example Concurrent ECHO Server\r\n11.6 Cleaning Up Errant Processes\r\n11.7 Summary\r\n\r\nChapter 12 Single--Process,Concurrent Servers(TCP)\r\n\r\n12.1 Introduction\r\n12.2 Data-driven Processing In A Server\r\n12.3 Data-DrivenProcessing With A Single Process\r\n12.4 Process Structure Of A Single-Process Server\r\n12.5 An Example Single-Process ECHO Server\r\n12.6 Summary\r\n\r\nChapter 13 Multiprotocol Servers(TCP,UDP)\r\n\r\n13.1 Introduction\r\n13.2 The Motivation For Reducing The Number Of Servers\r\n13.3 Multiprotocol Server Design\r\n13.4 Process Structure\r\n13.5 An Example Multiprotocol DAYTIME Server\r\n13.6 The Concept Of Shared Code\r\n13.7 Concurrent Multiprotocol Servers\r\n13.8 Summary\r\n\r\nChapter 14 Mulitiservice Servers(TCP,UDP)\r\n\r\n14.1 Introduction\r\n14.2 Consolidation Servers\r\n14.3 A Connectionless,Multiservice Server Design\r\n14.4 A Connection-Oriented,Multiservice Server Design\r\n14.5 A Concurrent,Connection-Oriented,Multiservice Server\r\n14.6 A Single-Process,Multiservice Server Implementation\r\n14.7 Invoking Separate Programs From A Multiservice Server\r\n14.8 Multiservice,Multiprotocol Designs\r\n14.9 An Example Multiservice Server\r\n14.10 Static and Dynamic Server Configuration\r\n14.11 The UNIX Super Server,Inetd\r\n14.12 An Example Inetd Server\r\n14.13 Summary\r\n\r\nChapter 15 Uniform,Efficient Management Of Server Concurrency\r\n\r\n15.1 Introduction\r\n15.2 Choosing Between An Iterative And A Concurrent Design\r\n15.3 Level Of Concurrency\r\n15.4 Demand-Driven Concurrency\r\n15.5 The Cost Of Concurrency\r\n15.6 Overhead And Delay\r\n15.7 Small Delays Can Matter\r\n15.8 Process Percolation\r\n15.8.1 Percolation Techniques\r\n15.8.2 Percolation In A Connection-Oriented Server\r\n15.8.3 Percolation In A Connectionless Server\r\n15.8.4 Percolation Burst Traffic ,And NFS\r\n18.8.5 Preallocation On A Multiprocessor\r\n15.9 Delayed Process Allocation\r\n15.10 The Uniform Basis For Both Techniques\r\n15.11 Combining Techniques\r\n15.12 Summary\r\n\r\nChapter 16 Concurrency In Clients\r\n\r\n16.1 Introduction\r\n16.2 The Advantages Of Concurrency\r\n16.3 The Motivation For Exercising Control\r\n16.4 Concurrent Contact With Multiple Servers\r\n16.5 Implementing Concurrent Clients\r\n16.6 Single-Process Implementations\r\n16.7 An Example Concurrent Client That Uses ECHO\r\n16.8 Execution Of The Concurrent Client\r\n16.9 Concurrency In The Example Code\r\n16.10 Summary\r\n\r\nChapter 17 Tunneling At The Transport And Application Levels\r\n\r\n17.1 Introduction\r\n17.2 Multiprotocol Environments\r\n17.3 Mixing Network Technologies\r\n17.4 Dynamic Circuit Allocation\r\n17.5 Encapsulation And Tunneling\r\n17.6 Tunneling Through An IP Internet\r\n17.7 Application-Level Tunneling Between Clients And Servers\r\n17.8 Tunneling,Encapsulation,And Dialup Phone Lines\r\n17.9 Summary\r\n\r\nChapter 18 Application Level Gateways\r\n\r\n18.1 Introduction\r\n18.2 Clients And Servers In Constrained Environments\r\n18.2.1 The Reality Of Multiple Technologies\r\n18.2.2 Computers With Limited Functionality\r\n18.2.3 Connectivity ConstraintsThat Aries From Security\r\n18.3 Using Application Gateways\r\n18.4 Interoperability Through A Mail Gateway\r\n18.5 Implementation Of A Mail Gateway\r\n18.6 A Comparison Of Application Gateways And Tunneling\r\n18.7 Application Gateways And Limited Functionality Systems\r\n18.8 Application Gateways Used For Security\r\n18.9 Application Gateways And The Extra Hop Problem\r\n18.10 An Example Application Gateway\r\n18.11 Implementation Of An Application Gateway\r\n18.12 Code For The Application Gateway\r\n18.13 An Example Gateway Exchange\r\n18.14 Using RFD With UNIX's forward\r\n18.15 A General-Purpose Application Gateway\r\n18.16 Operation Of SLURP\r\n18.17 How SLURP Handles Connections\r\n18.18 IP A dressing And SLURP\r\n18.19 Summary\r\n\r\nChapter 19 External Data Representation(XDR)\r\n\r\n19.1 Introduction\r\n19.2 Representations For Data In Computers\r\n19.3 The N-Squared Conversion Problem\r\n19.4 Network Standard Byte Order\r\n19.5 A De Facto Standard External Data Representation\r\n19.6 XDR Data Types\r\n19.7 Implicit Types\r\n19.8 Software Support For Using XDR\r\n19.9 XDR Library Routines\r\n19.10 Building A Message One Piece At A Time\r\n19.11 Conversion Routines In The XDR Library\r\n19.12 XDR Streams,I/O,and TCP\r\n19.13 Records,Record Boundaries,And Datagram I/O\r\n19.14 Summary\r\n\r\nChapter 20 Remote Procedure Call Concept(RPC)\r\n\r\n20.1 Introduction\r\n20.2 Remote Procedure Call Model\r\n20.3 Two Paradigms For Building Distributed Programs\r\n20.4 A Conceptual Model For Conventional Procedure Calls\r\n20.5 An Extension Of the Procedural Model\r\n20.6 Execution Of Conventional Procedure Call And Return\r\n20.7 The Procedural Model In Distributed Systems\r\n20.8 Analogy Between Client-Server And RPC\r\n20.9 Distributed Computation As A Program\r\n20.10 Sun Microsystems'Remote Procedure Call Defamation\r\n20.11 Remote Programs And Procedures\r\n20.12 Reducing The Number Of Arguments\r\n20.13 Identifying Remote programs And Procedures\r\n20.14 Accommodation Multiple Versions Of A Remote Program\r\n20.15 Mutual Exclusion For Procedures In A Remote Program\r\n20.16 Communication Semantics\r\n20.17 At Least Once Semantics\r\n20.18 RPC Retransmission\r\n20.19 Mapping A Remote Program To A Remote Procedure\r\n20.20 Dynamic Port Mapping\r\n20.21 RPC Port Mapped Algorithm\r\n20.22 RPC Message Format\r\n20.23 Marshaling Arguments For A Remote Procedure\r\n20.24 Authentication\r\n20.25 An Example Of RPC Message Representation\r\n20.26 An Example Of The UNIX Authentication Field\r\n20.27 Summary\r\n\r\nChapter 21 Distributed Program Generation(Rpcgen Concept)\r\n\r\n21.1 Introduction\r\n21.2 Using Rremote Procedure Calls\r\n21.3 Programming Mechanisms To Support RPC\r\n21.4 Dividing A Program Into Local And Remote Procedures\r\n21.5 Adding Code For RPC\r\n21.6 Stub Procedures\r\n21.7 Multiple Remote Procedures And Dispatching\r\n21.8 Name Of The Client-Side Stub Procedure\r\n21.9 Using Rpcgen To Generate Distributed Programs\r\n21.10 Rpcgen Output And Interface Procedures\r\n21.11 Rpcgen Input And Interface Procedures\r\n21.12 Using Remote To Build A Client And Server\r\n21.13 Summary\r\n\r\nChapter 22 Distributed Program Generation (Rpcgen EXAMPLE)\r\n\r\n22.1 Introduction\r\n22.2 An Example To Illustrate Rpcgen\r\n22.3 Dictionary Look Up\r\n22.4 Eight Steps To A Distributed Application\r\n22.5 Step 1 :Build A Conventional Application Program\r\n22.6 Step 1:Dived The Program Into Two Parts\r\n22.7 Step 2:Create An Rrpcgen Specification\r\n22.8 Step 4:Run Rpcgen\r\n22.9 The .h File Produced By Rpcgen\r\n22.10 The XDR Conversion File Produced By Rpcgen\r\n22.11 The Client Code Produced By Rpcgen\r\n22.12 The Server Code Produced By Rpcgen\r\n22.13 Step 5:Write Stub Interface Procedures\r\n22.13.1 Client-Side Interface Routines\r\n22.13.2 Server-Side Interface Routines\r\n22.14 Step 6:Compile And Link The Client Program\r\n22.15 Step 7:Compile And Link The Server Program\r\n22.16 Step 8:Start The Link The Server Program\r\n22.17 Using The UNIX Make Utility\r\n22.18 Summary\r\n\r\nChapter 23 Network File System Concepts(NFS)\r\n\r\n23.1 Introduction\r\n23.2 Remote File Access Vs.Transfer\r\n23.3 Operations On Remote FILES\r\n23.4 File Access Among Heterogeneous Computers\r\n23.5 Stateless Servers\r\n23.6 NFS And UNIX File Semantics\r\n23.7 Review Of The UNIX File System\r\n23.7.1 Basic Definitions\r\n23.7.2 A Byte Sequence Without Record Boundaries\r\n23.7.3 A File's Owner And Group Identifiers\r\n23.7.4 Protection And Access\r\n23.7.5 The UNIX Open-Read-Write-Close Paradigm\r\n23.7.6 UNIX Data Transfer\r\n23.7.7 Permission To Search A Directory\r\n23.7.8 UNIX Random Access\r\n23.7.9 Seeking Beyond The End Of A UNIX File\r\n23.7.10 UNIX File Position And Concurrent Access\r\n23.7.11 Semantics Of Write During Concurrent Access\r\n23.7.12 UNIX File Names And Paths\r\n23.7.13 The UNIX Inode:Information Stored With A File\r\n23.7.14 The UNIX Stat Operation\r\n23.7.15 The UNIX File Naming Mechanism\r\n23.7.16 UNIX File System Mounts\r\n23.7.17 UNIX File Name Resolution\r\n23.7.18 UNIX Symbolic Links\r\n23.8 Files Under NFS\r\n23.9 NFS File Types\r\n23.10 NFS File Modes\r\n23.11 NFS File Attributes\r\n23.12 NFS Client And Server\r\n23.13 NFS Client Operation\r\n23.14 NFS Client And UNIX\r\n23.15 NFS Mounts\r\n23.16 File Handle\r\n23.17 Handles Replace Path Names\r\n23.18 An NFS Client In UNIX\r\n23.19 File Positioning With A Stateless Server\r\n23.20 Operations On Directories\r\n23.21 Reading A Directory Statelessly\r\n23.22 Multiple Hierarchies In An NFS Server\r\n23.23 The Mount Protocol\r\n23.24 Summery\r\n\r\nChapter d24 Network File System protocol(NFS,Mount)\r\n\r\n24.1 Introduction\r\n24.2 Using RPC To Define A Protocol\r\n24.3 Defining A Protocol With Data Structures And Procedures\r\n24.4 NFS Constant,Type ,And Data Declarations\r\n24.4.1 NFS Constants\r\n24.4.2 NFS Typedef Declarations\r\n24.4.3 NFS Data Structures\r\n24.5 NFS Procedures\r\n24.6 Semantics Of NFS Operations\r\n24.6.1 NFSPROC_NULL\r\n24.6.2 NFSPROC_GETATTR\r\n24.6.3 NFSPROC_SETATTR\r\n24.6.4 NFSPROC_ROOT\r\n24.6.5 NFSPROC_LOOKUP\r\n24.6.6 NFSPROC_READLINK\r\n24.6.7 NFSPROC_READ\r\n24.6.8 NFSPROC_WRITECACHE\r\n24.6.9 NFSPROC_WRITE\r\n24.6.10 NFSPROC_CREATE\r\n24.6.11 NFSPROC_REMOVE\r\n24.6.12 NFSPROC_RENAME\r\n24.6.13 NFSPROC_LINK\r\n24.6.14 NFSPROC_SYMLINK\r\n24.6.15 NFSPROC_MKDIR\r\n24.6.16 NFSPROC_RMDIR\r\n24.6.17 NFSPROC_READDIR\r\n24.6.18 NFSPROC_STATFS\r\n24.7 The Mount Protocol\r\n24.7.1 Mount constant Definitions\r\n27.4.2 Mount Type Definitions\r\n27.7.3 Mount Data Structures\r\n24.8 Procedures In The Mount Protocol\r\n24.9 Semantics of Mount Operations\r\n24.9.1 MNTPROC_NULL\r\n24.9.2 MNTPROC_MNT\r\n24.9.3 MNTPROC_DUMP\r\n24.9.4 MNTPROC_UMNT\r\n24.9.5 MNTPROC_UMNTALL\r\n24.9.6 MNTPROC_EXPORT\r\n24.10 NFS And Mount Authentication\r\n24.11 Changes In NFS Version 3\r\n24.12 Summary\r\n\r\nChapter 25 A TELNET Client (Program Structure)\r\n\r\n25.1 Introduction\r\n25.2 Overview\r\n25.2.1 The User's terminal\r\n25.2.2 Command And Control Information\r\n25.2.3 Terminals,Windows ,and Files\r\n25.2.4 The Need for Concurrency\r\n25.2.5 A Thread Modest For A TELNET Client\r\n25.3 A TELNET Client Algorithm\r\n25.4 Terminal I/O In UNIX\r\n25.5 Establishing Terminal Modes\r\n25.6 Global Variable Used For Stored State\r\n25.7 Restoring Terminal Modes Before Exit\r\n25.8 Client Suspension And Resumption\r\n25.9 Finite State Machine Specification\r\n25.10 Embedding Commands In A TELNET Data Stream\r\n25.11 Option Negotiation\r\n25.12 Request/Offer Symmetry\r\n25.13 TELNET Character Definitions\r\n25.14 A Finite State Machine For Data From The Server\r\n25.15 Transitions Among States\r\n25.16 A Finite State Machine Implementation\r\n25.17 A Compact FSM Representation\r\n25.18 Keeping The Compact Representatin At Run-Time\r\n25.19 Implementation Of A Compact Representation\r\n25.20 Building An FSM Transition Machine\r\n25.21 The Socket Output Finite State Machine\r\n25.22 Definitions For The Socket Output FSM\r\n25.23 The Option Subnegotiation Finite State Machine\r\n25.24 Definitions For The Option Subnegotiation FSM\r\n25.25 FSM Initialization\r\n25.26 Arguments For The TELNET Client\r\n25.27 The Heart Of The TELNET Client\r\n25.28 Implementation Of The Main FSM\r\n25.29 Summary\r\n\r\nChapter 26 A TELNET Client (Implementation Details)\r\n\r\n26.1 Introduction\r\n26.2 The FSM Action Procedures\r\n26.3 Recording The Type Of An Option Request\r\n26.4 Performing No Operation\r\n26.5 Responding To WILL/WONT For The Echo Option\r\n26.6 Responding To WILL/WONT For Unsupported Options\r\n26.7 Responding To WILL/WONT For The No Go-Ahead Option \r\n26.8 Generating DO/DONT For Binary Transmission\r\n26.9 Responding To DO/DONT For Unsupported Options\r\n26.10 Responding To DO/DONT For Transmit Binary Option\r\n26.11 Responding To DO/DONT For The Terminal Type Option\r\n26.12 Option Subnegotiation\r\n26.13 Sending Terminal Type Information\r\n26.14 Terminating Subnegotiation\r\n26.15 Sending A Character To The Server\r\n26.16 Displaying Incoming Data On The User's Terminal\r\n26.17 Using Tarmac To Control The User's Terminal\r\n26.18 Writing A Block Of Data To The Server\r\n26.19 Interacting With The Client Process\r\n26.20 Responding To Illegal Commands\r\n26.21 Scripting To A File\r\n26.22 Implementation Of Scripting\r\n26.23 Initialization Of Scripting\r\n26.24 Collecting Characters Of The Script File Name\r\n26.25 Opening A Script File\r\n26.26 Terminating Scripting\r\n26.27 Pruning Status Information\r\n26.28 Summary\r\n\r\nChapter 27 Practical Hints And Techniques For UNIX Servers\r\n\r\n27.1 Introduction\r\n27.2 Operation In Gakground\r\n27.3 Progranuning A Server To Operate In Background\r\n27.4 Open Descriptors And Inheritance\r\n27.5 Programming A Server To Close Inherited Descriptors\r\n27.6 Signals From The Controlling TTY\r\n27.7 Programming A Server To Change Its Controlling TTY\r\n27.1 Generation Log Messages\r\n27.8 Moving To A Safe And Known Directory\r\n27.9 Programming A Server To Change Directories\r\n27.10 The UNIX Unmask\r\n27.11 Programming A Server To Set Its Unmask\r\n27.12 Process Groups\r\n27.13 Programming A Server To Set Its Pooches Group\r\n27.14 Descriptors For Standard I/O\r\n27.15 Programming A Server To Open Standard Descriptors\r\n27.16 Mutual Exclusion For The Server\r\n27.17 Programming A Server To Avoid Multiple Copies\r\n27.18 Recording A Server's Process ID\r\n27.19 Programming A Server To Record Its Process ID\r\n27.20 Waiting For A Child Process To Exit\r\n27.21 Programming A Server To Wait For Each Child To Exit\r\n27.22 Extremes Sigma's\r\n27.23 Programming A Server To Ignore Extremes Signals\r\n27.24 Using A System Log Facility \r\n27.25 Summary\r\n\r\nChapter 28 Deadlock And Starvation In Client-Server Systems\r\n\r\n28.1 Introduction\r\n28.2 Definition Of Deadlock\r\n28.3 Difficulty Of Deadlock Detection\r\n28.4 Deadlock Avoidance\r\n28.5 Deadlock Between A Client And Server\r\n28.6 Avoiding Deadlock In A Single Interaction\r\n28.7 Starvation Among A Set Of Clients And A Server\r\n28.8 Busy Connections And Starvation\r\n28.9 Avoiding Blocking Operations\r\n28.10 Processes,Connections,And Other Limits\r\n28.11 Cycles Of Clients And Servers\r\n28.12 Documenting Dependencies\r\n28.13 Summary\r\n\r\nAppendix 1 System Calls And Library Routines Used With Sockets\r\n\r\nAppendix 2 Manipulation Of UNIX File And Socket Descriptors\r\n\r\nBibliography\r\n\r\nIndex