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

  • 购买积分:14 如何计算积分?
  • 作  者:(美)Douglas E.Comer,(美)David L.Stevens著;赵刚等译
  • 出 版 社:北京:电子工业出版社
  • 出版年份:2001
  • ISBN:7505365908
  • 页数:431 页
图书介绍:

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/O 25

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/IP 30

深入研究 31

习题 31

4.9 小结 31

第5章 套接字API 32

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和write 38

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使用connect 52

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 并发ECHO 100

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超级服务器,inetd 138

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 预分配、突发通信量和NFS 149

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寻址和SLIRP 181

深入研究 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和TCP 190

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

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:运行rpcgen 230

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 文件系统mount 260

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/O 289

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/DONT 321

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 对服务器编程以改变它的控制TTY 382

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

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

30.10 Linux umask 383

30.14 标准I/O描述符 384

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

30.11 对服务器编程以设置其umask 384

30.12 进程组 384

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

30.16 服务器互斥 385

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

30.18 记录服务器的进程ID 386

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

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 使用syslog 390

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