图书介绍

用TCP/IP进行网际互联 第3卷 客户-服务器编程与应用 Linux/POSIX套接字版PDF|Epub|txt|kindle电子书版本网盘下载

用TCP/IP进行网际互联 第3卷 客户-服务器编程与应用 Linux/POSIX套接字版
  • (美)Douglas E.Comer,(美)David L.Stevens著;赵刚等译 著
  • 出版社: 北京:电子工业出版社
  • ISBN:7505365908
  • 出版时间:2001
  • 标注页数:431页
  • 文件大小:20MB
  • 文件页数:459页
  • 主题词:

PDF下载


点此进入-本书在线PDF格式电子书下载【推荐-云解压-方便快捷】直接下载PDF格式图书。移动端-PC端通用
种子下载[BT下载速度快]温馨提示:(请使用BT下载软件FDM进行下载)软件下载地址页直链下载[便捷但速度慢]  [在线试读本书]   [在线获取解压码]

下载说明

用TCP/IP进行网际互联 第3卷 客户-服务器编程与应用 Linux/POSIX套接字版PDF格式电子书版下载

下载的文件为RAR压缩包。需要使用解压软件进行解压得到PDF格式图书。

建议使用BT下载工具Free Download Manager进行下载,简称FDM(免费,没有广告,支持多平台)。本站资源全部打包为BT种子。所以需要使用专业的BT下载软件进行下载。如BitComet qBittorrent uTorrent等BT下载工具。迅雷目前由于本站不是热门资源。不推荐使用!后期资源热门了。安装了迅雷也可以迅雷进行下载!

(文件页数 要大于 标注页数,上中下等多册电子书除外)

注意:本站所有压缩包均有解压码: 点击下载压缩包解压工具

图书目录

1.1 使用TCP/IP的因特网应用1

1.2 为分布式环境设计应用程序1

1.3 标准和非标准的应用协议1

1.4 使用标准应用协议的例子1

第1章 引言和概述1

1.5 telnet连接的例子2

1.6 使用TELNET访问其他服务3

1.7 应用协议和软件的灵活性4

1.8 从提供者的角度看服务4

深入研究5

习题5

1.9 本教材的其余部分5

1.10 小结5

第2章 客户-服务器模型与软件设计7

2.1 引言7

2.2 动机7

2.3 术语和概念8

2.3.1 客户和服务器8

2.3.2 特权和复杂性8

2.3.4 客户的参数化9

2.3.3 标准和非标准客户软件9

2.3.5 无连接的和面向无连接的服务器10

2.3.6 无状态和有状态服务器10

2.3.7 无状态文件服务器的例子11

2.3.8 有状态文件服务器的例子11

2.3.9 标识客户12

2.3.10 无状态是一个协议问题13

2.3.11 充当客户的服务器13

2.4 小结14

深入研究14

习题15

第3章 客户-服务器软件中的并发处理16

3.1 引言16

3.2 网络中的并发16

3.3 服务器中的并发17

3.4 术语和概念18

3.4.1 进程概念18

3.4.2 局部和全局变量的共享19

3.4.3 过程调用20

3.5 一个创建并发进程的例子20

3.5.1 一个顺序执行的C实例20

3.5.2 程序的开发版本21

3.5.3 时间分片22

3.5.5 使各进程分离23

3.5.4 单线程的进程23

3.6 执行新的代码24

3.7 上下文切换和协议软件设计25

3.8 并发和异步I/O25

3.9 小结25

深入研究26

习题26

4.2 不精确指明的协议软件接口27

4.2.1 优点与缺点27

4.1 引言27

第4章 协议的程序接口27

4.3 接口功能28

4.4 概念性接口的规约28

4.5 系统调用28

4.6 网络通信的两种基本方法29

4.7 LINIX中提供的基本I/O功能29

4.8 将Linux I/O用于TCP/IP30

深入研究31

习题31

4.9 小结31

第5章 套接字API32

5.1 引言32

5.2 Berkeley套接字32

5.3 指明一个协议接口32

5.4 套接字的抽象33

5.4.1 套接字描述符和文件描述符33

5.4.2 针对套接字的系统数据结构34

5.5 指明端点地址35

5.6 类属地址结构35

5.4.3 主动套接字或被动套接字35

5.7 套接字API中的主要系统调用36

5.7.1 socket调用37

5.7.2 connect调用37

5.7.3 send调用37

5.7.4 recv调用37

5.7.5 close调用38

5.7.6 bind调用38

5.7.7 listen调用38

5.5.8 accept调用38

5.7.9 在套接字中使用read和write38

5.8 用于整数转换的实用例程39

5.7.10 套接字调用小结39

5.10 套接字调用的参数所使用的符号常量40

5.9 在程序中使用套接字调用40

5.11 小结41

深入研究41

习题41

第6章 客户软件设计中的算法和问题43

6.1 引言43

6.2 不是研究细节而是学习算法43

6.3 客户体系结构43

6.4 标识服务器的位置44

6.6 查找域名45

6.5 分析地址参数45

6.7 由名字查找某个熟知端口46

6.8 端口号和网络字节顺序47

6.9 由名字查找协议47

6.10 TCP客户算法48

6.11 分配套接字48

6.12 选择本地协议端口号48

6.13 选择本地IP地址中的一个基本问题49

6.14 将TCP套接字连接到某个服务器49

6.16 从TCP连接中读取响应50

6.15 使用TCP与服务器通信50

6.17 关闭TCP连接51

6.17.1 对部分关闭的需要51

6.17.2 部分关闭的操作51

6.18 UDP客户的编程51

6.19 连接的和非连接的UDP套接字52

6.20 对UDP使用connect52

6.21 使用UDP与服务器通信52

6.25 小结53

6.24 关于UDP不可靠性的警告53

6.23 对UDP的部分关闭53

6.22 关闭使用UDP的套接字53

深入研究54

习题54

第7章 客户软件举例55

7.1 引言55

7.2 小例子的重要性55

7.3 隐藏细节55

7.4 针对客户程序的过程库例子56

7.5 connectTCP的实现56

7.7 构成连接的过程57

7.6 connectUDP的实现57

7.8 使用例子库60

7.9 DAYTIME服务60

7.10 针对DAYTIME的TCP客户实现61

7.11 从TCP连接中进行读62

7.12 TIME服务63

7.13 访问TIME服务63

7.14 精确时间和网络时延63

7.15 针对TIME服务的UDP客户64

7.16 ECHO服务65

7.17 针对ECHO服务的TCP客户66

7.18 针对ECHO服务的UDP客户67

7.19 小结69

深入研究70

习题70

第8章 服务器软件设计的算法和问题71

8.1 引言71

8.2 概念性的服务器算法71

8.3 并发服务器和循环服务器71

8.5 传输协议的语义72

8.5.1 TCP语义72

8.4 面向连接的和无连接的访问72

8.5.2 UDP语义73

8.6 选择传输协议73

8.7 面向连接的服务器73

8.8 无连接的服务器74

8.9 故障、可靠性和无状态74

8.10 优化无状态服务器75

8.11 四种基本类型的服务器76

8.12 请求处理时间77

8.13 循环服务器的算法77

8.16 将套接字置于被动模式78

8.14 一种循环的、面向连接的服务器的算法78

8.15 用INADDR_ANY绑定熟知端口78

8.17 接受连接并使用这些连接79

8.18 循环的、无连接的服务器的算法79

8.19 在无连接的服务器中构造应答79

8.20 并发服务器的算法80

8.21 主线程和从线程80

8.22 并发的、无连接的服务器的算法81

8.23 并发的、面向连接服务器的算法81

8.25 把单独的程序作为从进程来使用82

8.24 服务器并发性的实现82

8.26 使用单线程获得表面上的并发性83

8.27 各服务器类型所适用的场合83

8.28 服务器类型小结84

8.29 重要问题——服务器死锁85

8.30 其他的实现方法85

8.31 小结85

深入研究86

习题86

9.2 创建被动套接字87

9.1 引言87

第9章 循环的、无连接服务器(UDP)87

9.3 进程结构90

9.4 TIME服务器举例91

9.5 小结92

深入研究92

习题93

第10章 循环的、面向连接的服务器(TCP)94

10.1 引言94

10.2 分配被动的TCP套接字94

10.5 DAYTIME服务器举例95

10.4 进程结构95

10.3 用于DAYTIME服务的服务器95

10.6 关闭连接98

10.7 连接终止和服务器的脆弱性98

10.8 小结98

深入研究99

习题99

第11章 并发的、面向连接的服务器(TCP)100

11.1 引言100

11.2 并发ECHO100

11.3 循环与并发实现的比较100

11.5 并发ECHO服务器举例101

11.4 进程结构101

11.6 清除游离(errant)进程104

11.7 小结105

深入研究105

习题105

第12章 将线程用于并发(TCP)106

12.1 引言106

12.2 Linux线程概述106

12.3 线程的优点106

12.5 描述符、延迟和退出107

12.4 线程的缺点107

12.7 线程协调和同步108

12.7.1 互斥108

12.7.2 信号量108

12.6 线程退出108

12.7.3 条件变量109

12.8 使用线程的服务器实例109

12.9 监控113

12.10 小结113

深入研究113

习题114

13.2 服务器中的数据驱动处理115

第13章 单线程、并发服务器(TCP)115

13.1 引言115

13.3 用单线程进行数据驱动处理116

13.4 单线程服务器的线程结构116

13.5 单线程ECHO服务器举例117

13.6 小结119

深入研究119

习题120

14.3 多协议服务器的设计121

14.2 减少服务器数量的动机121

14.1 引言121

第14章 多协议服务器(TCP,UDP)121

14.4 进程结构122

14.5 多协议DAYTIME服务器的例子122

14.6 共享代码的概念125

14.7 并发多协议服务器125

14.8 小结126

深入研究126

习题126

15.2 合并服务器127

15.3 无连接的、多服务服务器的设计127

15.1 引言127

第15章 多服务服务器(TCP,UDP)127

15.4 面向连接的、多服务服务器的设计128

15.5 并发的、面向连接的、多服务服务器129

15.6 单线程的、多服务服务器的实现129

15.7 从多服务服务器调用单独的程序130

15.8 多服务、多协议设计131

15.9 多服务服务器的例子131

15.10 静态的和动态的服务器配置137

15.11 UNIX超级服务器,inetd138

15.12 inetd服务器的例子140

15.13 服务器的几种变形清单141

15.14 小结141

深入研究142

习题142

第16章 服务器并发性的统一、高效管理143

16.1 引言143

16.2 在循环设计和并发设计间选择143

16.3 并发等级143

16.6 额外开销和时延144

16.4 需求驱动的并发144

16.5 并发的代价144

16.7 小时延可能出麻烦145

16.8 从线程/进程预分配146

16.8.1 Linux中的预分配146

16.8.2 面向连接服务器中的预分配147

16.8.3 互斥、文件锁定和accept并发调用147

16.8.4 无连接服务器中的预分配148

16.8.6 多处理器上的预分配149

16.9 延迟的从线程/进程分配149

16.8.5 预分配、突发通信量和NFS149

16.10 两种技术统一的基础150

16.11 技术的结合150

16.12 小结151

深入研究151

习题151

第17章 客户进程中的并发153

17.1 引言153

17.2 并发的优点153

17.3 运用控制的动机153

17.5 实现并发客户154

17.4 与多个服务器的并发联系154

17.6 单线程实现155

17.7 使用ECHO的并发客户例子156

17.8 并发客户的执行160

17.9 例子代码中的并发性161

17.10 小结161

习题162

第18章 运输层和应用层的隧道技术163

18.1 引言163

18.2 多协议环境163

18.3 混合网络技术164

18.4 动态电路分配165

18.5 封装和隧道技术166

18.6 通过IP互联网的隧道技术166

18.7 客户和服务器之间的应用级隧道技术166

18.8 隧道技术、封装和电话拨号线167

18.9 小结168

深入研究168

习题168

19.2.1 限制访问的现实169

19.2.3 安全性引起的连通性约束169

19.2.2 有限功能的计算机169

19.1 引言169

19.2 在受约束的环境中的客户和服务器169

第19章 应用级网关169

19.3 使用应用网关170

19.4 通过邮件网关互操作171

19.5 邮件网关的实现171

19.6 应用网关与隧道技术的比较172

19.7 应用网关和有限因特网连接173

19.9 应用网关和额外跳问题174

19.8 为解决安全问题而使用的应用网关174

19.10 应用网关举例176

19.11 一个应用网关的实现176

19.12 应用网关的代码178

19.13 网关交换的例子179

19.14 使用rfed和.forward或slocal文件179

19.15 通用的应用网关180

19.16 SLIRP的运行180

19.17 SLIRP如何处理连接181

19.18 IP寻址和SLIRP181

深入研究182

19.19 小结182

习题183

第20章 外部数据表示(XDR)184

20.1 引言184

20.2 数据表示184

20.3 N平方转换问题185

20.4 网络标准字节顺序185

20.5 外部数据表示的事实上的标准186

20.6 XDR数据类型186

20.7 隐含类型187

20.8 使用XDR的软件支持187

20.10 一次一片地构造报文188

20.9 XDR库例程188

20.11 XDR库中的转换例程189

20.12 XDR流、I/O和TCP190

20.13 记录、记录边界和数据报I/O190

20.14 小结191

深入研究191

习题191

21.3 构建分布式程序的两种模式193

21.2 远程过程调用模型193

21.1 引言193

第21章 远程过程调用(RPC)的概念193

21.4 常规过程调用的概念性模型194

21.5 过程模型的扩充194

21.6 常规过程调用的执行和返回195

21.7 分布式系统中的过程模型196

21.8 客户-服务器和RPC之间的类比196

21.9 作为程序的分布式计算197

21.10 Sun Microsystems的远程过程调用定义197

21.12 减少参数的数量198

21.13 标识远程程序和过程198

21.11 远程程序和过程198

21.14 适应远程程序的多个版本200

21.15 远程程序中的互斥200

21.16 通信语义200

21.17 至少一次语义201

21.18 RPC重传201

21.19 将远程程序映射到协议端口201

21.20 动态端口映射202

21.21 RPC端口映射器算法202

21.22 ONC RPC的报文格式203

21.24 鉴别205

21.23 对远程过程进行参数排序205

21.25 RPC报文表示的例子206

21.26 UNIX鉴别字段的例子206

21.27 小结207

深入研究208

习题208

第22章 分布式程序的生成(rpcgen的概念)209

22.1 引言209

22.2 使用远程过程调用209

22.3 支持RCP的编程工具210

22.5 为RPC增加代码211

22.4 将程序划分成本地过程和远程过程211

22.6 stub过程212

22.7 多个远程过程和分派212

22.8 客户端的stub过程的名字213

22.9 使用rpcgen生成分布式程序213

22.10 rpcgen输出和接口过程214

22.11 rpcgen的输入和输出215

22.12 使用rpcgen构建客户和服务器215

22.13 小结215

习题216

深入研究216

第23章 分布式程序的生成(rpcgen的例子)218

23.1 引言218

23.2 说明rpcgen的例子218

23.3 查找字典218

23.4 分布式程序的八个步骤219

23.5 步骤1:构建常规应用程序220

23.6 步骤2:将程序划分成两部分224

23.7 步骤3:创建rpcgen规约229

23.8 步骤4:运行rpcgen230

23.9 rpcgen产生的.h文件230

23.10 rpcgen产生的XDR转换文件232

23.11 rpcgen产生的客户代码233

23.12 rpcgen产生的服务器代码235

23.13 步骤5:编写stub接口过程238

23.13.1 客户端接口例程238

23.13.2 服务器端接口例程240

23.14 步骤6:编译和链接客户程序241

23.15 步骤7:编译和链接服务器程序244

23.16 步骤8:启动服务器和执行客户246

23.17 使用make实用程序247

习题249

23.18 小结249

深入研究249

第24章 网络文件系统(NFS)的概念251

24.1 引言251

24.2 远程文件存取和传送251

24.3 对远程文件的操作252

24.4 异构计算机之间的文件存取252

24.5 无状态服务器252

24.6 NFS和UNIX的文件语义252

24.7.4 保护和存取253

24.7.3 文件拥有者和组标识符253

28.17 抖动缓存的设计和重新缓存253

24.7.1 基本定义253

24.7.2 无记录界限的字节序列253

24.7 UNIX文件系统的回顾253

24.7.5 打开-读-写-关闭范例254

24.7.8 随机存取255

24.7.6 数据传送255

24.7.7 搜索目录权限255

24.7.10 文件位置和并发存取256

24.7.9 搜索超过文件的结束256

24.7.11 在并发存取时的“写(write)”语义257

24.7.12 文件名和路径257

24.7.13 索引节点(inode):存储在文件中的信息257

24.7.15 文件命名机制259

24.7.14 stat操作259

24.7.16 文件系统mount260

24.7.17 UNIX文件名解析261

24.7.18 符号链接262

24.8 NFS下的文件262

24.9 NFS的文件类型262

24.10 NFS文件模式263

24.11 NFS文件属性263

24.12 NFS客户和服务器264

24.13 NFS客户操作265

24.14 NFS客户与UNIX系统266

24.15 NFS安装266

24.17 句柄取代路径名267

24.16 文件句柄267

24.18 无状态服务器的文件定位268

24.19 对目录的操作269

24.20 无状态地读目录269

24.21 NFS服务器中的多个分层结构269

24.22 安装(mount)协议270

24.23 NFS的传输协议270

24.24 小结270

深入研究271

习题271

第25章 网络文件系统协议(NFS,Mount)272

25.1 引言272

25.2 用RPC定义协议272

25.3 用数据结构和过程定义协议272

25.4 NFS常数、类型和数据声明273

25.4.1 NFS常数273

25.4.2 NFS的typedef声明274

25.4.3 NFS数据结构274

25.6 NFS操作的语义277

25.5 NFS过程277

25.6.1 NFSPROC3_NULL(过程0)277

25.6.7 NFSPROC3_READ(过程6)278

25.6.2 NFSPROC3_GETATTR(过程1)278

25.6.9 NFSPROC3_CREATE(过程8)278

25.6.8 NFSPROC3_WRITE(过程7)278

25.6.10 NFSPROC3_MKDIR(过程9)278

25.6.6 NFSPROC3_READLINK(过程5)278

25.6.5 NFSPROC3_ACCESS(过程4)278

25.6.4 NFSPROC3_LOOKUP(过程3)278

25.6.3 NFSPROC3_SETATTR(过程2)278

25.6.11 NFSPROC3_SYMLINK(过程10)279

25.6.12 NFSPROC3_MKNOD(过程11)279

25.6.13 NFSPROC3_REMOVE(过程12)279

25.6.14 NFSPROC3_RMDIR(过程13)279

25.6.15 NFSPROC3_RENAME(过程14)279

25.6.16 NFSPROC3_LINK(过程15)279

25.6.17 NFSPROC3_READDIR(过程16)279

25.7.1 安装协议的常数定义280

25.7 安装协议280

25.6.19 NFSPROC3_FSSTAT(过程18)280

25.6.20 NFSPROC3_FSINO(过程19)280

25.6.22 NFSPROC3_COMMIT(过程21)280

25.6.21 NFSPROC3_PATHCONF(过程20)280

25.6.18 NFSPROC3_READDIRPLUS(过程17)280

25.7.2 安装协议的类型定义281

25.7.3 安装数据结构281

25.8 安装协议中的过程282

25.9 安装操作的语义282

25.9.1 MOUNTPROC3_NULL(过程0)282

25.9.2 MOUNTPROC3_MNT(过程1)282

25.9.3 MOUNTPROC3_DUMP(过程2)283

25.9.4 MOUNTPROC3_UMNT(过程3)283

25.9.5 MOUNTPROC3_UMNTALL(过程4)283

25.9.6 MOUNTPROC3_EXPORT(过程5)283

25.10 NFS和安装鉴别283

25.11 文件加锁284

25.12 NFS第3版与第4版之间的变化284

习题285

25.13 小结285

深入研究285

26.2.2 命令和控制信息287

26.1 引言287

第26章 TELNET客户(程序结构)287

26.2.1 用户终端287

26.2 概述287

26.2.3 终端、窗口和文件288

26.2.4 对并发性的需要288

26.2.5 TELNET客户的过程模型288

26.3 TELNET客户算法289

26.4 Linux中的终端I/O289

26.4.1 控制设备驱动器291

26.5 建立终端模式291

26.6 用于保存状态的全局变量292

26.7 在退出之前恢复终端模式293

26.8 客户挂起与恢复294

26.9 有限状态机的规约295

26.10 在TELNET数据流中嵌入命令296

26.11 选项协商296

26.12 请求/提供的对称性297

26.13 TELNET字符定义297

26.14 针对来自服务器数据的有限状态机298

26.15 在各种状态之间转移299

26.17 压缩的有限状态机表示300

26.16 有限状态机的实现300

26.18 在运行时维持压缩表示302

26.19 压缩表示的实现302

26.20 构造有限状态机转移矩阵304

26.21 套接字输出有限状态机305

26.22 套接字输出有限状态机的相关定义306

26.23 选项子协商有限状态机307

26.24 选项子协商有限状态机的相关定义308

26.25 有限状态机初始化309

26.26 TELNET客户的参数310

26.27 TELNET客户的核心311

26.28 主有限状态机的实现314

26.29 小结315

深入研究315

习题316

27.2 有限状态机动作过程317

27.3 记录选项请求的类型317

27.1 引言317

第27章 TELNET客户(实现细节)317

27.4 完成空操作318

27.5 对回显选项的WILL/WONT做出响应318

27.6 对未被支持的选项的WILL/WONT做出响应320

27.7 对no go-ahead选项的WILL/WONT做出响应320

27.8 生成用于二进制传输的DO/DONT321

27.9 对未被支持的选项的DO/DONT做出响应322

27.10 对传输二进制选项的DO/DONT做出响应323

27.11 对终端类型选项的DO/DONT做出响应324

27.12 选项子协商326

27.13 发送终端类型信息326

27.15 向服务器发送字符328

27.14 终止子协商328

27.16 显示在用户终端上出现的传入数据329

27.17 使用termcap控制用户终端332

27.18 将数据块写到服务器333

27.19 与客户进程交互334

27.20 对非法命令做出响应335

27.21 脚本描述文件335

27.22 脚本描述的实现336

27.23 初始化脚本描述336

27.24 收集脚本文件名的字符337

27.25 打开脚本文件338

27.26 终止脚本描述339

27.27 打印状态信息340

深入研究341

27.28 小结341

习题342

第28章 流式音频和视频传输(RTP概念和设计)343

28.1 引言343

28.2 流式传输服务343

28.3 实时交付343

28.4 抖动的协议补偿343

28.5 重传、丢失和恢复344

28.6 实时传输协议344

28.7 流的转换和混合345

28.8 迟延回放和抖动缓存346

28.9 RTP控制协议(RTCP)346

28.10 多种流同步347

28.11 RTP传输和多对多传输348

28.12 会话、流、协议端口和分用349

28.13 编码的基本方法350

28.14 RTP软件的概念性组织350

28.15 进程/线程结构351

28.16 API的语义352

28.18 事件处理354

28.19 回放异常及时间戳的复杂性354

28.20 实时库例子的大小354

28.21 MP3播放器的例子355

28.22 小结355

深入研究356

习题356

29.2 集成实现357

29.3 程序结构357

29.1 引言357

第29章 流式音频和视频传输(RTP实现示例)357

29.4 RTP定义358

29.5 时间值的处理361

29.6 RTP序列空间的处理362

29.7 RTP分组队列的处理363

29.8 RTP输入处理365

29.9 为RTCP保存统计信息367

29.10 RTP初始化368

29.11 RTCP的定义372

29.12 接收RTCP发送方的报告373

29.13 产生RTCP接收方的报告374

29.14 创建RTCP的首部376

29.15 RTCP时延的计算376

29.16 RTCP Bye(再见)报文的产生377

29.17 集成实现的大小378

29.18 小结378

深入研究378

习题379

30.2 后台操作380

30.1 引言380

第30章 Linux服务器中的实用技巧和技术380

30.3 编写在后台运行的服务器381

30.4 打开描述符和继承382

30.5 对服务器编程以关闭所继承的描述符382

30.6 来自控制TTY的信号382

30.7 对服务器编程以改变它的控制TTY382

30.8 转移到一个安全的和已知的目录383

30.9 对服务器编程以改变目录383

30.10 Linux umask383

30.14 标准I/O描述符384

30.13 对服务器编程以设置其进程组384

30.11 对服务器编程以设置其umask384

30.12 进程组384

30.15 对服务器编程以打开标准描述符385

30.16 服务器互斥385

30.17 对服务器编程以避免多个副本385

30.18 记录服务器的进程ID386

30.19 对服务器编程以记录其进程ID386

30.20 等待一个子进程退出386

30.24 使用系统日志设施387

30.24.1 产生日志报文387

30.22 外来信号387

30.23 对服务器编程以忽略外来信号387

30.21 对服务器编程以等待每个子进程退出387

30.24.2 间接方式和标准差错的优点388

30.24.3 I/O重定向的限制388

30.24.4 客户-服务器的解决方案388

30.24.5 syslog机制389

30.24.6 syslog的报文类389

30.24.7 syslog的设施389

30.24.8 syslog的优先级389

30.24.10 syslog配置文件举例390

30.24.9 使用syslog390

30.25 小结391

深入研究392

习题392

第31章 客户-服务器系统中的死锁和资源缺乏393

31.1 引言393

31.2 死锁的定义393

31.3 死锁检测的难度393

31.4 避免死锁394

31.5 客户和服务器间的死锁394

31.8 忙连接和资源缺乏395

31.6 在单个交互中避免死锁395

31.7 一组客户和一个服务器之间的资源缺乏395

31.9 避免阻塞的操作396

31.10 进程、连接和其他限制396

31.11 客户和服务器的循环397

31.12 用文档确认依赖性397

31.13 小结398

习题398

附录1 系统调用与套接字使用的库例程400

附录2 Linux文件和套接字描述符的操作422

参考文献425

热门推荐