第一篇 TLI和Socket编程 1
第一章 TLI和Socket编程引论 1
1·1 本文档的组织 1
1·2 网络选择和名字到地址的映射 1
目录 1
2·2 背景 3
图2-1:OSI参考模型 3
图和表 3
2·1 引言 3
第二章 传输界面编程 3
2·3 本章文档的组织 4
2·4 传输界面概述 5
图2-2:传输界面 5
2·4·1·1 连接方式服务 6
2·4·1 服务方式 6
表2-1:“传输界面”的本地管理例程 7
图2-3:用者和供者间的通道 7
图2-4:传输连接 8
表2-3:连接方式数据传输例程 9
表2-2:用于建立传输连接的例程 9
表2-5:非连接方式数据传送例程 10
表2-4:连接释放例程 10
2·4·1·2 非连接方式服务 10
2·4·2 状态转换 10
2·5 连接方式服务介绍 11
2·5·1 本地管理 11
2·5·1·1 委托方 12
2·5·1·2 服务方 13
2·5·2 建立连接 16
2·5·2·1 委托方 17
2·5·2·3 服务方 18
2·5·2·2 事件处理 18
图2-5:监听和回答传输端点 21
2·5·3·1 委托方 22
2·5·3 数据传送 22
2·5·3·2 服务方 23
2·5·4 释放连接 25
2·5·4·1 服务方 26
2·5·4·2 委托方 26
2·6·1 本地管理 27
2·6 非连接方式服务介绍 27
2·6·2 数据传送 29
2·6·3 数据报出错 31
2·7 读/写界面 32
2·7·2 read 33
2·7·1 write 33
2·8·1 异步执行方式 34
2·8 高级专题 34
2·7·3 close 34
2·8·2 高级编程示例 35
表2-6:描述传输界面状态转换的状态 41
2·9·2 发出事件 41
2·9·1 传输界面状态 41
2·9 状态转换 41
表2-7:发出事件 42
2·9·3 发来事件 42
表2-8:发来事件 43
2·9·5 状态表 43
2·9·4 传输用户动作 43
表2-9:公共的本地管理状态表 44
表2-10:非连接方式状态表 44
表2-11:连接方式状态表 45
2·10 协议无关性准则 45
2·11 示例 46
2·11·1 连接方式委托方 46
2·11·2 连接方式服务方 48
2·11·3 非连接方式事务服务方 51
2·11·4 读/写委托方 53
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-9:rwho服务程序 87
图3-8:ruptime程序的输出 87
3·5·1 不同波段数据 89
3·5 高级专题 89
图3-10:当接受不同波段数据时刷清终端I/O 90
3·5·2 非阻塞Socket 91
图3-11:I/O请求异步通知的使用 92
3·5·3 中断驱动的Socket I/O 92
3·5·4 信号与进程组 92
图3-12:SIGCHLD信号的使用 93
3·5·6 地址联编 94
3·5·5 选择具体协议 94
3·5·7 广播和确定网络配置 96
3·5·8 Socket选项 99
3·5·9 inetd 100
第四章 Socket迁移和Socket到TLI的转换 103
4·1 Socket迁移和Socket到TLI的转换 103
4·1·1 连接方式 103
4·1·1·1 建立Socket连接:委托方代码 103
图4-1:面向流的应用程序的委托方侧 104
图4-2:TLI委托方代码 105
4·1·1·2 建立TLI连接:委托方代码 105
4·1·1·3 建立Socket连接:服务方代码 106
4·1·1·4 建立TLI连接:服务方代码 107
图4-3:Socket服务方代码 107
图4-4:TLI服务方代码 108
4·1·2·1 基于Socket的数据报 110
4·1·2 非连接方式 110
图4-5:发送Internet域数据报 110
4·1·2·2 TLI数据报 111
图4-6:TLI数据报代码 112
4·1·3 同步和异步方式 113
4·1·4 出错处理 114
表4-1:TLI/Socket对等项表 115
4·1·5 Socket到TLI的转换 115
4·1·6 将Socket应用移入System V R4 116
表4-2:Sock实现的不同之处 117
5·1 RPC引言 121
5·1·2 定义 121
5·1·1 技术信息的组织 121
第二篇 远程过程呼叫 121
第五章 远程过程呼叫引论 121
5·2 RPC概述 122
图5-1:用远程过程呼叫的网络通信 123
5·2·1 RPC的版本和号码 124
5·2·2 网络选择 124
5·2·2·1 名字到地址的转换 126
5·2·3 rpcbind设施 127
5·2·3·1 地址登记 127
5·2·3·2 rpcinfo命令 128
5·2·4 RPC的较低层次 128
图5-2:委托方侧的RPC较低层次 129
图5-3:服务方侧的RPC较低层次 130
5·2·5 外部数据表示 130
6·1·2 技术信息的组织 131
6·1·1 rpcgen概述 131
6·1 引言 131
第六章 rpcgen编程指南 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 网络类型(传输选择) 144
6·3·2 改变延时 145
6·3·3 委托方认证 145
6·3·4 rpcgen命令行定义语句 146
6·3·5 服务方对广播呼叫的应答 147
6·3·6 端口监控程序支持 147
6·3·7 分派表 148
6·3·8 用rpcgen调试 149
6·4 RPC语言参考 150
6·4·1 定义 150
6·4·2 枚举 150
6·4·5 说明 151
6·4·3 常量 151
6·4·4 类型定义 151
6·4·6 结构 152
6·4·7 联合 153
6·4·8 程序 154
6·4·9 特殊情况 155
7·1 引言 157
7·1·1 RPC软件包概述 157
第七章 远程过程呼叫编程指南 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 中间层 171
7·3·2·1 中间层:委托方侧 171
7·3·2·2 中间层:服务方侧 172
7·3·3 专家层 173
7·3·3·1 专家层:委托方侧 173
7·3·3·2 专家层:服务方侧 176
7·3·4 底层 178
7·3·4·1 底层:委托方侧 178
7·3·4·2 底层:服务方侧 178
7·4 低层数据结构 179
7·5 使用原始RPC进行低层程序测试 181
7·6 高级RPC编程技巧 183
7·6·1 服务方侧的select() 183
7·6·2 广播RPC 184
7·6·3 批处理 185
7·6·3·1 批处理性能 188
7·6·4 认证 189
7·6·4·1 AUTH_NONE:委托方侧 189
7·6·4·2 AUTH_NONE:服务方侧 189
7·6·4·3 ANTH_SYS认证 190
7·6·4·4 ANTH_DES认证 193
7·6·5 使用端口监控程序 195
7·6·5·1 使用inetd 196
7·6·5·2 使用listener 196
7·7 高级例子 197
7·7·1 版本 198
7·7·2 面向连接的传输 199
7·7·3 回调过程 202
7·7·4 用XDR分配内存 206
第八章 外部数据表示标准:协议规格 209
8·1 XDR引言 209
8·1·1 基本的块大小 209
8·2·1·3 编码 210
8·1·2 技术信息的组织 210
8·2 XDR数据类型声明 210
8·2·1 整数 210
8·2·1·1 描述 210
8·2·1·2 声明 210
8·2·3·1 描述 211
8·2·4·1 描述 211
8·2·4 布尔量 211
8·2·3·3 编码 211
8·2·3·2 声明 211
8·2·2 无符号整数 211
8·2·3 枚举 211
8·2·2·3 编码 211
8·2·2·2 声明 211
8·2·2·1 描述 211
8·2·5·1 描述 212
8·2·4·2 声明 212
8·2·4·3 编码 212
8·2·5·2 声明 212
8·2·5·3 编码 212
8·2·6 浮点数 212
8·2·6·1 描述 212
8·2·5 双整数和无符号双整数 212
8·2·6·3 编码 213
8·2·6·2 声明 213
8·2·7 双精度浮点数 213
8·2·7·1 描述 213
8·2·7·2 声明 213
8·2·7·3 编码 213
8·2·8 定长不透明数据 214
8·2·8·1 描述 214
8·2·8·2 声明 214
8·2·8·3 编码 214
8·2·9 可变长不透明数据 214
8·2·9·1 描述 214
8·2·10 串 215
8·2·10·1 描述 215
8·2·10·2 声明 215
8·2·9·3 编码 215
8·2·9·2 声明 215
8·2·10·3 编码 216
8·2·12 可变长数组 216
8·2·11 定长数组 216
8·2·11·1 描述 216
8·2·11·2 声明 216
8·2·11·3 编码 216
8·2·12·1 描述 216
8·2·13·3 编码 217
8·2·13·2 声明 217
8·2·13·1 描述 217
8·2·13 结构 217
8·2·12·3 编码 217
8·2·12·2 声明 217
8·2·14 加以鉴别的联合 218
8·2·14·1 描述 218
8·2·14·2 声明 218
8·2·14·3 编码 218
8·2·15 空 218
8·2·15·1 描述 218
8·2·15·2 声明 219
8·3·2 typedef 219
8·3·1 常量 219
8·3 其它XDR声明 219
8·2·15·3 编码 219
8·3·3 可选的数据 220
8·4·2 词法注释 221
8·4·1 记号约定 221
8·4 XDR语言规格 221
8·4·3 语法信息 222
8·5 XDR数据描述的例子 224
8·4·3·1 语法注释 224
8·6 参考文献 225
9·1 引言 227
9·1·1 术语 227
9·1·2 协议的一般属性 227
9·1·2·1 RPC模式 227
第九章 远程过程呼叫:协议规格 227
9·1·2·3 联编和约定独立性 228
9·1·2·2 传输和语义 228
9·1·2·4 认证 228
9·2·1 程序和过程 229
9·1·3 技术信息的组织 229
9·2 RPC协议需求 229
9·2·3 程序号赋值 230
9·2·2 认证 230
9·2·4 RPC协议的其它用途 231
9·2·4·1 成批处理 231
9·3 RPC消息协议 232
9·2·4·2 广播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 Dime-Hellman密码 239
9·5 记录标记标准 240
9·6 RPC语言 241
9·6·1 用RPC语言描述的一个服务实例 241
9·6·2 RPC语言规格 242
9·6·3 语法注释 242
9·7 rpcbind协议 243
9·7·1 rpcbind协议规格(用RPC语言) 243
9·7·2 rpcbind操作 244
9·7·2·1 RPCBPROC_NULL过程 244
9·7·2·6 RPCBPROC_CALLIT过程 245
9·7·2·2 RPCBPROC_SET过程 245
9·7·2·3 RPCBPROC_UNSET过程 245
9·7·2·4 RPCBPROC_GETADDR过程 245
9·7·2·5 RPCBPROC_DUMP过程 245
9·7·2·8 RPCBPROC_UADDR2TADDR过程 246
9·7·2·7 RPCBPROC_GETTIME过程 246
9·7·2·9 RPCBPROC_TADDR2UADDR过程 246
9·8 参考文献 246
第十章 RPC管理 247
10·1 引言 247
10·2 RPC管理文件 247
10·2·1 名字到地址映射 247
10·2·2 系统RC文件/etc/rc2·d/s75rpc 247
10·2·3 /etc/publickey文件 250
10·2·4 /etc/master·d/kernel文件 250
10·3 安全RPC概述 250
10·3·1 RPC域 251
10·4·1 建立安全RPC域 252
10·4 安全RPC管理 252
10·4·2·1 用newkey命令添加RPC用户 253
10·4·2 主/etc/publickey文件 253
10·4·3 故障查寻注释 254
10·4·2·2 网络口令和chkey命令 254
11·1 YP服务引言 255
11·1·1 什么是YP 255
11·1·2 YP元素 255
第十一章 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 实现YP服务 259
11·2·1 建立域 259
11·2·2 准备映射 260
11·2·2·1 publickey映射 260
11·2·2·2 其它映射 262
11·2·3 构造映射 263
11·2·3·1 默认的makefile 263
11·2·3·2 更改makefile 264
11·2·4 设置主服务方 265
11·2·5 启动主服务方上的精灵进程 266
11·2·6 设置从服务方 267
11·2·7 启动从服务方上的精灵进程 269
11·2·8 装备YP委托方 269
11·3·1·1 更改标准映射 270
11·3 管理YP映射 270
11·3·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脚本 274
11·3·2·3 直接调用ypxfr 275
11·3·2·4 记录ypxfr的活动 275
11·3·3 在makefile中加入新的YP映射 275
11·4 在原先集合中加入新的YP服务方 276
11·4·1 改变映射的主服务方 277
11·5 与YP相关的命令小结 278
11·6·1 调试YP委托方 279
11·6·1·1 在委托方上挂起命令 279
11·6 排除YP问题 279
11·6·1·2 YP服务不可用 282
11·6·1·3 ypbind瘫痪 282
11·6·1·4 ypwhich显示不一致 283
11·6·2 调试YP服务方 283
11·6·2·1 服务方有不同的YP映射版本 284
11·6·2·2 ypserv瘫痪 284
11·7 关闭YP服务 286
第三篇 网络选择和名字到地址映射 287
12·1·1 网络选择怎样工作 287
12·1 网络选择 287
第十二章 网络选择和名字到地址映射 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-3:使用setnetpath()、getnetpath()和endnetpath()的样本代码 291
12·1·5 直接访问netconfig例程 291
图12-4:使用setnetconfig()、getnetconfig()和endnetconfig()的样本代码 292
图12-5:使用getnetconfigent()和freenetconfigent()的样本代码 293
图12-6:使用getnetconfigent()和freenetconfigent()的样本代码 293
12·1·6 代码实例 293
12·1·6·3 循环通过所有的netconfig项 294
12·1·6·1 循环通过所有“可见的”netconfig项 294
12·1·6·2 循环通过用户定义的netconfig项 294
12·1·6·4 规定单个传输供者 295
12·2 名字到地址映射 295
12·2·1 名字到地址映射的库 296
12·2·2 使用名字到地址映射例程 297
12·2·2·1 netdir_getbyname 298
12·2·2·2 netdir_getbyaddr 298
12·2·2·3 netdir_free 298
12·2·2·4 taddr2uaddr 299
12·2·2·5 uaddr2taddr 299
12·2·2·6 netdir_options 299
12·2·2·7 netdir_perror 300
12·2·2·8 netdir_sperror 300
图12-7:代码例子:使用网络选择和名字到地址映射 301
13·2 服务访问设施概述 303
第四篇 为服务访问设施编写端口监控程序 303
第十三章 为服务访问设施编写端口监控程序 303
13·1 引言 303
13·2·1 服务访问控制程序 304
13·3 基本的端口监控程序功能 304
13·3·1 端口管理 305
13·3·2 活动监视 305
13·3·3 其它的端口监控功能 305
13·3·3·1 限制对系统的访问:启用和禁用端口监控程序和端口 305
13·3·3·2 创建utmp登记项 306
13·3·3·3 端口监控程序进程ID和锁定文件 306
13·3·3·4 修改服务环境:运行doconfig() 306
13·3·3·5 文件:端口监控程序管理文件 306
13·3·3·6 文件:每种服务配置文件 306
13·3·3·7 私用端口监控程序文件 306
13·4·1 消息格式 307
13·4 服务访问控制程序/端口监控程序界面 307
13·4·1·1 sac消息 307
13·3·3·8 终止端口监控程序 307
13·4·1·2 端口监控程序消息 308
13·5 端口监控程序管理界面 309
13·5·1 SAC管理文件_sactab 309
13·4·2 消息类 309
13·5·2 端口监控程序管理文件_pimtab 310
13·5·3 SAC管理命令sacadm 311
13·5·6 端口监控程序/服务界面 312
13·5·5 端口监控程序的“针对具体端口监控程序的”管理命令 312
13·5·4 端口监控程序管理命令pmadm 312
13·6 端口监控程序需求 313
13·5·6·2 常设的服务引用 313
13·5·6·1 新的服务引用 313
13·6·1 初始环境 313
13·6·2 重要的文件 313
13·6·3·2 与任务相关的服务 314
13·6·3·1 各种杂项任务 314
13·7 配置文件和配置语言 314
13·7·1 配置文件 314
13·7·1·1 每个系统配置文件 314
13·6·3 责任 314
13·7·1·2 每个端口监控程序配置文件 315
13·7·1·3 每种服务配置文件 315
13·7·2 配置语言 315
13·7·3 显示、安装和替换配置脚本 316
13·7·3·2 每个端口监控程序配置脚本 316
13·7·3·1 每个系统配置脚本 316
13·7·3·3 每种服务配置脚本 317
13·7·4 解释配置脚本:doconfig() 317
13·7·5 样本配置脚本 318
13·7·5·3 每种服务样本配置脚本 318
13·7·5·2 每个端口监控程序样本配置脚本 318
13·7·5·1 每个系统样本配置脚本 318
13·8 端口监控程序代码样本 319
13·9 前导文件sac·h 322
13·10 服务访问设施逻辑图和目录结构 324
图13-1:服务访问设施逻辑图 325
图13-2:服务访问设施目录结构 326
附录A 手册页 327