《TCP/IP网络互连技术 卷3 客户/服务器编程和应用 BSD套接字版 英文版·第2版》求取 ⇩

Chapter 1 Introduction And Overview1

1.1 Use of TCP/IP1

1.2 Designing Applications For A Distributed Environment2

1.3 Standard And Nonstandard Application Protocols2

1.4 An Example Of Standard Application Protocol Use2

1.5 An Example Connection3

1.6 Using TELNET To Access An Alternative Service4

1.8 Viewing Services From The Provider s Perspective6

1.7 Application Protocols And Software Flexibility6

1.9 The Remainder Of This Text7

1.10 Summary7

Chapter 2 The Client Server Model And Software Design9

2.1 Introduction9

2.2 Motivation10

2.3 Terminology And Concepts10

2.3.1 Clients And Servers10

2.3.3 Standard Vs. Nonstandard Client Software11

2.3.2 Privilege And Complexity11

2.3.4 Parameterization Of Clients12

2.3.5 Connectionless Vs. Connection-Oriented Servers13

2.3.6 Stateless Vs. Stateful Servers14

2.3.7 A Stateful File Server Example14

2.3.8 Statelessness Is A Protocol Issue16

2.3.9 Servers As Clients17

2.4 Summary18

Chapter 3 Concurrent Processing In Client-Server Software21

3.1 Introduction21

3.2 Concurrency In Networks21

3.3 Concurrency In Servers23

3.4 Terminology And Concepts24

3.4.1 The Process Concept25

3.4.2 Programs vs.Processes25

3.5.1 A Sequential C Example26

3.4.3 Procedure Calls26

3.5 An Example Of Concurrent Process Creation26

3.5.2 A Concurrent Version27

3.5.3 Timeslicing29

3.5.4 Making Processes Diverge30

3.6 Executing New Code31

3.7 Context Switching And Protocol Software Design32

3.8 Concurrency And Asynchronous I/O32

3.9 Summary33

Chapter 4 Program Interface To Protocols35

4.1 Introduction35

4.2 Loosely Specified Protocol Software Interface35

4.2.1 Advantages And Disadvantages36

4.3 Interface Functionality36

4.4 Conceptual Interface Specification37

4.5 System Calls37

4.6 Two Basic Approaches To Network Communication38

4.7 The Basic I/O Functions Available In UNIX39

4.8 Using UNIX I/O With TCP/IP40

4.9 Summary40

Chapter 5 The Socket Interface43

5.1 Introduction43

5.2 Berkeley Sockets43

5.3 Specifying A Protocol Interface44

5.4 The Socket Abstraction45

5.4.1 Socket Descriptors And File Descriptors45

5.4.2 System Data Structures For Sockets46

5.4.3 Using Sockets47

5.5 Specifying An Endpoint Address47

5.6 A Generic Address Structure48

5.7 Major System Calls Used With Sockets49

5.7.1 The Socket Call49

5.7.4 The Read Call50

5.7.5 The Close Call50

5.7.2 The Connect Call50

5.7.3 The Write Call50

5.7.6 The Bind Call51

5.7.7 The Listen Call51

5.7.8 The Accept Call51

5.7.9 Summary Of Socket Calls Used With TCP51

5.8 Utility Routines For Integer Conversion52

5.9 Using Socket Calls In A Program53

5.11 Summary54

5.10 Symbolic Constants For Socket Call Parameters54

Chapter 6 Algorithms And Issues In Client Software Design57

6.1 Introduction57

6.2 Learning Algorithms Instead of Details57

6.3 Client Architecture58

6.4 Identifying The Location Of A Server58

6.5 Parsing An Address Argument60

6.6 Looking Up A Domain Name61

6.8 Port Numbers And Network Byte Order62

6.7 Looking Up A Well-Known Port By Name62

6.10 The TCP Client Algorithm63

6.9 Looking Up A Protocol By Name63

6.11 Allocating A Socket64

6.12 Choosing A Local Protocol Port Number65

6.13 A Fundamental Problem In Choosing A Local IP Address65

6.14 Connecting A TCP Socket To A Server66

6.15 Communicating With The Server Using TCP66

6.16 Reading A Response From A TCP Connection67

6.17.2 A Partial Close Operation68

6.17 Closing A TCP Connection68

6.17.1 The Need For Partial Close68

6.18 Programming A UDP Client69

6.19 Connected And Unconnected UDP Sockets69

6.20 Using Connect With UDP70

6.21 Communicating With A Server Using UDP70

6.22 Closing A Socket That Uses UDP70

6.25 Summary71

6.23 Partial Close For UDP71

6.24 A Warning About UDP Unreliability71

Chapter 7 Example Client Software75

7.1 Introduction75

7.2 The Importance Of Small Examples75

7.3 Hiding Details76

7.4 An Example Procedure Library For Client Programs76

7.5 Implementation Of ConnectTCP77

7.6 Implementation Of ConnectUDP78

7.7 A Procedure That Forms Connections79

7.8 Using The Example Library81

7.9 The DAYTIME Service82

7.10 Implementation Of A TCP Client For DAYTIME82

7.11 Reading From A TCP Connection84

7.12 The TIME Service84

7.13 Accessing The TIME Service85

7.14 Accurate Times And Network Delays85

7.15 A UDP Client For The TIME Service86

7.16 The ECHO Service88

7.17 A TCP Client For The ECHO Service88

7.18 A UDP Client For The ECHO Service90

7.19 Summary92

Chapter 8 Algorithms And Issues In Server Software Design95

8.1 Introduction95

8.2 The Conceptual Server Algorithm95

8.4 Connection-Oriented Vs.Connectionless Access96

8.3 Concurrent Vs.Iterative Servers96

8.5 Connection-Oriented Servers97

8.6 Connectionless Servers97

8.7 Failure,Reliability,And Statelessness98

8.8 Optimizing Stateless Servers99

8.9 Four Basic Types Of Servers101

8.10 Request Processing Time102

8.11 Iterative Server Algorithms102

8.13 Binding To A Well-Known Address Using INADDR_ANY103

8.12 An Iterative,Connection-Oriented Server Algorithm103

8.14 Placing The Socket In Passive Mode104

8.15 Accepting Connections And Using Them104

8.16 An Iterative,Connectionless Server Algorithm104

8.17 Forming A Reply Address In A Connectionless Server105

8.18 Concurrent Server Algorithms106

8.19 Master And Slave Processes106

8.20 A Concurrent,Connectionless Server Algorithm107

8.21 A Concurrent,Connection-Oriented Server Algorithm107

8.22 Using Separate Programs As Slaves108

8.23 Apparent Concurrency Using A Single Process109

8.24 When To Use Each Server Type110

8.25 A Summary of Server Types111

8.26 The Important Problem Of Server Deadlock112

8.27 Alternative Implementations112

8.28 Summary113

9.2 Creating A Passive Socket115

9.1 Introduction115

Chapter 9 Iterative,Connectionless Servers(UDP)115

9.3 Process Structure119

9.4 An Example TIME Server119

9.5 Summary121

Chapter 10 Iterative,Connection-Oriented Servers(TCP)123

10.1 Introduction123

10.2 Allocating A Passive TCP Socket123

10.4 Process Structure124

10.3 A Server For The DAYTIME Service124

10.5 An Example DAYTIME Server125

10.6 Closing Connections128

10.7 Connection Termination And Server Vulnerability128

10.8 Summary129

Chapter 11 Concurrent,Connection-Oriented Servers(TCP)131

11.1 Introduction131

11.2 Concurrent ECHO131

11.4 Process Structure132

11.3 Iterative Vs.Concurrent Implementations132

11.5 An Example Concurrent ECHO Server133

11.6 Cleaning Up Errant Processes137

11.7 Summary138

Chapter 12 Single-Process,Concurrent Servers(TCP)139

12.1 Introduction139

12.2 Data-driven Processing In A Server139

12.3 Data-Driven Processing With A Single Process140

12.4 Process Structure Of A Single-Process Server141

12.5 An Example Single-Process ECHO Server142

12.6 Summary144

Chapter 13 Multiprotocol Servers(TCP,UDP)147

13.1 Introduction147

13.2 The Motivation For Reducing The Number Of Servers147

13.3 Multiprotocol Server Design148

13.4 Process Structure148

13.5 An Example Multiprotocol DAYTIME Server149

13.6 The Concept Of Shared Code153

13.7 Concurrent Multiprotocol Servers153

13.8 Summary153

Chapter 14 Multiservice Servers(TCP,UDP)155

14.1 Introduction155

14.2 Consolidating Servers155

14.3 A Connectionless,Multiservice Server Design156

14.4 A Connection-Oriented,Multiservice Server Design157

14.5 A Concurrent,Connection-Oriented,Multiservice Server158

14.6 A Single-Process,Multiservice Server Implementation158

14.7 Invoking Separate Programs From A Multiservice Server159

14.8 Multiservice,Multiprotocol Designs160

14.9 An Example Multiservice Server161

14.10 Static and Dynamic Server Configuration168

14.11 The UNIX Super Server,Inetd169

14.12 An Example Inetd Server171

14.13 Summary173

Chapter 15 Uniform,Efficient Management Of Server Concurrency175

15.1 Introduction175

15.2 Choosing Between An Iterative And A Concurrent Design175

15.3 Level Of Concurrency176

15.4 Demand-Driven Concurrency177

15.5 The Cost Of Concurrency177

15.6 Overhead And Delay177

15.7 Small Delays Can Matter178

15.8 Process Preallocation179

15.8.1 Preallocation In UNIX180

15.8.2 Preallocation In A Connection-Oriented Server180

15.8.3 Preallocation In A Connectionless Server181

15.8.4 Preallocation,Bursty Traffic,And NFS182

15.8.5 Process Preallocation On A Multiprocessor183

15.9 Delayed Process Allocation183

15.10 The Uniform Basis For Both Techniques184

15.12 Summary185

15.11 Combining Techniques185

Chapter 16 Concurrency In Clients187

16.1 Introduction187

16.2 The Advantages Of Concurrency187

16.3 The Motivation For Exercising Control188

16.4 Concurrent Contact With Multiple Servers189

16.5 Implementing Concurrent Clients189

16.6 Single-Process Implementations191

16.7 An Example Concurrent Client That Uses ECHO192

16.8 Execution Of The Concurrent Client196

16.9 Concurrency In The Example Code197

16.10 Summary198

Chapter 17 Tunneling At The Transport And Application Levels199

17.1 Introduction199

17.2 Multiprotocol Environments199

17.3 Mixing Network Technologies201

17.4 Dynamic Circuit Allocation202

17.5 Encapsulation And Tunneling203

17.6 Tunneling Through An IP Internet203

17.7 Application-Level Tunneling Between Clients And Servers204

17.8 Tunneling,Encapsulation,And Dialup Phone Lines205

17.9 Summary206

Chapter 18 Application Level Gateways209

18.1 Introduction209

18.2 Clients And Servers In Constrained Environments209

18.2.1 The Reality Of Multiple Technologies209

18.2.2 Computers With Limited Functionality210

18.2.3 Connectivity Constraints That Arise From Security210

18.3 Using Application Gateways211

18.4 Interoperability Through A Mail Gateway212

18.5 Implementation Of A Mail Gateway213

18.6 A Comparison Of Application Gateways And Tunneling213

18.7 Application Gateways And Limited Functionality Systems215

18.8 Application Gateways Used For Security216

18.9 Application Gateways And The Extra Hop Problem217

18.10 An Example Application Gateway219

18.11 Implementation Of An Application Gateway220

18.12 Code For The Application Gateway221

18.13 An Example Gateway Exchange223

18.14 Using Rfcd With UNIX s forward223

18.15 A General-Purpose Application Gateway224

18.16 Operation Of SLIRP224

18.18 IP Addressing And SLIRP225

18.17 How SLIRP Handles Connections225

18.19 Summary226

Chapter 19 External Data Representation(XDR)229

19.1 Introduction229

19.2 Representations For Data In Computers229

19.3 The N-Squared Conversion Problem230

19.4 Network Standard Byte Order231

19.5 A De Facto Standard External Data Representation232

19.6 XDR Data Types233

19.7 Implicit Types234

19.8 Software Support For Using XDR234

19.9 XDR Library Routines234

19.10 Building A Message One Piece At A Time234

19.11 Conversion Routines In The XDR Library236

19.12 XDR Streams,I/O,and TCP238

19.13 Records,Record Boundaries,And Datagram I/O239

19.14 Summary239

Chapter 20 Remote Procedure Call Concept(RPC)241

20.1 Introduction241

20.2 Remote Procedure Call Model241

20.3 Two Paradigms For Building Distributed Programs242

20.4 A Conceptual Model For Conventional Procedure Calls243

20.5 An Extension Of the Procedural Model243

20.6 Execution Of Conventional Procedure Call And Return244

20.7 The Procedural Model In Distributed Systems245

20.8 Analogy Between Client-Server And RPC246

20.9 Distributed Computation As A Program247

20.10 Sun Microsystems Remote Procedure Call Definition248

20.11 Remote Programs And Procedures248

20.12 Reducing The Number Of Arguments249

20.13 Identifying Remote Programs And Procedures249

20.14 Accommodating Multiple Versions Of A Remote Program250

20.15 Mutual Exclusion For Procedures In A Remote Program251

20.16 Communication Semantics252

20.17 At Least Once Semantics252

20.18 RPC Retransmission253

20.19 Mapping A Remote Program To A Protocol Port253

20.20 Dynamic Port Mapping254

20.21 RPC Port Mapper Algorithm255

20.22 ONC RPC Message Format257

20.24 Authentication258

20.23 Marshaling Arguments For A Remote Procedure258

20.25 An Example Of RPC Message Representation259

20.26 An Example Of The UNIX Authentication Field260

20.27 Summary261

Chapter 21 Distributed Program Generation(Rpcgen Concept)265

21.1 Introduction265

21.2 Using Remote Procedure Calls266

21.3 Programming Mechanisms To Support RPC267

21.4 Dividing A Program Into Local And Remote Procedures268

21.5 Adding Code For RPC269

21.6 Stub Procedures269

21.7 Multiple Remote Procedures And Dispatching270

21.8 Name Of The Client-Side Stud Procedure271

21.9 Using Rpcgen To Generate Distributed Programs272

21.10 Rpcgen Output And Interface Procedures272

21.11 Rpcgen Input And Output273

21.13 Summary274

21.12 Using Rpcgen To Build A Client And Server274

Chapter 22 Distributed Program Generation(Rpcgen Example)277

22.1 Introduction277

22.2 An Example To Illustrate Rpcgen278

22.3 Dictionary Look Up278

22.4 Eight Steps To A Distr6ibuted Application279

22.5 Step 1:Build A Conventional Application Program280

22.6 Step 2:Divide The Program Into Two Parts284

22.7 Step 3:Create An Rpcgen Specification290

22.8 Step 4:Run Rpcgen292

22.9 The.h File Produced By Rpcgen292

22.10 The XDR Conversion File Produced By Rpcgen293

22.11 The Client Code Produced By Rpcgen294

22.12 The Server Code Produced By Rpcgen296

22.13 Step 5:Write Stub Interface Procedures299

22.13.1 Client-Side Interface Routines299

22.13.2 Server-Side Interface Routines301

22.14 Step 6:Compile And Link The Client Program303

22.15 Step 7:Compile And Link The Server Program307

22.16 Step 8:Start The Server And Execute The Client309

22.17 Using The UNIX Make Utility309

22.18 Summary311

Chapter 23 Network File System Concepts(NFS)315

23.1 Introduction315

23.2 Remote File Access Vs.Transfer315

23.3 Operations On Remote Files316

23.4 File Access Among Heterogeneous Computers316

23.5 Stateless Servers317

23.6 NFS And UNIX File Semantics317

23.7 Review Of The UNIX File System317

23.7.1 Basic Definitions317

23.7.3 A File s Owner And Group Identifiers318

23.7.4 Protection And Access318

23.7.2 A Byte Sequence Without Record Boundaries318

23.7.5 The Open-Read-Write-Close Paradigm320

23.7.6 Data Transfer321

23.7.7 Permission To Search A Directory321

23.7.8 Random Access321

23.7.9 Seeking Beyond The End Of File322

23.7.10 File Position And Concurrent Access323

23.7.11 Semantics Of Write During Concurrent Access324

23.7.12 File Names And Paths324

23.7.13 Inode:Information Stored With A File325

23.7.14 Stat Operation326

23.7.15 The File Naming Mechanism327

23.7.16 File System Mounts328

23.7.17 UNIX File Name Resolution330

23.7.18 Symbolic Links331

23.8 Files Under NFS331

23.10 NFS File Modes332

23.9 NFS File Types332

23.11 NFS File Attributes333

23.12 NFS Client And Server334

23.13 NFS Client Operation335

23.14 NFS Client And UNIX336

23.15 NFS Mounts337

23.16 File Handle338

23.17 Handles Replace Path Names338

23.18 An NFS Client In UNIX340

23.19 File Positioning With A Stateless Server340

23.20 Operations On Directories341

23.21 Reading A Directory Statelessly341

23.22 Multiple Hierarchies In An NFS Server342

23.23 The Mount Protocol342

23.24 Summary343

24.2 Using RPC To Define A Protocol345

24.1 Introduction345

Chapter 24 Network File System Protocol(NFS,Mount)345

24.3 Defining A Protocol With Data Structures And Procedures346

24.4 NFS Constant,Type,And Data Declarations347

24.4.1 NFS Constants347

24.4.2 NFS Typedef Declarations348

24.4.3 NFS Data Structures348

24.5 NFS Procedures350

24.6 Semantics Of NFS Operations351

24.6.5 NFSPROC_LOOKUP(Procedure 4)352

24.6.8 NFSPROC_WRITECACHE(Procedure 7)[Obsolete in NFS3]352

24.6.7 NFSPROC_READ(Procedure 6)352

24.6.6 NFSPROC_READLINK(Procedure 5)352

24.6.1 NFSPROC_NULL(Procedure 0)352

24.6.4 NFSPROC_ROOT(Procedure 3)[Obsolete in NFS3]352

24.6.3 NFSPROC_SETATTR(Procedure 2)352

24.6.2 NFSPROC_GETATTR(Procedure 1)352

24.6.13 NFSPROC_LINK(Procedure 12)353

24.6.12 NFSPROC_RENAME(Procedure 11)353

24.6.14 NFSPROC_SYMLINK(Procedure 13)353

24.6.11 NFSPROC_REMOVE(Procedure 10)353

24.6.10 NFSPROC_CREATE(Procedure 9)353

24.6.9 NFSPROC_WRITE(Procedure 8)353

24.6.15 NFSPROC_MKDIR(Procedure 14)354

24.6.16 NFSPROC_RMDIR(Procedure 15)354

24.6.17 NFSPROC_READDIR(Procedure 16)354

24.6.18 NFSPROC_STATFS(Procedure 17)354

24.7.2 Mount Type Definitions355

24.7.1 Mount Constant Definitions355

24.7 The Mount Protocol355

24.7.3 Mount Data Structures356

24.8 Procedures In The Mount Protocol357

24.9 Semantics of Mount Operations357

24.9.1 MNTPROC_NULL(Procedure 0)357

24.9.2 MNTPROC_MNT(Procedure 1)357

24.10 NFS And Mount Authentication358

24.9.6 MNTPROC_EXPORT(Procedure 5)358

24.9.4 MNTPROC_UMNT(Procedure 3)358

24.9.5 MNTPROC_UMNTALL(Procedure 4)358

24.9.3 MNTPROC_DUMP(Procedure 2)358

24.11 Changes In NFS Version 3360

24.12 Summary361

Chapter 25 A TELNET Client(Program Structure)363

25.1 Introduction363

25.2 Overview364

25.2.1 The User s Terminal364

25.2.2 Command And Control Information364

25.2.3 Terminals,Windows,and Files364

25.2.4 The Need For Concurrency365

25.2.5 A Process Model For A TELNET Client366

25.3 A TELNET Client Algorithm366

25.4 Terminal I/O In UNIX367

25.4.1 Controlling A Device Driver368

25.5 Establishing Terminal Modes369

25.6 Global Variable Used For Stored State371

25.7 Restoring Terminal Modes Before Exit372

25.8 Client Suspension And Resumption373

25.9 Finite State Machine Specification374

25.10 Embedding Commands In A TELNET Data Stream375

25.11 Option Negotiation376

25.12 Request/Offer Symmetry376

25.13 TELNET Character Definitions376

25.14 A Finite State Machine For Data From The Server378

25.15 Transitions Among States379

25.16 A Finite State Machine Implementation381

25.17 A Compact FSM Representation381

25.18 Keeping The Compact Representation At Run-Time383

25.19 Implementation Of A Compact Representation383

25.20 Building An FSM Transition Matrix385

25.21 The Socket Output Finite State Machine387

25.22 Definitions For The Socket Output FSM390

25.23 The Option Subnegotiation Finite State Machine391

25.24 Definitions For The Option Subnegotiation FSM392

25.25 FSM Initialization393

25.26 Arguments For The TELNET Client394

25.27 The Heart Of The TELNET Client395

25.28 Implementation Of The Main FSM399

25.29 Summary401

Chapter 26 A TELNET Client(Implementation Details)403

26.1 Introduction403

26.2 The FSM Action Procedures403

26.3 Recording The Type Of An Option Request404

26.4 Performing No Operation405

26.5 Responding To WILL/WONT For The Echo Option405

26.6 Responding To WILL/WONT For Unsupported Options407

26.7 Responding To WILL/WONT For The No Go-Ahead Option407

26.8 Generating DO/DONT For Binary Transmission409

26.9 Responding To DO/DONT For Unsupported Options410

26.10 Responding To DO/DONT For Transmit Binary Option410

26.11 Responding To DO/DONT For The Terminal Type Option412

26.12 Option Subnegotiation413

26.13 Sending Terminal Type Information414

26.14 Terminating Subnegotiation416

26.15 Sending A Character To The Server416

26.16 Displaying Incoming Data On The User s Terminal418

26.17 Using Termcap To Control The User s Terminal421

26.18 Writing A Block Of Data To The Server422

26.19 Interacting With The Client Process424

26.20 Responding To Illegal Commands424

26.22 Implementation Of Scripting425

26.21 Scripting To A File425

26.23 Initialization Of Scripting426

26.24 Collecting Characters Of The Script File Name427

26.25 Opening A Script File428

26.26 Terminating Scripting430

26.27 Printing Status Information431

26.28 Summary432

27.2 Operating In Background435

27.1 Introduction435

Chapter 27 Practical Hints And Techniques For UNIX Servers435

27.3 Programming A Server To Operate In Background436

27.4 Open Descriptors And Inheritance437

27.5 Programming A Server To Close Inherited Descriptors438

27.6 Signals From The Controlling TTY438

27.7 Programming A Server To Change Its Controlling TTY438

27.8 Moving To A Safe And Known Directory439

27.9 Programming A Server To Change Directories439

27.12 Process Groups440

27.10 The UNIX Umask440

27.11 Programming A Server To Set Its Umask440

27.13 Programming A Server To Set Its Process Group441

27.14 Descriptors For Standard I/O441

27.15 Programming A Server To Open Standard Descriptors441

27.16 Mutual Exclusion For The Server442

27.17 Programming A Server To Avoid Multiple Copies442

27.19 Programming A Server To Record Its Process ID443

27.18 Recording A Server s Process ID443

27.20 Waiting For A Child Process To Exit444

27.21 Programming A Server To Wait For Each Child To Exit444

27.22 Extraneous Signals444

27.23 Programming A Server To Ignore Extraneous Signals445

27.24 Using A System Log Facility445

27.24.1 Generating Log Messages445

27.24.2 The Advantage Of Indirection And Standard Error445

27.24.4 A Client-Server Solution446

27.24.3 Limitations Of I/O Redirection446

27.24.5 The Syslog Mechanism447

27.24.6 Syslog Message Classes447

27.24.7 Syslog Facilities447

27.24.8 Syslog Priority Levels448

27.24.9 Using Syslog448

27.24.10 An Example Syslog Configuration File449

27.25 Summary450

28.1 Introduction453

Chapter 28 Deadlock And Starvation In Client-Server Systems453

28.2 Definition Of Deadlock454

28.3 Difficulty Of Deadlock Detection454

28.4 Deadlock Avoidance455

28.5 Deadlock Between A Client And Server455

28.6 Avoiding Deadlock In A Single Interaction456

28.7 Starvation Among A Set Of Clients And A Server456

28.8 Busy Connections And Starvation457

28.9 Avoiding Blocking Operations458

28.10 Processes,Connections,And Other Limits458

28.11 Cycles Of Clients And Servers459

28.12 Documenting Dependencies459

28.13 Summary460

Appendix 1 System Calls And Library Routines Used With Sockets463

Appendix 2 manipulation Of UNIX File And Socket Descriptors493

Bibliography497

Index505

1998《TCP/IP网络互连技术 卷3 客户/服务器编程和应用 BSD套接字版 英文版·第2版》由于是年代较久的资料都绝版了,几乎不可能购买到实物。如果大家为了学习确实需要,可向博主求助其电子版PDF文件(由(美)(D.E.科默)Douglas E.Comer,(美) 1998 北京:清华大学出版社 出版的版本) 。对合法合规的求助,我会当即受理并将下载地址发送给你。