第一章 引论 1
1.1 引言 1
1.1.1 文档的组织 1
1.1.2 网络选择与名字到地址映射 1
目录 1
2.2 背景 3
图2—1:OSI参考模型 3
图和表 3
2.1 引言 3
第二章 传输界面编程 3
2.3 本章文档的组织 4
图2—2:传输界面 5
2.4 传输界面概况 5
2.4.1.1 连接方式服务 6
2.4.1 服务方式 6
表2—1:传输界面的本地管理例程 7
图2—3:用者和供者间的通道 7
表2—2:用于建立传输连接的例程 8
图2—4:传输连接 8
表2—4:释放连接例程 9
2.4.1.2 非连接方式服务 9
表2—3:连接方式数据传输例程 9
图4—5:发送Internet域数据报 (1 10
表2—5:非连接方式数据传输例程 10
2.4.2 状态转换 10
2.5 连接方式服务介绍 10
2.5.1 本地管理 10
2.5.1.1 委托方 11
图4—6:TLI数据报代码 (1 12
2.5.1.2 服务方 13
2.5.2 建立连接 16
2.5.2.1 委托方 16
2.5.2.2 事件处理 17
2.5.2.3 服务方 18
图2—5:监听和应答传输端点 21
2.5.3 数据传送 21
2.5.3.2 服务方 22
2.5.3.1 委托方 22
2.5.4 释放连接 24
2.5.4.2 委托方 25
2.5.4.1 服务方 25
2.6 非连接方式服务介绍 26
2.6.1 本地管理 26
2.6.2 数据传送 28
2.6.3 数据报出错 29
2.7 读/写界面 31
2.7.2 read 32
2.7.1 write 32
2.7.3 close 33
2.8 高级课题 33
2.8.1 异步执行方式 33
2.8.2 高级编程示例 34
表2—6:描述传输界面状态转换的状态 40
2.9.2 发出的事件 40
2.9.1 传输界面状态 40
2.9 状态转换 40
表2—7:发出的事件 41
2.9.3 到来的事件 41
表2—8:到来的事件 42
2.9.5 状态表 42
2.9.4 传输用者动作 42
表2—10:非连接方式状态表 43
表2—9:公共的本地管理状态表 43
表2—11:连接方式状态表 44
2.10 协议无关性准则 44
2.11 若干示例 45
2.11.1 连接方式委托方 45
2.11.2 连接方式服务方 47
2.11.3 非连接方式事务服务方 50
2.11.4 读/写委托方 52
2.11.5 事件驱动服务方 54
2.12 词汇 59
3.2.1 Socket的类型 63
3.2 基础 63
3.1 背景 63
第三章 Socket界面 63
3.2.2 Socket的创建 64
3.2.3 联编本地名字 65
3.2.4 连接的建立 66
3.2.5 数据传送 68
3.2.6 关闭Socket 68
图3—1:激发一个Internet域的流连接 69
图3—2:接受一个Internet域的流连接 70
3.2.7 非连接Socket 71
图3—3:读取Internet域数据报 72
图3—4:发送Internet域数据报 73
3.2.8 输入/输出多路复用 74
图3—5:用select()检查挂起的连接 76
3.3 提供的例程 77
3.3.2 网络名字 78
3.3.1 宿主机名字 78
3.3.3 协议名字 79
3.3.4 服务名字 79
3.3.5 其它 80
表3—1:运行库例程 80
图3—6:远程注册委托方代码 81
3.4 委托方/服务方模型 82
3.4.1 服务方 82
图3—7:远程注册服务方代码 83
3.4.2 委托方 85
3.4.3 非连接服务方 86
图3—8:ruptime程序的输出 87
图3—9:rwho服务方 88
3.5 高级课题 89
3.5.1 不同波段数据 89
图3—10:接收不同波段数据时刷清终端I/O 91
3.5.2 非阻塞Socket 92
3.5.3 中断驱动的Socket I/O 92
图3—11:I/O请求异步通知的使用 93
3.5.4 信号和进程组 93
图3—12:SIGCHLD信号的使用 94
3.5.6 地址联编 95
3.5.5 选择具体的协议 95
3.5.7 广播并且确定网络配置 97
3.5.8 Socket任选项 101
3.5.9 inetd 101
4.1.1.1 建立Socket连接:委托方代码 103
4.1.1 连接方式 103
第四章 Socket迁移和Socket到TLI的转换 103
4.1 Socket迁移和Socket到TLI的转换 103
图4—1:面向流的应用程序的委托方 104
图4—2:TLI委托方代码 105
4.1.1.2 建立TLI连接:委托方代码 105
4.1.1.3 建立Socket连接:服务方代码 106
图4—3:Socket服务方代码 107
4.1.1.4 建立TLI连接:服务方代码 107
图4—4:TLI服务方代码 108
4.1.2 非连接方式 110
4.1.2.1 基于Socket的数据报 110
4.1.2.2 TLI数据报 111
4.1.3 同步和异步方式 113
4.1.5 Socket到TLI的转换 114
4.1.4 出错处理 114
表4—1:TLI/Socket等价项表 115
4.1.6 将Socket应用移至System V R4.0 V1.0 116
表4—2:Socket实现的不同之处 117
第五章 远程过程呼叫引论 121
5.1 引言 121
5.1.1 技术信息的组织 121
5.1.2 定义 121
5.2 RPC概述 122
图5—1:用远程过程呼叫的网络通信 123
5.2.1 RPC的版本和号 124
5.2.2 网络选择 124
5.2.3.1 地址登记 126
5.2.3 rpcbind设施 126
5.2.2.1 名字到地址的转换 126
5.2.3.2 rpcinfo命令 127
5.2.4 RPC的较低层次 128
图5—2:委托方侧RPC较低层次 128
5.2.5 外部数据表示 129
图5—3:服务方侧RPC较低层次 129
第六章 rpcgen编程指南 131
6.1 引言 131
6.1.1 rpcgen概述 131
6.1.2 技术信息的组织 131
6.2 rpcgen拓导 132
6.2.1 把本地过程转换成远程过程 132
6.2.2 用rpcgen生成XDR例程 138
6.2.3 使用预处理伪指令 143
6.3 通常的RPC编程技巧 144
6.3.1 网络类型(传输选择) 145
6.3.2 超时改变 145
6.3.3 委托方认证 145
6.3.4 rpcgen命令行定义语句 146
6.3.6 端口监控程序支持 147
6.3.5 服务方对广播呼叫的回答 147
6.3.7 派遣表 148
6.3.8 用rpcgen调试 150
6.4 RPC语言参考 150
6.4.1 定义 150
6.4.2 枚举 150
6.4.3 常量 151
6.4.4 类型定义 151
6.4.5 声明 151
6.4.7 联合 153
6.4.6 结构 153
6.4.8 程序 154
6.4.9 特殊情况 155
第七章 远程过程呼叫编程指南 157
7.1 引言 157
7.1.1 RPC软件包概述 157
7.1.2 技术信息的组织 159
7.2 RPC的简化界面 159
7.2.1 基于RPC库的网络服务 160
7.2.2 远程过程呼叫和登记 161
7.2.2.1 rpc-call()例程 161
7.2.2.2 rpc-reg()例程 162
7.2.2.3 传递任意的数据类型 163
7.3 RPC的较低层 167
7.3.1 顶层 167
7.3.1.1 顶层:委托方侧 167
7.3.1.2 顶层:服务方侧 169
7.3.2.1 中间层:委托方侧 171
7.3.2 中间层 171
7.3.2.2 中间层:服务方侧 172
7.3.3 专家层 173
7.3.3.1 专家层:委托方侧 174
7.3.3.2 专家层:服务方侧 176
7.3.4 底层 178
7.3.4.1 底层:委托方侧 179
7.3.4.2 底层:服务方侧 179
7.4 低层数据结构 180
7.5 使用原始RPC进行低层程序测试 181
7.6 RPC高级编程技巧 183
7.6.1 服务方侧的select() 184
7.6.2 广播RPC 185
7.6.3 批处理 186
7.6.3.1 批处理性能 189
7.6.4 认证 189
7.6.4.1 AUTH-NONE:委托方侧 189
7.6.4.2 AUTH-NONE:服务方侧 190
7.6.4.3 ANTH-SYS 认证 191
7.6.4.4 ANTH—DES认证 193
7.6.5 使用端口监控程序 196
7.6.5.2 使用监听程序 197
7.6.5.1 使用inetd 197
7.7.1 版本 198
7.7 复杂的例子 198
7.7.2 面向连接的传输 199
7.7.3 回叫过程 203
7.7.4 用XDR分配内存 207
第八章 外部数据表示标准:协议规格 209
8.1 XDR引言 209
8.1.1 基本块的大小 209
8.1.2 技术信息的组织 210
8.2 XDR数据类型声明 210
8.2.1 整数 210
8.2.1.1 描述 210
8.2.1.2 声明 210
8.2.1.3 编码 210
8.2.3.1 描述 211
8.2.2 无符号整数 211
8.2.2.1 描述 211
8.2.2.2 声明 211
8.2.2.3 编码 211
8.2.3 枚举 211
8.2.3.2 声明 211
8.2.3.3 编码 211
8.2.4 布尔量 211
8.2.4.1 描述 211
8.2.6.1 描述 212
8.2.6 浮点数 212
8.2.5.3 编码 212
8.2.5.2 明 212
8.2.5.1 描述 212
8.2.5 双整数和无符号双整数 212
8.2.4.3 编码 212
8.2.4.2 声明 212
8.2.6.2 明 213
8.2.6.3 编码 213
8.2.7 双精度浮点数 213
8.2.7.1 描述 213
8.2.7.2 声明 213
8.2.8.2 声明 214
8.2.8.3 编码 214
8.2.8.1 描述 214
8.2.8 定长不透明数据 214
8.2.7.3 编码 214
8.2.10.1 描述 215
8.2.9.3 编码 215
8.2.9.2 声明 215
8.2.9.1 描述 215
8.2.9 变长不透明数据 215
8.2.10 串 215
8.2.10.2 声明 216
8.2.10.3 编码 216
8.2.11 定长数组 216
8.2.11.1 描述 216
8.2.11.2 声明 216
8.2.11.3 编码 216
8.2.12.3 编码 217
8.2.12 变长数组 217
8.2.12.1 描述 217
8.2.12.2 声明 217
8.2.13 结构 217
8.2.13.1 描述 217
8.2.13.2 声明 217
8.2.13.3 编码 218
8.2.14 鉴别联合 218
8.2.14.1 描述 218
8.2.14.2 声明 218
8.2.14.3 编码 218
8.3.1 常量 219
8.2.15.1 描述 219
8.3.2 类型定义 219
8.2.15.2 声明 219
8.3 其它XDR声明 219
8.2.15.3 编码 219
8.2.15 空白 219
8.3.3 可选的数据 220
8.4 XDR语言规格 221
8.4.1 标记的转换 221
8.4.2 词法注释 222
8.4.3 语法信息 222
8.4.3.1 语法注释 224
8.5 XDR数据描述示例 224
8.6 参考文献 225
第九章 远程过程呼叫:协议规格 227
9.1 引言 227
9.1.1 术语 227
9.1.2 协议的一般属性 227
9.1.2.1 RPC模型 227
9.1.2.2 传输和语义 228
9.1.2.3 联编和会合的独立性 228
9.1.2.4 认证 228
9.1.3 技术信息的组织 229
9.2 RPC协议需求 229
9.2.1 程序和过程 229
9.2.2 认证 230
9.2.3 程序号的赋值 230
9.2.4 RPC协议的其它用途 231
9.2.4.1 批处理 231
9.2.4.2 广播RPC 231
9.3 RPC报文协议 232
9.4 认证协议 235
9.4.1 AUTH-NONE认证 235
9.4.2 AUTH-SYS认证 235
9.4.2.1 AUTH-SHORT验证字 236
9.4.3 AUTH-DES认证 236
9.4.3.1 命名 236
9.4.3.2 AUTH-DES认证验证字 237
9.4.3.3 别名和时钟同步 237
9.4.3.4 DES认证协议(用XDR语言) 238
9.4.3.5 Diffie—Hellman密码 239
9.5 记录标志标准 240
9.6.1 用RPC语言描述的一个服务示例 241
9.6 RPC语言 241
9.6.3 语法注释 242
9.6.2 RPC语言规格 242
9.7.1 rpcbind协议规格(用RPC语言) 243
9.7 rpcbind协议 243
9.7.2.6 RPCBPROC-CALLIT过程 245
9.7.2.4 RPCBPROC-GETADDR过程 245
9.7.2.3 RPCBPROC-UNSET过程 245
9.7.2.2 RPCBPROC-SET过程 245
9.7.2.1 RPCBPROC—NULL过程 245
9.7.2 rpcbind操作 245
9.7.2.5 RPCBPROC-DUMP过程 245
9.8 参考文献 246
9.7.2.9 RPCBPROC-TADDR2UADDR过程 246
9.7.2.8 RPCBPROC-UADDR2TADDR过程 246
9.7.2.7 RPCBPROC-GETTIME过程 246
第十章 远程过程呼叫管理 247
1O.1 引言 247
10.2 RPC管理文件 247
10.2.1 名字到地址映射 247
10.3 安全RPC概述 250
10.2.3 /etc/publickey文件 250
10.2.2 系统RC文件/etc/rc2.d/s75rpc 250
10.2.4 /etc/master.d/kernel文件 250
10.3.1 RPC域 251
1O.4 安全RPC管理 252
10.4.1 建立安全RPC域 252
10.4.2 主/etc/publickey文件 253
10.4.2.1 用newkey命令添加RPC用户 253
10.4.3 故障排除注释 254
10.4.2.2 网络口令和chkey命令 254
第十一章 黄页(YP)服务 255
11.1 引言 255
11.1.1 什么是YP 255
11.1.2 YP元素 255
11.1.3 YP环境 256
11.1.3.1 YP域 256
11.1.3.2 YP机器类型 256
11.1.3.3 YP映像 258
11.2.1 建立域 259
11.2 实现YP 259
1 1.2.2.1 publickey映像 260
11.2.2 准备映像 260
11.2.2.2 其它映像 262
11.2.3.1 默认的Makefile 263
11.2.3 构造映像 263
11.2.3.2 更改Makefile 264
11.2.4 设置主服务器 265
11.2.5 在主服务器上启动精灵进程 266
11.2.6 设置从服务器 267
11.2.8 装备YP客户机 269
11.2.7 启动从服务器精灵进程 269
11.3.1 更改已有的映像 270
11.3 管理YP映像 270
11.3.1.1 更改标准映像 270
11.3.1.2 创建与更改非标准映像 271
11.3.2.1 使用带ypxfr的crontab 273
11.3.2 传播YP映像 273
11.3.2.2 使用带ypxfr的shell脚本 273
11.3.2.3 直接调用ypxfr 274
11.3.2.4 记录ypxfr的活动 274
11.3.3 在Makefile中加入新的YP映像 275
11.4 在原始YP服务器集合中加入新的YP服务器 275
1.4.1 修改映像的主服务器 276
11.5 与YP有关的命令小结 278
11.6.1 调试YP客户机 279
11.6.1.1 在客户机上挂起命令 279
11.6 修复YP问题 279
11.6.1.2 不可用的YP 281
11.6.1.3 ypbind瘫痪 282
11.6.1.4 ypwhich显示不一致 283
11.6.2 调试YP服务器 283
11.6.2.1 服务器有YP映像的不同版本 283
11.6.2.2 ypserv瘫痪 284
11.7 关闭YP 285
12.1 网络选择 287
第十二章 网络选择与名字到地址映射 287
12.1.1网络选择怎样工作 287
12.1.2 netconfig文件 288
12.1.3 NETPATH环境变量 289
图12—1:netconfig结构 289
12.1.4 通过NETPATH访问netconfig的例程 290
图12—2:NETPATH环境变量的样板值 290
12.1.5 直接访问netconfig的例程 291
图12—3:使用setnetpath()、getnetpath()和endnetpath()的样板代码 291
图12—4:使用setnetconfig()、getnetconfig和endnetconfi()的样板代码 292
图12—5:使用getnetconfigent()和freenetconfigent()的样板代码 293
图12—6:代码例子:使用网络选择与名字到地址映射 293
12.1.6 代码实例 294
12.1.6.1 通过所有“可见的”netconfig项的循环 294
12.1.6.2 通过用户定义的netconfig项的循环 294
12.1.6.3 通过所有netconfig项的循环 295
12.1.6.4 规定单个传输供者 295
12.2 名字到地址映射 295
12.2.1 名字到地址映射库 296
12.2.2 使用名字到地址映射例程 298
12.2.2.1 netdir-getbyname 298
12.2.2.4 taddr2uaddr 299
12.2.2.2 netdir-getbyaddr 299
12.2.2.3 netdir-free 299
12.2.2.5 uaddr2taddr 299
12.2.2.6 netdir-eption 299
12.2.2.7 netdir-perror 300
12.2.2.8 netdi-Sperror 300
图12—7:代码例子:使用网络选择与名字到地址映射 301
附录A:手册页 303