Foreword |
|
xxiii | |
Preface |
|
xxv | |
|
Introduction And Overview |
|
|
1 | (8) |
|
Internet Applications Using TCP/IP |
|
|
1 | (1) |
|
Designing Applications For A Distributed Environment |
|
|
1 | (1) |
|
Standard And Nonstandard Application Protocols |
|
|
2 | (1) |
|
An Example Of Standard Application Protocol Use |
|
|
2 | (1) |
|
An Example TELNET Connection |
|
|
3 | (1) |
|
Using TELNET To Access An Alternative Service |
|
|
4 | (1) |
|
Application Protocols And Software Flexibility |
|
|
5 | (1) |
|
Viewing Services From The Provider's Perspective |
|
|
6 | (1) |
|
The Remainder Of This Text |
|
|
6 | (1) |
|
|
7 | (2) |
|
The Client Server Model And Software Design |
|
|
9 | (14) |
|
|
9 | (1) |
|
|
10 | (1) |
|
|
10 | (10) |
|
|
11 | (1) |
|
|
11 | (1) |
|
Standard Vs. Nonstandard Client Software |
|
|
12 | (1) |
|
Parameterization Of Clients |
|
|
12 | (1) |
|
Connectionless Vs. Connection-Oriented Servers |
|
|
13 | (1) |
|
Stateless Vs. Stateful Servers |
|
|
14 | (1) |
|
A Stateless File Server Example |
|
|
15 | (1) |
|
A Stateful File Server Example |
|
|
15 | (1) |
|
|
16 | (2) |
|
Statelessness Is A Protocol Issue |
|
|
18 | (1) |
|
|
19 | (1) |
|
|
20 | (3) |
|
Concurrent Processing In Client-Server Software |
|
|
23 | (16) |
|
|
23 | (1) |
|
|
23 | (2) |
|
|
25 | (1) |
|
|
26 | (3) |
|
|
26 | (1) |
|
Sharing Of Local And Global Variables |
|
|
27 | (1) |
|
|
28 | (1) |
|
An Example Of Concurrent Process Creation |
|
|
29 | (5) |
|
|
29 | (1) |
|
|
30 | (1) |
|
|
31 | (1) |
|
Singly-Threaded Process Assumption |
|
|
32 | (1) |
|
|
33 | (1) |
|
|
34 | (1) |
|
Context Switching And Protocol Software Design |
|
|
34 | (1) |
|
Concurrency and Asynchronous I/O |
|
|
35 | (1) |
|
|
36 | (3) |
|
Application Interface To Protocols |
|
|
39 | (8) |
|
|
39 | (1) |
|
Loosely Specified Protocol Software Interface |
|
|
39 | (1) |
|
Advantages And Disadvantages |
|
|
40 | (1) |
|
|
40 | (1) |
|
Conceptual Interface Specification |
|
|
41 | (1) |
|
|
42 | (1) |
|
Two Basic Approaches To Network Communication |
|
|
43 | (1) |
|
The Basic I/O Functions Available In Linux |
|
|
43 | (2) |
|
Using Linux I/O With TCP/IP |
|
|
45 | (1) |
|
|
45 | (2) |
|
|
47 | (16) |
|
|
47 | (1) |
|
|
47 | (1) |
|
Specifying A Protocol Interface |
|
|
48 | (1) |
|
|
49 | (3) |
|
Socket Descriptors And File Descriptors |
|
|
49 | (1) |
|
System Data Structures For Sockets |
|
|
50 | (1) |
|
Making A Socket Active Or Passive |
|
|
51 | (1) |
|
Specifying An Endpoint Address |
|
|
52 | (1) |
|
A Generic Address Structure |
|
|
52 | (2) |
|
Major System Calls In The Socket API |
|
|
54 | (4) |
|
|
54 | (1) |
|
|
54 | (1) |
|
|
55 | (1) |
|
|
55 | (1) |
|
|
55 | (1) |
|
|
56 | (1) |
|
|
56 | (1) |
|
|
56 | (1) |
|
Using Read And Write With Sockets |
|
|
56 | (1) |
|
|
57 | (1) |
|
Utility Routines For Integer Conversion |
|
|
58 | (1) |
|
Using Socket Calls In A Program |
|
|
58 | (1) |
|
Symbolic Constants For Socket Call Parameters |
|
|
59 | (1) |
|
|
60 | (3) |
|
Algorithms And Issues In Client Software Design |
|
|
63 | (18) |
|
|
63 | (1) |
|
Learning Algorithms Instead Of Details |
|
|
63 | (1) |
|
|
64 | (1) |
|
Identifying The Location Of A Server |
|
|
64 | (2) |
|
Parsing An Address Argument |
|
|
66 | (1) |
|
|
67 | (1) |
|
Looking Up A Well-Known Port By Name |
|
|
68 | (1) |
|
Port Numbers And Network Byte Order |
|
|
68 | (1) |
|
Looking Up A Protocol By Name |
|
|
69 | (1) |
|
|
69 | (1) |
|
|
70 | (1) |
|
Choosing A Local Protocol Port Number |
|
|
71 | (1) |
|
A Fundamental Problem In Choosing A Local IP Address |
|
|
71 | (1) |
|
Connecting A TCP Socket To A Server |
|
|
72 | (1) |
|
Communicating With The Server Using TCP |
|
|
72 | (1) |
|
Receiving A Response From A TCP Connection |
|
|
73 | (1) |
|
|
74 | (1) |
|
The Need For Partial Close |
|
|
74 | (1) |
|
A Partial Close Operation |
|
|
74 | (1) |
|
|
75 | (1) |
|
Connected And Unconnected UDP Sockets |
|
|
76 | (1) |
|
|
76 | (1) |
|
Communicating With A Server Using UDP |
|
|
76 | (1) |
|
Closing A Socket That Uses UDP |
|
|
77 | (1) |
|
|
77 | (1) |
|
A Warning About UDP Unreliability |
|
|
77 | (1) |
|
|
77 | (4) |
|
|
81 | (20) |
|
|
81 | (1) |
|
The Importance Of Small Examples |
|
|
81 | (1) |
|
|
82 | (1) |
|
An Example Procedure Library For Client Programs |
|
|
82 | (1) |
|
Implementation Of ConnectTCP |
|
|
83 | (1) |
|
Implementation Of ConnectUDP |
|
|
84 | (1) |
|
A Procedure That Forms Connections |
|
|
85 | (3) |
|
Using The Example Library |
|
|
88 | (1) |
|
|
88 | (1) |
|
Implementation Of A TCP Client For DAYTIME |
|
|
89 | (1) |
|
Reading From A TCP Connection |
|
|
90 | (1) |
|
|
91 | (1) |
|
Accessing the TIME Service |
|
|
91 | (1) |
|
Accurate Times And Network Delays |
|
|
92 | (1) |
|
A UDP Client For The TIME Service |
|
|
92 | (2) |
|
|
94 | (1) |
|
A TCP Client For The ECHO Service |
|
|
94 | (2) |
|
A UDP Client For The ECHO Service |
|
|
96 | (2) |
|
|
98 | (3) |
|
Algorithms And Issues In Server Software Design |
|
|
101 | (24) |
|
|
101 | (1) |
|
The Conceptual Server Algorithm |
|
|
101 | (1) |
|
Concurrent Vs. Iterative Servers |
|
|
102 | (1) |
|
Connection-Oriented Vs. Connectionless Access |
|
|
102 | (1) |
|
Transport Protocol Semantics |
|
|
103 | (1) |
|
|
103 | (1) |
|
|
103 | (1) |
|
|
104 | (1) |
|
Connection-Oriented Servers |
|
|
104 | (1) |
|
|
105 | (1) |
|
Failure, Reliability, And Statelessness |
|
|
106 | (1) |
|
Optimizing Stateless Servers |
|
|
106 | (3) |
|
Four Basic Types Of Servers |
|
|
109 | (1) |
|
|
109 | (1) |
|
Iterative Server Algorithms |
|
|
110 | (1) |
|
An Iterative, Connection-Oriented Server Algorithm |
|
|
110 | (1) |
|
Binding To A Well-Known Address Using INADDR_ANY |
|
|
111 | (1) |
|
Placing The Socket In Passive Mode |
|
|
112 | (1) |
|
Accepting Connections And Using Them |
|
|
112 | (1) |
|
An Iterative, Connectionless Server Algorithm |
|
|
112 | (1) |
|
Forming A Reply Address In A Connectionless Server |
|
|
113 | (1) |
|
Concurrent Server Algorithms |
|
|
114 | (1) |
|
|
114 | (1) |
|
A Concurrent, Connectionless Server Algorithm |
|
|
115 | (1) |
|
A Concurrent, Connection-Oriented Server Algorithm |
|
|
116 | (1) |
|
Implementations Of Server Concurrency |
|
|
117 | (1) |
|
Using Separate Programs As Slaves |
|
|
118 | (1) |
|
Apparent Concurrency Using A Single Thread |
|
|
118 | (1) |
|
When To Use Each Server Type |
|
|
119 | (1) |
|
A Summary of Server Types |
|
|
120 | (1) |
|
The Important Problem Of Server Deadlock |
|
|
121 | (1) |
|
Alternative Implementations |
|
|
122 | (1) |
|
|
122 | (3) |
|
Iterative, Connectionless Servers (UDP) |
|
|
125 | (10) |
|
|
125 | (1) |
|
Creating A Passive Socket |
|
|
125 | (4) |
|
|
129 | (1) |
|
|
130 | (2) |
|
|
132 | (3) |
|
Iterative, Connection-Oriented Servers (TCP) |
|
|
135 | (8) |
|
|
135 | (1) |
|
Allocating A Passive TCP Socket |
|
|
135 | (1) |
|
A Server For The DAYTIME Service |
|
|
136 | (1) |
|
|
136 | (1) |
|
An Example DAYTIME Server |
|
|
137 | (3) |
|
|
140 | (1) |
|
Connection Termination And Server Vulnerability |
|
|
140 | (1) |
|
|
141 | (2) |
|
Concurrent, Connection-Oriented Servers (TCP) |
|
|
143 | (8) |
|
|
143 | (1) |
|
|
143 | (1) |
|
Iterative Vs. Concurrent Implementations |
|
|
144 | (1) |
|
|
144 | (1) |
|
An Example Concurrent ECHO Server |
|
|
145 | (4) |
|
Cleaning Up Errant Processes |
|
|
149 | (1) |
|
|
150 | (1) |
|
Using Threads For Concurrency (TCP) |
|
|
151 | (12) |
|
|
151 | (1) |
|
Overview Of Linux Threads |
|
|
151 | (1) |
|
|
152 | (1) |
|
|
153 | (1) |
|
Descriptors, Delay, And Exit |
|
|
153 | (1) |
|
|
154 | (1) |
|
Thread Coordination And Synchronization |
|
|
154 | (2) |
|
|
154 | (1) |
|
|
155 | (1) |
|
|
155 | (1) |
|
An Example Server Using Threads |
|
|
156 | (4) |
|
|
160 | (1) |
|
|
161 | (2) |
|
Single-Thread, Concurrent Servers (TCP) |
|
|
163 | (8) |
|
|
163 | (1) |
|
Data-driven Processing In A Server |
|
|
163 | (1) |
|
Data-Driven Processing With A Single Thread |
|
|
164 | (1) |
|
Process Structure Of A Single-Thread Server |
|
|
165 | (1) |
|
An Example Single-Thread ECHO Server |
|
|
166 | (2) |
|
|
168 | (3) |
|
Multiprotocol Servers (TCP, UDP) |
|
|
171 | (8) |
|
|
171 | (1) |
|
The Motivation For Reducing The Number Of Servers |
|
|
171 | (1) |
|
Multiprotocol Server Design |
|
|
172 | (1) |
|
|
172 | (1) |
|
An Example Multiprotocol DAYTIME Server |
|
|
173 | (4) |
|
The Concept Of Shared Code |
|
|
177 | (1) |
|
Concurrent Multiprotocol Servers |
|
|
177 | (1) |
|
|
178 | (1) |
|
Multiservice Servers (TCP, UDP) |
|
|
179 | (20) |
|
|
179 | (1) |
|
|
179 | (1) |
|
A Connectionless, Multiservice Server Design |
|
|
180 | (1) |
|
A Connection-Oriented, Multiservice Server Design |
|
|
181 | (1) |
|
A Concurrent, Connection-Oriented, Multiservice Server |
|
|
182 | (1) |
|
A Single-Thread, Multiservice Server Implementation |
|
|
182 | (1) |
|
Invoking Separate Programs From A Multiservice Server |
|
|
183 | (2) |
|
Multiservice, Multiprotocol Designs |
|
|
185 | (1) |
|
An Example Multiservice Server |
|
|
185 | (7) |
|
Static and Dynamic Server Configuration |
|
|
192 | (1) |
|
|
193 | (2) |
|
|
195 | (2) |
|
A List Of Server Variations |
|
|
197 | (1) |
|
|
197 | (2) |
|
Uniform, Efficient Management Of Server Concurrency |
|
|
199 | (14) |
|
|
199 | (1) |
|
Choosing Between An Iterative And A Concurrent Design |
|
|
199 | (1) |
|
|
200 | (1) |
|
Demand-Driven Concurrency |
|
|
201 | (1) |
|
|
201 | (1) |
|
|
202 | (1) |
|
|
202 | (2) |
|
|
204 | (4) |
|
|
204 | (1) |
|
Preallocation In A Connection-Oriented Server |
|
|
205 | (1) |
|
Mutex, File Locking, and Concurrent Calls To Accept |
|
|
206 | (1) |
|
Preallocation In A Connectionless Server |
|
|
207 | (1) |
|
Preallocation, Bursty Traffic, And NFS |
|
|
208 | (1) |
|
Preallocation On A Multiprocessor |
|
|
208 | (1) |
|
|
208 | (2) |
|
The Uniform Basis For Both Techniques |
|
|
210 | (1) |
|
|
210 | (1) |
|
|
211 | (2) |
|
|
213 | (14) |
|
|
213 | (1) |
|
The Advantages Of Concurrency |
|
|
213 | (1) |
|
The Motivation For Exercising Control |
|
|
214 | (1) |
|
Concurrent Contact With Multiple Servers |
|
|
215 | (1) |
|
Implementing Concurrent Clients |
|
|
216 | (1) |
|
Single-Thread Implementations |
|
|
217 | (1) |
|
An Example Concurrent Client That Uses ECHO |
|
|
218 | (4) |
|
Execution Of The Concurrent Client |
|
|
222 | (2) |
|
Concurrency In The Example Code |
|
|
224 | (1) |
|
|
224 | (3) |
|
Tunneling At The Transport And Application Levels |
|
|
227 | (10) |
|
|
227 | (1) |
|
Multiprotocol Environments |
|
|
227 | (2) |
|
Mixing Network Technologies |
|
|
229 | (1) |
|
Dynamic Circuit Allocation |
|
|
230 | (1) |
|
Encapsulation And Tunneling |
|
|
231 | (1) |
|
Tunneling Through An IP Internet |
|
|
232 | (1) |
|
Application-Level Tunneling Between Clients And Servers |
|
|
232 | (1) |
|
Tunneling, Encapsulation, And Dialup Phone Lines |
|
|
233 | (1) |
|
|
234 | (3) |
|
Application Level Gateways |
|
|
237 | (20) |
|
|
237 | (1) |
|
Clients And Servers In Constrained Environments |
|
|
237 | (1) |
|
The Reality Of Limited Access |
|
|
237 | (1) |
|
Computers With Limited Functionality |
|
|
238 | (1) |
|
Connectivity Constraints That Arise From Security |
|
|
238 | (1) |
|
Using Application Gateways |
|
|
238 | (2) |
|
Interoperability Through A Mail Gateway |
|
|
240 | (1) |
|
Implementation Of A Mail Gateway |
|
|
240 | (1) |
|
A Comparison Of Application Gateways And Tunneling |
|
|
241 | (2) |
|
Application Gateways And Limited Internet Connectivity |
|
|
243 | (2) |
|
Application Gateways Used For Security |
|
|
245 | (1) |
|
Application Gateways And The Extra Hop Problem |
|
|
245 | (2) |
|
An Example Application Gateway |
|
|
247 | (1) |
|
Implementation Of An Application Gateway |
|
|
248 | (2) |
|
Code For The Application Gateway |
|
|
250 | (1) |
|
An Example Gateway Exchange |
|
|
251 | (1) |
|
Using Rfcd With forward Or Slocal |
|
|
252 | (1) |
|
A General-Purpose Application Gateway |
|
|
253 | (1) |
|
|
253 | (1) |
|
How SLIRP Handles Connections |
|
|
254 | (1) |
|
|
254 | (1) |
|
|
255 | (2) |
|
External Data Representation (XDR) |
|
|
257 | (14) |
|
|
257 | (1) |
|
|
257 | (1) |
|
Asymmetric Conversion And The N-Squared Problem |
|
|
258 | (1) |
|
Network Standard Byte Order |
|
|
259 | (2) |
|
A De Facto Standard External Data Representation |
|
|
261 | (1) |
|
|
261 | (2) |
|
|
263 | (1) |
|
Software Support For Using XDR |
|
|
263 | (1) |
|
|
263 | (1) |
|
Building A Message One Piece At A Time |
|
|
264 | (1) |
|
Conversion Routines In The XDR Library |
|
|
265 | (2) |
|
XDR Streams, I/O, and TCP |
|
|
267 | (1) |
|
Records, Record Boundaries, And Datagram I/O |
|
|
268 | (1) |
|
|
268 | (3) |
|
Remote Procedure Call Concept (RPC) |
|
|
271 | (24) |
|
|
271 | (1) |
|
Remote Procedure Call Model |
|
|
271 | (1) |
|
Two Paradigms For Building Distributed Programs |
|
|
272 | (1) |
|
A Conceptual Model For Conventional Procedure Calls |
|
|
273 | (1) |
|
An Extension Of the Procedural Model |
|
|
274 | (1) |
|
Execution Of Conventional Procedure Call And Return |
|
|
274 | (1) |
|
The Procedural Model In Distributed Systems |
|
|
275 | (1) |
|
Analogy Between Client-Server And RPC |
|
|
276 | (1) |
|
Distributed Computation As A Program |
|
|
277 | (1) |
|
Sun Microsystems' Remote Procedure Call Definition |
|
|
278 | (1) |
|
Remote Programs And Procedures |
|
|
278 | (1) |
|
Reducing The Number Of Arguments |
|
|
279 | (1) |
|
Identifying Remote Programs And Procedures |
|
|
279 | (1) |
|
Accommodating Multiple Versions Of A Remote Program |
|
|
280 | (1) |
|
Mutual Exclusion For Procedures In A Remote Program |
|
|
281 | (1) |
|
|
282 | (1) |
|
|
282 | (1) |
|
|
283 | (1) |
|
Mapping A Remote Program To A Protocol Port |
|
|
283 | (1) |
|
|
284 | (1) |
|
RPC Port Mapper Algorithm |
|
|
285 | (2) |
|
|
287 | (1) |
|
Marshaling Arguments For A Remote Procedure |
|
|
288 | (1) |
|
|
288 | (2) |
|
An Example Of RPC Message Representation |
|
|
290 | (1) |
|
An Example Of The UNIX Authentication Field |
|
|
290 | (1) |
|
|
291 | (4) |
|
Distributed Program Generation (Rpcgen Concept) |
|
|
295 | (12) |
|
|
295 | (1) |
|
Using Remote Procedure Calls |
|
|
296 | (1) |
|
Programming Mechanisms To Support RPC |
|
|
297 | (1) |
|
Dividing A Program Into Local And Remote Procedures |
|
|
298 | (1) |
|
|
299 | (1) |
|
|
299 | (1) |
|
Multiple Remote Procedures And Dispatching |
|
|
300 | (1) |
|
Name Of The Client-Side Stub Procedure |
|
|
301 | (1) |
|
Using Rpcgen To Generate Distributed Programs |
|
|
302 | (1) |
|
Rpcgen Output And Interface Procedures |
|
|
302 | (2) |
|
|
304 | (1) |
|
Using Rpcgen To Build A Client And Server |
|
|
304 | (1) |
|
|
305 | (2) |
|
Distributed Program Generation (Rpcgen Example) |
|
|
307 | (40) |
|
|
307 | (1) |
|
An Example To Illustrate Rpcgen |
|
|
308 | (1) |
|
|
308 | (1) |
|
Eight Steps To A Distributed Application |
|
|
309 | (1) |
|
Build A Conventional Application Program |
|
|
310 | (4) |
|
Divide The Program Into Two Parts |
|
|
314 | (6) |
|
Create An Rpcgen Specification |
|
|
320 | (2) |
|
|
322 | (1) |
|
The .h File Produced By Rpcgen |
|
|
322 | (3) |
|
The XDR Conversion File Produced By Rpcgen |
|
|
325 | (1) |
|
The Client Code Produced By Rpcgen |
|
|
326 | (2) |
|
The Server Code Produced By Rpcgen |
|
|
328 | (3) |
|
Write Stub Interface Procedures |
|
|
331 | (4) |
|
Client-Side Interface Routines |
|
|
331 | (2) |
|
Server-Side Interface Routines |
|
|
333 | (2) |
|
Compile And Link The Client Program |
|
|
335 | (4) |
|
Compile And Link The Server Program |
|
|
339 | (2) |
|
Start The Server And Execute The Client |
|
|
341 | (1) |
|
|
341 | (3) |
|
|
344 | (3) |
|
Network File System Concepts (NFS) |
|
|
347 | (30) |
|
|
347 | (1) |
|
Remote File Access Vs. Transfer |
|
|
347 | (1) |
|
Operations On Remote Files |
|
|
348 | (1) |
|
File Access Among Heterogeneous Computers |
|
|
348 | (1) |
|
|
349 | (1) |
|
NFS And UNIX File Semantics |
|
|
349 | (1) |
|
Review Of The UNIX File System |
|
|
349 | (14) |
|
|
350 | (1) |
|
A Byte Sequence Without Record Boundaries |
|
|
350 | (1) |
|
A File's Owner And Group Identifiers |
|
|
350 | (1) |
|
|
351 | (1) |
|
The Open-Read-Write-Close Paradigm |
|
|
352 | (1) |
|
|
353 | (1) |
|
Permission To Search A Directory |
|
|
353 | (1) |
|
|
354 | (1) |
|
Seeking Beyond The End Of File |
|
|
354 | (1) |
|
File Position And Concurrent Access |
|
|
355 | (1) |
|
Semantics Of Write During Concurrent Access |
|
|
356 | (1) |
|
|
356 | (1) |
|
Inode: Information Stored With A File |
|
|
357 | (1) |
|
|
358 | (1) |
|
The File Naming Mechanism |
|
|
359 | (1) |
|
|
360 | (2) |
|
|
362 | (1) |
|
|
363 | (1) |
|
|
363 | (1) |
|
|
364 | (1) |
|
|
364 | (1) |
|
|
365 | (1) |
|
|
366 | (1) |
|
|
367 | (1) |
|
NFS Client And UNIX Systems |
|
|
368 | (1) |
|
|
369 | (1) |
|
|
370 | (1) |
|
Handles Replace Path Names |
|
|
370 | (2) |
|
File Positioning With A Stateless Server |
|
|
372 | (1) |
|
Operations On Directories |
|
|
372 | (1) |
|
Reading A Directory Statelessly |
|
|
372 | (1) |
|
Multiple Hierarchies In An NFS Server |
|
|
373 | (1) |
|
|
374 | (1) |
|
Transport Protocols For NFS |
|
|
374 | (1) |
|
|
375 | (2) |
|
Network File System Protocols (NFS, Mount) |
|
|
377 | (20) |
|
|
377 | (1) |
|
Using RPC To Define A Protocol |
|
|
377 | (1) |
|
Defining A Protocol With Data Structures And Procedures |
|
|
378 | (1) |
|
NFS Constant, Type, And Data Declarations |
|
|
379 | (4) |
|
|
379 | (1) |
|
|
380 | (1) |
|
|
380 | (3) |
|
|
383 | (2) |
|
Semantics Of NFS Operations |
|
|
385 | (4) |
|
NFSPROC3_NULL (Procedure 0) |
|
|
385 | (1) |
|
NFSPROC3_GETATTR (Procedure 1) |
|
|
385 | (1) |
|
NFSPROC3_SETATTR (Procedure 2) |
|
|
385 | (1) |
|
NFSPROC3_LOOKUP (Procedure 3) |
|
|
385 | (1) |
|
NFSPROC3_ACCESS (Procedure 4) |
|
|
385 | (1) |
|
NFSPROC3_READLINK (Procedure 5) |
|
|
385 | (1) |
|
NFSPROC3_READ (Procedure 6) |
|
|
386 | (1) |
|
NFSPROC3_WRITE (Procedure 7) |
|
|
386 | (1) |
|
NFSPROC3_CREATE (Procedure 8) |
|
|
386 | (1) |
|
NFSPROC3_MKDIR (Procedure 9) |
|
|
386 | (1) |
|
NFSPROC3_SYMLINK (Procedure 10) |
|
|
386 | (1) |
|
NFSPROC3_MKNOD (Procedure 11) |
|
|
386 | (1) |
|
NFSPROC3_REMOVE (Procedure 12) |
|
|
387 | (1) |
|
NFSPROC3_RMDIR (Procedure 13) |
|
|
387 | (1) |
|
NFSPROC3_RENAME (Procedure 14) |
|
|
387 | (1) |
|
NFSPROC3_LINK (Procedure 15) |
|
|
387 | (1) |
|
NFSPROC3_READDIR (Procedure 16) |
|
|
387 | (1) |
|
NFSPROC3_READDIRPLUS (procedure 17) |
|
|
388 | (1) |
|
NFSPROC3_FSSTAT (Procedure 18) |
|
|
388 | (1) |
|
NFSPROC3_FSINFO (Procedure 19) |
|
|
388 | (1) |
|
NFSPROC3_PATHCONF (Procedure 20) |
|
|
388 | (1) |
|
NFSPROC3_COMMIT (Procedure 21) |
|
|
389 | (1) |
|
|
389 | (2) |
|
Mount Constant Definitions |
|
|
389 | (1) |
|
|
389 | (1) |
|
|
390 | (1) |
|
Procedures In The Mount Protocol |
|
|
391 | (1) |
|
Semantics of Mount Operations |
|
|
391 | (2) |
|
MOUNTPROC3_NULL (Procedure 0) |
|
|
392 | (1) |
|
MOUNTPROC3_MNT (Procedure 1) |
|
|
392 | (1) |
|
MOUNTPROC3_DUMP (Procedure 2) |
|
|
392 | (1) |
|
MOUNTPROC3_UMNT (Procedure 3) |
|
|
392 | (1) |
|
MOUNTPROC3_UMNTALL (Procedure 4) |
|
|
392 | (1) |
|
MOUNTPROC3_EXPORT (Procedure 5) |
|
|
392 | (1) |
|
NFS And Mount Authentication |
|
|
393 | (1) |
|
|
394 | (1) |
|
Changes In NFS Between Versions 3 And 4 |
|
|
394 | (1) |
|
|
395 | (2) |
|
A Telnet Client (Program Structure) |
|
|
397 | (38) |
|
|
397 | (1) |
|
|
398 | (2) |
|
|
398 | (1) |
|
Command And Control Information |
|
|
398 | (1) |
|
Terminals, Windows, and Files |
|
|
398 | (1) |
|
|
399 | (1) |
|
A Process Model For A TELNET Client |
|
|
400 | (1) |
|
A TELNET Client Algorithm |
|
|
400 | (1) |
|
|
401 | (2) |
|
Controlling A Device Driver |
|
|
402 | (1) |
|
Establishing Terminal Modes |
|
|
403 | (2) |
|
Global Variable Used For Stored State |
|
|
405 | (1) |
|
Restoring Terminal Modes Before Exit |
|
|
406 | (1) |
|
Client Suspension And Resumption |
|
|
407 | (1) |
|
Finite State Machine Specification |
|
|
408 | (1) |
|
Embedding Commands In A TELNET Data Stream |
|
|
409 | (1) |
|
|
410 | (1) |
|
|
410 | (1) |
|
TELNET Character Definitions |
|
|
411 | (1) |
|
A Finite State Machine For Data From The Server |
|
|
412 | (1) |
|
|
413 | (2) |
|
A Finite State Machine Implementation |
|
|
415 | (1) |
|
A Compact FSM Representation |
|
|
415 | (2) |
|
Keeping The Compact Representation At Run-Time |
|
|
417 | (1) |
|
Implementation Of A Compact Representation |
|
|
417 | (2) |
|
Building An FSM Transition Matrix |
|
|
419 | (2) |
|
The Socket Output Finite State Machine |
|
|
421 | (2) |
|
Definitions For The Socket Output FSM |
|
|
423 | (1) |
|
The Option Subnegotiation Finite State Machine |
|
|
424 | (1) |
|
Definitions For The Option Subnegotiation FSM |
|
|
425 | (1) |
|
|
426 | (1) |
|
Arguments For The TELNET Client |
|
|
427 | (1) |
|
The Heart Of The TELNET Client |
|
|
428 | (4) |
|
Implementation Of The Main FSM |
|
|
432 | (1) |
|
|
433 | (2) |
|
A TELNET Client (Implementation Details) |
|
|
435 | (32) |
|
|
435 | (1) |
|
The FSM Action Procedures |
|
|
435 | (1) |
|
Recording The Type Of An Option Request |
|
|
436 | (1) |
|
|
437 | (1) |
|
Responding To WILL/WONT For The Echo Option |
|
|
437 | (2) |
|
Responding To WILL/WONT For Unsupported Options |
|
|
439 | (1) |
|
Responding To WILL/WONT For The No Go-Ahead Option |
|
|
439 | (2) |
|
Generating DO/DONT For Binary Transmission |
|
|
441 | (1) |
|
Responding To DO/DONT For Unsupported Options |
|
|
442 | (1) |
|
Responding To DO/DONT For Transmit Binary Option |
|
|
442 | (2) |
|
Responding To DO/DONT For The Terminal Type Option |
|
|
444 | (1) |
|
|
445 | (1) |
|
Sending Terminal Type Information |
|
|
446 | (2) |
|
Terminating Subnegotiation |
|
|
448 | (1) |
|
Sending A Character To The Server |
|
|
448 | (2) |
|
Displaying Incoming Data On The User's Terminal |
|
|
450 | (3) |
|
Using Termcap To Control The User's Terminal |
|
|
453 | (2) |
|
Writing A Block Of Data To The Server |
|
|
455 | (1) |
|
Interacting With The Client Process |
|
|
456 | (1) |
|
Responding To Illegal Commands |
|
|
456 | (1) |
|
|
457 | (1) |
|
Implementation Of Scripting |
|
|
457 | (1) |
|
Initialization Of Scripting |
|
|
458 | (1) |
|
Collecting Characters Of The Script File Name |
|
|
459 | (1) |
|
|
460 | (2) |
|
|
462 | (1) |
|
Printing Status Information |
|
|
463 | (1) |
|
|
464 | (3) |
|
Streaming Audio And Video Transport (RTP Concept And Design) |
|
|
467 | (20) |
|
|
467 | (1) |
|
|
467 | (1) |
|
|
468 | (1) |
|
Protocol Compensation For Jitter |
|
|
468 | (1) |
|
Retransmission, Loss, And Recovery |
|
|
469 | (1) |
|
Real-Time Transport Protocol |
|
|
470 | (1) |
|
Stream Translation And Mixing |
|
|
471 | (1) |
|
Delayed Playback And Jitter Buffers |
|
|
471 | (1) |
|
RTP Control Protocol (RTCP) |
|
|
472 | (2) |
|
Synchronizing Multiple Streams |
|
|
474 | (1) |
|
RTP Transport And Many-To-Many Transmission |
|
|
475 | (1) |
|
Sessions, Streams, Protocol Ports, And Demultiplexing |
|
|
476 | (1) |
|
Basic Approaches To Encoding |
|
|
477 | (1) |
|
Conceptual Organization Of RTP Software |
|
|
478 | (1) |
|
|
479 | (2) |
|
|
481 | (1) |
|
Jitter Buffer Design And Rebuffering |
|
|
482 | (1) |
|
|
483 | (1) |
|
Playback Anomaly And Timestamp Complications |
|
|
483 | (1) |
|
Size of An Example Real-Time Library |
|
|
484 | (1) |
|
|
484 | (1) |
|
|
485 | (2) |
|
Streaming Audio And Video Transport (Example RTP Implementation) |
|
|
487 | (28) |
|
|
487 | (1) |
|
An Integrated Implementation |
|
|
487 | (1) |
|
|
488 | (1) |
|
|
488 | (4) |
|
Manipulation Of Time Values |
|
|
492 | (1) |
|
RTP Sequence Space Processing |
|
|
493 | (1) |
|
RTP Packet Queue Manipulation |
|
|
494 | (2) |
|
|
496 | (3) |
|
Keeping Statistics For RTCP |
|
|
499 | (1) |
|
|
500 | (4) |
|
|
504 | (2) |
|
Receiving RTCP Sender Reports |
|
|
506 | (1) |
|
Generating RTCP Receiver Reports |
|
|
507 | (2) |
|
|
509 | (1) |
|
|
510 | (1) |
|
Generation Of An RTCP Bye Message |
|
|
511 | (1) |
|
Size Of An Integrated Implementation |
|
|
511 | (1) |
|
|
512 | (3) |
|
Practical Hints And Techniques For Linux Servers |
|
|
515 | (18) |
|
|
515 | (1) |
|
|
515 | (1) |
|
Programming A Server To Operate In Background |
|
|
516 | (1) |
|
Open Descriptors And Inheritance |
|
|
517 | (1) |
|
Programming A Server To Close Inherited Descriptors |
|
|
518 | (1) |
|
Signals From The Controlling TTY |
|
|
518 | (1) |
|
Programming A Server To Change Its Controlling TTY |
|
|
519 | (1) |
|
Moving To A Safe And Known Directory |
|
|
519 | (1) |
|
Programming A Server To Change Directories |
|
|
520 | (1) |
|
|
520 | (1) |
|
Programming A Server To Set Its Umask |
|
|
521 | (1) |
|
|
521 | (1) |
|
Programming A Server To Set Its Process Group |
|
|
521 | (1) |
|
Descriptors For Standard I/O |
|
|
522 | (1) |
|
Programming A Server To Open Standard Descriptors |
|
|
522 | (1) |
|
Mutual Exclusion For The Server |
|
|
522 | (1) |
|
Programming A Server To Avoid Multiple Copies |
|
|
523 | (1) |
|
Recording A Server's Process ID |
|
|
524 | (1) |
|
Programming A Server To Record Its Process ID |
|
|
524 | (1) |
|
Waiting For A Child Process To Exit |
|
|
524 | (1) |
|
Programming A Server To Wait For Each Child To Exit |
|
|
525 | (1) |
|
|
525 | (1) |
|
Programming A Server To Ignore Extraneous Signals |
|
|
525 | (1) |
|
Using A System Log Facility |
|
|
525 | (6) |
|
|
525 | (1) |
|
The Advantage Of Indirection And Standard Error |
|
|
526 | (1) |
|
Limitations Of I/O Redirection |
|
|
527 | (1) |
|
|
527 | (1) |
|
|
528 | (1) |
|
|
528 | (1) |
|
|
528 | (1) |
|
|
529 | (1) |
|
|
529 | (1) |
|
An Example Syslog Configuration File |
|
|
530 | (1) |
|
|
531 | (2) |
|
Deadlock And Starvation In Client-Server Systems |
|
|
533 | (10) |
|
|
533 | (1) |
|
|
534 | (1) |
|
Difficulty Of Deadlock Detection |
|
|
534 | (1) |
|
|
535 | (1) |
|
Deadlock Between A Client And Server |
|
|
535 | (1) |
|
Avoiding Deadlock In A Single Interaction |
|
|
536 | (1) |
|
Starvation Among A Set Of Clients And A Server |
|
|
536 | (1) |
|
Busy Connections And Starvation |
|
|
537 | (1) |
|
Avoiding Blocking Operations |
|
|
538 | (1) |
|
Processes, Connections, And Other Limits |
|
|
538 | (1) |
|
Cycles Of Clients And Servers |
|
|
539 | (1) |
|
|
540 | (1) |
|
|
540 | (3) |
Appendix 1 System Calls And Library Routines Used With Sockets |
|
543 | (30) |
Appendix 2 Manipulation Of Linux File And Socket Descriptors |
|
573 | (4) |
Bibliography |
|
577 | (8) |
Index |
|
585 | |