1.1
| Internet Applications Using TCP/IP   1
|
1.2
| Designing Applications For A Distributed Environment   1
|
1.3
| Standard And Nonstandard Application Protocols   2
|
1.4
| An Example Of Standard Application Protocol Use   2
|
1.5
| An Example TELNET Connection   3
|
1.6
| Using TELNET To Access An Alternative Service   4
|
1.7
| Application Protocols And Software Flexibility   5
|
1.8
| Viewing Services From The Provider's Perspective   6
|
1.9
| The Remainder Of This Text   6
|
1.10
| Summary   7
|
| For Further Study   8
|
| Exercises   8
|
2.1
| Introduction   9
|
2.2
| Motivation   10
|
2.3
| Terminology And Concepts   10
|
| 2.3.1
| Clients And Servers   11
|
| 2.3.2
| Privilege And Complexity   11
|
| 2.3.3
| Standard Vs. Nonstandard Client Software   12
|
| 2.3.4
| Parameterization Of Clients   12
|
| 2.3.5
| Connectionless Vs. Connection-Oriented Servers   13
|
| 2.3.6
| Stateless Vs. Stateful Servers   14
|
| 2.3.7
| A Stateless File Server Example   15
|
| 2.3.8
| A Stateful File Server Example   15
|
| 2.3.9
| Identifying A Client   16
|
| 2.3.10
| Statelessness Is A Protocol Issue   18
|
| 2.3.11
| Servers As Clients   19
|
2.4
| Summary   20
|
| For Further Study   20
|
| Exercises   20
|
3.1
| Introduction   23
|
3.2
| Concurrency In Networks   23
|
3.3
| Concurrency In Servers   25
|
3.4
| Terminology And Concepts   26
|
| 3.4.1
| The Process Concept   26
|
| 3.4.2
| Sharing Of Local And Global Variables   27
|
| 3.4.3
| Procedure Calls   28
|
3.5
| An Example Of Concurrent Process Creation   29
|
| 3.5.1
| A Sequential C Example   29
|
| 3.5.2
| A Concurrent Version   30
|
| 3.5.3
| Timeslicing   31
|
| 3.5.4
| Singly-Threaded Process Assumption   32
|
| 3.5.5
| Making Processes Diverge   33
|
3.6
| Executing New Code   34
|
3.7
| Context Switching And Protocol Software Design   34
|
3.8
| Concurrency And Asynchronous I/O   35
|
3.9
| Summary   36
|
| For Further Study   36
|
| Exercises   36
|
5.1
| Introduction   47
|
5.2
| Berkeley Sockets   47
|
5.3
| Specifying A Protocol Interface   48
|
5.4
| The Socket Abstraction   49
|
| 5.4.1
| Socket Descriptors And File Descriptors   49
|
| 5.4.2
| System Data Structures For Sockets   50
|
| 5.4.3
| Making A Socket Active Or Passive   51
|
5.5
| Specifying An Endpoint Address   52
|
5.6
| A Generic Address Structure   52
|
5.7
| Major System Calls In The Socket API   54
|
| 5.7.1
| The Socket Call   54
|
| 5.7.2
| The Connect Call   54
|
| 5.7.3
| The Send Call   55
|
| 5.7.4
| The Recv Call   55
|
| 5.7.5
| The Close Call   55
|
| 5.7.6
| The Bind Call   56
|
| 5.7.7
| The Listen Call   56
|
| 5.7.8
| The Accept Call   56
|
| 5.7.9
| Using Read And Write With Sockets   56
|
| 5.7.10
| Summary Of Socket Calls   57
|
5.8
| Utility Routines For Integer Conversion   58
|
5.9
| Using Socket Calls In A Program   58
|
5.10
| Symbolic Constants For Socket Call Parameters   59
|
5.11
| Summary   60
|
| For Further Study   61
|
| Exercises   61
|
6.1
| Introduction   63
|
6.2
| Learning Algorithms Instead Of Details   63
|
6.3
| Client Architecture   64
|
6.4
| Identifying The Location Of A Server   64
|
6.5
| Parsing An Address Argument   66
|
6.6
| Looking Up A Domain Name   67
|
6.7
| Looking Up A Well-Known Port By Name   68
|
6.8
| Port Numbers And Network Byte Order   68
|
6.9
| Looking Up A Protocol By Name   69
|
6.10
| The TCP Client Algorithm   69
|
6.11
| Allocating A Socket   70
|
6.12
| Choosing A Local Protocol Port Number   71
|
6.13
| A Fundamental Problem In Choosing A Local IP Address   71
|
6.14
| Connecting A TCP Socket To A Server   72
|
6.15
| Communicating With The Server Using TCP   72
|
6.16
| Receiving A Response From A TCP Connection   73
|
6.17
| Closing A TCP Connection   74
|
| 6.17.1
| The Need For Partial Close   74
|
| 6.17.2
| A Partial Close Operation   74
|
6.18
| Programming A UDP Client   75
|
6.19
| Connected And Unconnected UDP Sockets   76
|
6.20
| Using Connect With UDP   76
|
6.21
| Communicating With A Server Using UDP   76
|
6.22
| Closing A Socket That Uses UDP   77
|
6.23
| Partial Close For UDP   77
|
6.24
| A Warning About UDP Unreliability   77
|
6.25
| Summary   77
|
| For Further Study   78
|
| Exercises   78
|
7.1
| Introduction   81
|
7.2
| The Importance Of Small Examples   81
|
7.3
| Hiding Details   82
|
7.4
| An Example Procedure Library For Client Programs   82
|
7.5
| Implementation Of ConnectTCP   83
|
7.6
| Implementation Of ConnectUDP   84
|
7.7
| A Procedure That Forms Connections   85
|
7.8
| Using The Example Library   88
|
7.9
| The DAYTIME Service   88
|
7.10
| Implementation Of A TCP Client For DAYTIME   89
|
7.11
| Reading From A TCP Connection   90
|
7.12
| The TIME Service   91
|
7.13
| Accessing The TIME Service   91
|
7.14
| Accurate Times And Network Delays   92
|
7.15
| A UDP Client For The TIME Service   92
|
7.16
| The ECHO Service   94
|
7.17
| A TCP Client For The ECHO Service   94
|
7.18
| A UDP Client For The ECHO Service   96
|
7.19
| Summary   98
|
| For Further Study   99
|
| Exercises   99
|
8.1
| Introduction   101
|
8.2
| The Conceptual Server Algorithm   101
|
8.3
| Concurrent Vs. Iterative Servers   102
|
8.4
| Connection-Oriented Vs. Connectionless Access   102
|
8.5
| Transport Protocol Semantics   103
|
| 8.5.1
| TCP Semantics   103
|
| 8.5.2
| UDP Semantics   103
|
8.6
| Choice Of Transport   104
|
8.7
| Connection-Oriented Servers   104
|
8.8
| Connectionless Servers   105
|
8.9
| Failure, Reliability, And Statelessness   106
|
8.10
| Optimizing Stateless Servers   106
|
8.11
| Four Basic Types Of Servers   109
|
8.12
| Request Processing Time   109
|
8.13
| Iterative Server Algorithms   110
|
8.14
| An Iterative, Connection-Oriented Server Algorithm   110
|
8.15
| Binding To A Well-Known Address Using INADDR_ANY   111
|
8.16
| Placing The Socket In Passive Mode   112
|
8.17
| Accepting Connections And Using Them   112
|
8.18
| An Iterative, Connectionless Server Algorithm   112
|
8.19
| Forming A Reply Address In A Connectionless Server   113
|
8.20
| Concurrent Server Algorithms   114
|
8.21
| Master And Slaves   114
|
8.22
| A Concurrent, Connectionless Server Algorithm   115
|
8.23
| A Concurrent, Connection-Oriented Server Algorithm   116
|
8.24
| Implementations Of Server Concurrency   117
|
8.25
| Using Separate Programs As Slaves   118
|
8.26
| Apparent Concurrency Using A Single Thread   118
|
8.27
| When To Use Each Server Type   119
|
8.28
| A Summary of Server Types   120
|
8.29
| The Important Problem Of Server Deadlock   121
|
8.30
| Alternative Implementations   122
|
8.31
| Summary   122
|
| For Further Study   123
|
| Exercises   123
|
12.1
| Introduction   151
|
12.2
| Overview Of Linux Threads   151
|
12.3
| Advantages Of Threads   152
|
12.4
| Disadvantages Of Threads   153
|
12.5
| Descriptors, Delay, And Exit   153
|
12.6
| Thread Exit   154
|
12.7
| Thread Coordination And Synchronization   154
|
| 12.7.1
| Mutex   154
|
| 12.7.2
| Semaphore   155
|
| 12.7.3
| Condition Variable   155
|
12.8
| An Example Server Using Threads   156
|
12.9
| Monitor And Control   160
|
12.10
| Summary   161
|
| For Further Study   161
|
| Exercises   161
|
15.1
| Introduction   179
|
15.2
| Consolidating Servers   179
|
15.3
| A Connectionless, Multiservice Server Design   180
|
15.4
| A Connection-Oriented, Multiservice Server Design   181
|
15.5
| A Concurrent, Connection-Oriented, Multiservice Server   182
|
15.6
| A Single-Thread, Multiservice Server Implementation   182
|
15.7
| Invoking Separate Programs From A Multiservice Server   183
|
15.8
| Multiservice, Multiprotocol Designs   185
|
15.9
| An Example Multiservice Server   185
|
15.10
| Static and Dynamic Server Configuration   192
|
15.11
| The Super Server, Inetd   193
|
15.12
| An Example Inetd Server   195
|
15.13
| A List Of Server Variations   197
|
15.14
| Summary   197
|
| For Further Study   198
|
| Exercises   198
|
16.1
| Introduction   199
|
16.2
| Choosing Between An Iterative And A Concurrent Design   199
|
16.3
| Level Of Concurrency   200
|
16.4
| Demand-Driven Concurrency   201
|
16.5
| The Cost Of Concurrency   201
|
16.6
| Overhead And Delay   202
|
16.7
| Small Delays Can Matter   202
|
16.8
| Slave Preallocation   204
|
| 16.8.1
| Preallocation In Linux   204
|
| 16.8.2
| Preallocation In A Connection-Oriented Server   205
|
| 16.8.3
| Mutex, File Locking, and Concurrent Calls To Accept   206
|
| 16.8.4
| Preallocation In A Connectionless Server   207
|
| 16.8.5
| Preallocation, Bursty Traffic, And NFS   208
|
| 16.8.6
| Preallocation On A Multiprocessor   208
|
16.9
| Delayed Slave Allocation   208
|
16.10
| The Uniform Basis For Both Techniques   210
|
16.11
| Combining Techniques   210
|
16.12
| Summary   211
|
| For Further Study   211
|
| Exercises   211
|
18.1
| Introduction   227
|
18.2
| Multiprotocol Environments   227
|
18.3
| Mixing Network Technologies   229
|
18.4
| Dynamic Circuit Allocation   230
|
18.5
| Encapsulation And Tunneling   231
|
18.6
| Tunneling Through An IP Internet   232
|
18.7
| Application-Level Tunneling Between Clients And Servers   232
|
18.8
| Tunneling, Encapsulation, And Dialup Phone Lines   233
|
18.9
| Summary   234
|
| For Further Study   234
|
| Exercises   235
|
19.1
| Introduction   237
|
19.2
| Clients And Servers In Constrained Environments   237
|
| 19.2.1
| The Reality Of Limited Access   237
|
| 19.2.2
| Computers With Limited Functionality   238
|
| 19.2.3
| Connectivity Constraints That Arise From Security   238
|
19.3
| Using Application Gateways   238
|
19.4
| Interoperability Through A Mail Gateway   240
|
19.5
| Implementation Of A Mail Gateway   240
|
19.6
| A Comparison Of Application Gateways And Tunneling   241
|
19.7
| Application Gateways And Limited Internet Connectivity   243
|
19.8
| Application Gateways Used For Security   245
|
19.9
| Application Gateways And The Extra Hop Problem   245
|
19.10
| An Example Application Gateway   247
|
19.11
| Implementation Of An Application Gateway   248
|
19.12
| Code For The Application Gateway   250
|
19.13
| An Example Gateway Exchange   251
|
19.14
| Using Rfcd With .forward Or Slocal   252
|
19.15
| A General-Purpose Application Gateway   253
|
19.16
| Operation Of SLIRP   253
|
19.17
| How SLIRP Handles Connections   254
|
19.18
| IP Addressing And SLIRP   254
|
19.19
| Summary   255
|
| For Further Study   256
|
| Exercises   256
|
20.1
| Introduction   257
|
20.2
| Representations Of Data   257
|
20.3
| Asymmetric Conversion And The N-Squared Problem   258
|
20.4
| Network Standard Byte Order   259
|
20.5
| A De Facto Standard External Data Representation   261
|
20.6
| XDR Data Types   261
|
20.7
| Implicit Types   263
|
20.8
| Software Support For Using XDR   263
|
20.9
| XDR Library Routines   263
|
20.10
| Building A Message One Piece At A Time   264
|
20.11
| Conversion Routines In The XDR Library   265
|
20.12
| XDR Streams, I/O, and TCP   267
|
20.13
| Records, Record Boundaries, And Datagram I/O   268
|
20.14
| Summary   268
|
| For Further Study   269
|
| Exercises   269
|
21.1
| Introduction   271
|
21.2
| Remote Procedure Call Model   271
|
21.3
| Two Paradigms For Building Distributed Programs   272
|
21.4
| A Conceptual Model For Conventional Procedure Calls   273
|
21.5
| An Extension Of the Procedural Model   274
|
21.6
| Execution Of Conventional Procedure Call And Return   274
|
21.7
| The Procedural Model In Distributed Systems   275
|
21.8
| Analogy Between Client-Server And RPC   276
|
21.9
| Distributed Computation As A Program   277
|
21.10
| Sun Microsystems' Remote Procedure Call Definition   278
|
21.11
| Remote Programs And Procedures   278
|
21.12
| Reducing The Number Of Arguments   279
|
21.13
| Identifying Remote Programs And Procedures   279
|
21.14
| Accommodating Multiple Versions Of A Remote Program   280
|
21.15
| Mutual Exclusion For Procedures In A Remote Program   281
|
21.16
| Communication Semantics   282
|
21.17
| At Least Once Semantics   282
|
21.18
| RPC Retransmission   283
|
21.19
| Mapping A Remote Program To A Protocol Port   283
|
21.20
| Dynamic Port Mapping   284
|
21.21
| RPC Port Mapper Algorithm   285
|
21.22
| ONC RPC Message Format   287
|
21.23
| Marshaling Arguments For A Remote Procedure   288
|
21.24
| Authentication   288
|
21.25
| An Example Of RPC Message Representation   290
|
21.26
| An Example Of The UNIX Authentication Field   290
|
21.27
| Summary   291
|
| For Further Study   292
|
| Exercises   292
|
22.1
| Introduction   295
|
22.2
| Using Remote Procedure Calls   296
|
22.3
| Programming Mechanisms To Support RPC   297
|
22.4
| Dividing A Program Into Local And Remote Procedures   298
|
22.5
| Adding Code For RPC   299
|
22.6
| Stub Procedures   299
|
22.7
| Multiple Remote Procedures And Dispatching   300
|
22.8
| Name Of The Client-Side Stub Procedure   301
|
22.9
| Using Rpcgen To Generate Distributed Programs   302
|
22.10
| Rpcgen Output And Interface Procedures   302
|
22.11
| Rpcgen Input And Output   304
|
22.12
| Using Rpcgen To Build A Client And Server   304
|
22.13
| Summary   305
|
| For Further Study   306
|
| Exercises   306
|
23.1
| Introduction   307
|
23.2
| An Example To Illustrate Rpcgen   308
|
23.3
| Dictionary Operations   308
|
23.4
| Eight Steps To A Distributed Application   309
|
23.5
| Step 1: Build A Conventional Application Program   310
|
23.6
| Step 2: Divide The Program Into Two Parts   314
|
23.7
| Step 3: Create An Rpcgen Specification   320
|
23.8
| Step 4: Run Rpcgen   322
|
23.9
| The .h File Produced By Rpcgen   322
|
23.10
| The XDR Conversion File Produced By Rpcgen   325
|
23.11
| The Client Code Produced By Rpcgen   326
|
23.12
| The Server Code Produced By Rpcgen   328
|
23.13
| Step 5: Write Stub Interface Procedures   331
|
| 23.13.1
| Client-Side Interface Routines   331
|
| 23.13.2
| Server-Side Interface Routines   333
|
23.14
| Step 6: Compile And Link The Client Program   335
|
23.15
| Step 7: Compile And Link The Server Program   339
|
23.16
| Step 8: Start The Server And Execute The Client   341
|
23.17
| Using The Make Utility   341
|
23.18
| Summary   344
|
| For Further Study   345
|
| Exercises   345
|
24.1
| Introduction   347
|
24.2
| Remote File Access Vs. Transfer   347
|
24.3
| Operations On Remote Files   348
|
24.4
| File Access Among Heterogeneous Computers   348
|
24.5
| Stateless Servers   349
|
24.6
| NFS And UNIX File Semantics   349
|
24.7
| Review Of The UNIX File System   349
|
| 24.7.1
| Basic Definitions   350
|
| 24.7.2
| A Byte Sequence Without Record Boundaries   350
|
| 24.7.3
| A File's Owner And Group Identifiers   350
|
| 24.7.4
| Protection And Access   351
|
| 24.7.5
| The Open-Read-Write-Close Paradigm   352
|
| 24.7.6
| Data Transfer   353
|
| 24.7.7
| Permission To Search A Directory   353
|
| 24.7.8
| Random Access   354
|
| 24.7.9
| Seeking Beyond The End Of File   354
|
| 24.7.10
| File Position And Concurrent Access   355
|
| 24.7.11
| Semantics Of Write During Concurrent Access   356
|
| 24.7.12
| File Names And Paths   356
|
| 24.7.13
| Inode: Information Stored With A File   357
|
| 24.7.14
| Stat Operation   358
|
| 24.7.15
| The File Naming Mechanism   359
|
| 24.7.16
| File System Mounts   360
|
| 24.7.17
| File Name Resolution   362
|
| 24.7.18
| Symbolic Links   363
|
24.8
| Files Under NFS   363
|
24.9
| NFS File Types   364
|
24.10
| NFS File Modes   364
|
24.11
| NFS File Attributes   365
|
24.12
| NFS Client And Server   366
|
24.13
| NFS Client Operation   367
|
24.14
| NFS Client And UNIX Systems   368
|
24.15
| NFS Mounts   369
|
24.16
| File Handle   370
|
24.17
| Handles Replace Path Names   370
|
24.18
| File Positioning With A Stateless Server   372
|
24.19
| Operations On Directories   372
|
24.20
| Reading A Directory Statelessly   372
|
24.21
| Multiple Hierarchies In An NFS Server   373
|
24.22
| The Mount Protocol   374
|
24.23
| Transport Protocols For NFS   374
|
24.24
| Summary   375
|
| For Further Study   375
|
| Exercises   376
|
25.1
| Introduction   377
|
25.2
| Using RPC To Define A Protocol   377
|
25.3
| Defining A Protocol With Data Structures And Procedures   378
|
25.4
| NFS Constant, Type, And Data Declarations   379
|
| 25.4.1
| NFS Constants   379
|
| 25.4.2
| NFS Typedef Declarations   380
|
| 25.4.3
| NFS Data Structures   380
|
25.5
| NFS Procedures   383
|
25.6
| Semantics Of NFS Operations   385
|
| 25.6.1
| NFSPROC3_NULL (Procedure 0)   385
|
| 25.6.2
| NFSPROC3_GETATTR (Procedure 1)   385
|
| 25.6.3
| NFSPROC3_SETATTR (Procedure 2)   385
|
| 25.6.4
| NFSPROC3_LOOKUP (Procedure 3)   385
|
| 25.6.5
| NFSPROC3_ACCESS (Procedure 4)   385
|
| 25.6.6
| NFSPROC3_READLINK (Procedure 5)   385
|
| 25.6.7
| NFSPROC3_READ (Procedure 6)   386
|
| 25.6.8
| NFSPROC3_WRITE (Procedure 7)   386
|
| 25.6.9
| NFSPROC3_CREATE (Procedure 8)   386
|
| 25.6.10
| NFSPROC3_MKDIR (Procedure 9)   386
|
| 25.6.11
| NFSPROC3_SYMLINK (Procedure 10)   386
|
| 25.6.12
| NFSPROC3_MKNOD (Procedure 11)   386
|
| 25.6.13
| NFSPROC3_REMOVE (Procedure 12)   387
|
| 25.6.14
| NFSPROC3_RMDIR (Procedure 13)   387
|
| 25.6.15
| NFSPROC3_RENAME (Procedure 14)   387
|
| 25.6.16
| NFSPROC3_LINK (Procedure 15)   387
|
| 25.6.17
| NFSPROC3_READDIR (Procedure 16)   387
|
| 25.6.18
| NFSPROC3_READDIRPLUS (procedure 17)   388
|
| 25.6.19
| NFSPROC3_FSSTAT (Procedure 18)   388
|
| 25.6.20
| NFSPROC3_FSINFO (Procedure 19)   388
|
| 25.6.21
| NFSPROC3_PATHCONF (Procedure 20)   388
|
| 25.6.22
| NFSPROC3_COMMIT (Procedure 21)   389
|
25.7
| The Mount Protocol   389
|
| 25.7.1
| Mount Constant Definitions   389
|
| 25.7.2
| Mount Type Definitions   389
|
| 25.7.3
| Mount Data Structures   390
|
25.8
| Procedures In The Mount Protocol   391
|
25.9
| Semantics of Mount Operations   391
|
| 25.9.1
| MOUNTPROC3_NULL (Procedure 0)   392
|
| 25.9.2
| MOUNTPROC3_MNT (Procedure 1)   392
|
| 25.9.3
| MOUNTPROC3_DUMP (Procedure 2)   392
|
| 25.9.4
| MOUNTPROC3_UMNT (Procedure 3)   392
|
| 25.9.5
| MOUNTPROC3_UMNTALL (Procedure 4)   392
|
| 25.9.6
| MOUNTPROC3_EXPORT (Procedure 5)   392
|
25.10
| NFS And Mount Authentication   393
|
25.11
| File Locking   394
|
25.12
| Changes In NFS Between Versions 3 And 4   394
|
25.13
| Summary   395
|
| For Further Study   395
|
| Exercises   396
|
26.1
| Introduction   397
|
26.2
| Overview   398
|
| 26.2.1
| The User's Terminal   398
|
| 26.2.2
| Command And Control Information   398
|
| 26.2.3
| Terminals, Windows, and Files   398
|
| 26.2.4
| The Need For Concurrency   399
|
| 26.2.5
| A Process Model For A TELNET Client   400
|
26.3
| A TELNET Client Algorithm   400
|
26.4
| Terminal I/O In Linux   401
|
| 26.4.1
| Controlling A Device Driver   402
|
26.5
| Establishing Terminal Modes   403
|
26.6
| Global Variable Used For Stored State   405
|
26.7
| Restoring Terminal Modes Before Exit   406
|
26.8
| Client Suspension And Resumption   407
|
26.9
| Finite State Machine Specification   408
|
26.10
| Embedding Commands In A TELNET Data Stream   409
|
26.11
| Option Negotiation   410
|
26.12
| Request/Offer Symmetry   410
|
26.13
| TELNET Character Definitions   411
|
26.14
| A Finite State Machine For Data From The Server   412
|
26.15
| Transitions Among States   413
|
26.16
| A Finite State Machine Implementation   415
|
26.17
| A Compact FSM Representation   415
|
26.18
| Keeping The Compact Representation At Run-Time   417
|
26.19
| Implementation Of A Compact Representation   417
|
26.20
| Building An FSM Transition Matrix   419
|
26.21
| The Socket Output Finite State Machine   421
|
26.22
| Definitions For The Socket Output FSM   423
|
26.23
| The Option Subnegotiation Finite State Machine   424
|
26.24
| Definitions For The Option Subnegotiation FSM   425
|
26.25
| FSM Initialization   426
|
26.26
| Arguments For The TELNET Client   427
|
26.27
| The Heart Of The TELNET Client   428
|
26.28
| Implementation Of The Main FSM   432
|
26.29
| Summary   433
|
| For Further Study   433
|
| Exercises   434
|
27.1
| Introduction   435
|
27.2
| The FSM Action Procedures   435
|
27.3
| Recording The Type Of An Option Request   436
|
27.4
| Performing No Operation   437
|
27.5
| Responding To WILL/WONT For The Echo Option   437
|
27.6
| Responding To WILL/WONT For Unsupported Options   439
|
27.7
| Responding To WILL/WONT For The No Go-Ahead Option   439
|
27.8
| Generating DO/DONT For Binary Transmission   441
|
27.9
| Responding To DO/DONT For Unsupported Options   442
|
27.10
| Responding To DO/DONT For Transmit Binary Option   442
|
27.11
| Responding To DO/DONT For The Terminal Type Option   444
|
27.12
| Option Subnegotiation   445
|
27.13
| Sending Terminal Type Information   446
|
27.14
| Terminating Subnegotiation   448
|
27.15
| Sending A Character To The Server   448
|
27.16
| Displaying Incoming Data On The User's Terminal   450
|
27.17
| Using Termcap To Control The User's Terminal   453
|
27.18
| Writing A Block Of Data To The Server   455
|
27.19
| Interacting With The Client Process   456
|
27.20
| Responding To Illegal Commands   456
|
27.21
| Scripting To A File   457
|
27.22
| Implementation Of Scripting   457
|
27.23
| Initialization Of Scripting   458
|
27.24
| Collecting Characters Of The Script File Name   459
|
27.25
| Opening A Script File   460
|
27.26
| Terminating Scripting   462
|
27.27
| Printing Status Information   463
|
27.28
| Summary   464
|
| For Further Study   464
|
| Exercises   465
|
28.1
| Introduction   467
|
28.2
| Streaming Service   467
|
28.3
| Real-Time Delivery   468
|
28.4
| Protocol Compensation For Jitter   468
|
28.5
| Retransmission, Loss, And Recovery   469
|
28.6
| Real-Time Transport Protocol   470
|
28.7
| Stream Translation And Mixing   471
|
28.8
| Delayed Playback And Jitter Buffers   471
|
28.9
| RTP Control Protocol (RTCP)   472
|
28.10
| Synchronizing Multiple Streams   474
|
28.11
| RTP Transport And Many-To-Many Transmission   475
|
28.12
| Sessions, Streams, Protocol Ports, And Demultiplexing   476
|
28.13
| Basic Approaches To Encoding   477
|
28.14
| Conceptual Organization Of RTP Software   478
|
28.15
| Process\|/\|Thread Structure   479
|
28.16
| Semantics Of The API   481
|
28.17
| Jitter Buffer Design And Rebuffering   482
|
28.18
| Event Handling   483
|
28.19
| Playback Anomaly And Timestamp Complications   483
|
28.20
| Size of An Example Real-Time Library   484
|
28.21
| An Example MP3 Player   484
|
28.22
| Summary   485
|
| For Further Study   486
|
| Exercises   486
|
29.1
| Introduction   487
|
29.2
| An Integrated Implementation   487
|
29.3
| Program Architecture   488
|
29.4
| RTP Definitions   488
|
29.5
| Manipulation Of Time Values   492
|
29.6
| RTP Sequence Space Processing   493
|
29.7
| RTP Packet Queue Manipulation   494
|
29.8
| RTP Input Processing   496
|
29.9
| Keeping Statistics For RTCP   499
|
29.10
| RTP Initialization   500
|
29.11
| RTCP Definitions   504
|
29.12
| Receiving RTCP Sender Reports   506
|
29.13
| Generating RTCP Receiver Reports   507
|
29.14
| RTCP Header Creation   509
|
29.15
| RTCP Delay Computation   510
|
29.16
| Generation Of An RTCP Bye Message   511
|
29.17
| Size Of An Integrated Implementation   511
|
29.18
| Summary   512
|
| For Further Study   512
|
| Exercises   513
|
30.1
| Introduction   515
|
30.2
| Operating In Background   515
|
30.3
| Programming A Server To Operate In Background   516
|
30.4
| Open Descriptors And Inheritance   517
|
30.5
| Programming A Server To Close Inherited Descriptors   518
|
30.6
| Signals From The Controlling TTY   518
|
30.7
| Programming A Server To Change Its Controlling TTY   519
|
30.8
| Moving To A Safe And Known Directory   519
|
30.9
| Programming A Server To Change Directories   520
|
30.10
| The Linux Umask   520
|
30.11
| Programming A Server To Set Its Umask   521
|
30.12
| Process Groups   521
|
30.13
| Programming A Server To Set Its Process Group   521
|
30.14
| Descriptors For Standard I/O   522
|
30.15
| Programming A Server To Open Standard Descriptors   522
|
30.16
| Mutual Exclusion For The Server   522
|
30.17
| Programming A Server To Avoid Multiple Copies   523
|
30.18
| Recording A Server's Process ID   524
|
30.19
| Programming A Server To Record Its Process ID   524
|
30.20
| Waiting For A Child Process To Exit   524
|
30.21
| Programming A Server To Wait For Each Child To Exit   525
|
30.22
| Extraneous Signals   525
|
30.23
| Programming A Server To Ignore Extraneous Signals   525
|
30.24
| Using A System Log Facility   525
|
| 30.24.1
| Generating Log Messages   525
|
| 30.24.2
| The Advantage Of Indirection And Standard Error   526
|
| 30.24.3
| Limitations Of I/O Redirection   527
|
| 30.24.4
| A Client-Server Solution   527
|
| 30.24.5
| The Syslog Mechanism   528
|
| 30.24.6
| Syslog Message Classes   528
|
| 30.24.7
| Syslog Facilities   528
|
| 30.24.8
| Syslog Priority Levels   529
|
| 30.24.9
| Using Syslog   529
|
| 30.24.10
| An Example Syslog Configuration File   530
|
30.25
| Summary   531
|
| For Further Study   531
|
| Exercises   532
|
31.1
| Introduction   533
|
31.2
| Definition Of Deadlock   534
|
31.3
| Difficulty Of Deadlock Detection   534
|
31.4
| Deadlock Avoidance   535
|
31.5
| Deadlock Between A Client And Server   535
|
31.6
| Avoiding Deadlock In A Single Interaction   536
|
31.7
| Starvation Among A Set Of Clients And A Server   536
|
31.8
| Busy Connections And Starvation   537
|
31.9
| Avoiding Blocking Operations   538
|
31.10
| Processes, Connections, And Other Limits   538
|
31.11
| Cycles Of Clients And Servers   539
|
31.12
| Documenting Dependencies   540
|
31.13
| Summary   540
|
| Exercises   541
|