第一部分 基本套接口概念
第一章 套接口简介
1.1 简要的历史回顾
1.2 理解套接口
1.2.1 定义套接口
1.2.2 使用套接口
1.2.3 引用套接口
1.3 套接口和管道
1.4 创建套接口
1.4.1 socketpair(2)使用范例
1.4.2 运行例程
1.5 用套接口实现I/O
1.6 关闭套接口
1.6.1 shutdown(2)函数
1.6.2 关闭向套接口的写入
1.6.3 处理复制套接口
1.6.4 关闭从套接口的读入
1.6.5 什么时候不能使用shutdown(2)
1.7 客户/服务器应用编程
第二章 域和地址族
2.1 无名套接口
2.2 域
2.3 生成套接口地址
2.4 生成本地地址
2.4.1 生成传统本地地址
2.4.2 生成抽象本地地址
2.5 生成Internet(IPv4)套接口地址
2.5.1 理解网络字节序
2.5.2 在大端/小端字节序之间实现转换
2.5.3 初始化一个通配的Internet地址
2.5.4 初始化一个特定的Internet地址
2.6 生成X.25地址
2.7 生成其他地址族
2.8 AF_UNSPEC地址族
第三章 地址转换函数
3.1 Internet IP地址
3.1.1 Internet地址分类
3.1.2 理解网络掩码
3.2 分配IP地址
3.2.1 私有IP地址
3.2.2 保留IP地址
3.3 操作IP地址
3.3.1 inet_addr(3)函数
3.3.2 inet_aton(3)函数
3.3.3 iner_ntoa(3)函数
3.3.4 inet_network(3)函数
3.3.5 inet_lnaof()函数
3.3.6 inet_netof(3)函数
3.3.7 inet_makeaddr(3)函数
第四章 套接口的类型与协议
4.1 指定套接口的域
4.1.1 PF_INET和AF_INET
4.1.2 使用PF_LOCAL和AF_LOCAL
4.2 使用socket(2)涵数
4.3 选择套接口类型
4.3.1 理解SOCK_STREAM套接口类型
4.3.2 理解SOCK_DGRAM套接口类型
4.3.3 理解SOCK_SEQPACKET套接口类型
4.4 选择协议
4.4.1 使用PF_LOCAL和SOCK_STREAM
4.4.2 使用PF_LOCAL和SOCK_DGRAM
4.4.3 使用PF_INET和SOCK_STREAM
4.4.4 使用PF_INET和SOCK_DGRAM
4.5 套接口Domain和Type参数的总结
4.6 Linux支持的其他协议
第五章 为套接口绑定地址
5.1 bind(2)函数的作用
5.2 使用bind(2)函数
5.3 获得套接口地址
5.3.1 编写函数sock_addr()
5.3.2 获得对等套接口地址
5.4 接口与定址
5.4.1 指定接口地址的图例
5.4.2 绑定一个特定的接口地址
5.4.3 绑定通配接口
第六章 面向非连接的协议
6.1 通信的方法
6.1.1 非连接通信的优点
6.1.2 非连接通信的缺点
6.2 实现数据报的输入和输出
6.2.1 sendto(2)函数介绍
6.2.2 recvfrom(2)函数介绍
6.3 编写UDP数据报服务器程序
6.4 编写UDP数据报客户程序
6.5 测试UDP数据报服务器/客户程序
6.5.1 在没有服务器的状态下进行测试
6.5.2 使用非缺省的IP地址进行测试
6.5.3 在客户程序中省略bind(2)调用
6.5.4 对通配地址的应答
第七章 面向连接的协议——客户端
7.1 通信方法的回顾
7.2 Internet服务
7.2.1 /etc/services文件
7.2.2 使用getservent(3)函数
7.2.3 使用setservent(3)函数
7.2.4 使用endservent(3)函数
7.2.5 通过名字和协议查询服务
7.2.6 通过端口和协议查询服务
7.3 /etc/protocols文件
7.3.1 使用setprotoent(3)函数
7.3.2 使用endprotoent(3)函数
7.3.3 通过名字查询协议
7.3.4 通过协议号查询协议
7.4 编写TCP/IP客户程序
7.4.1 connect(2)函数
7.4.2 为编写客户程序做准备
7.4.3 daytime客户程序
7.5 在SOCK_DGRAM套接口中使用connect(2)
第八章 面向连接的协议——服务器端
8.1 服务器的作用
8.2 listen(2)函数
8.2.1 监听队列
8.2.2 指定backlog的值
8.3 accept(2)函数
8.4 编写一个TCP/IP服务器程序
8.5 修改客户程序
第九章 主机名和网络名查询
9.1 理解名字的必要性
9.2 uname(2)函数
9.3 获取主机名和域名
9.3.1 gethostname(2)函数
9.3.2 getdomainname(2)函数
9.3.3 测试gethostname(2)函数和getdomainname(2)函数
9.4 解析远程地址
9.4.1 错误报告
9.4.2 报告h_errno错误
9.4.3 gethostbyname(3)函数
9.4.4 gethostbyname(3)函数应用示例
9.4.5 gethostbyaddr(3)函数
9.4.6 sethostent(3)函数
9.4.7 endhostent(3)函数
第二部分 高级套接口编程
第十章 套接口上的标准I/O
10.1 使用标准I/O流的必要性
10.2 连接套接口与流
10.3 关闭套接口流
10.4 分开使用读写流
10.4.1 复制套接口
10.4.2 关闭套接口上的读/写流
10.5 建立通信连接
10.5.1 只关闭写端
10.5.2 只关闭读端
10.5.3 同时关闭读写端
10.6 中断处理
10.7 定义缓冲操作
10.8 在套接口上使用FILE流
10.8.1 mkaddr()函数
10.8.2 RPN计算器引擎代码
10.8.3 测试RPN服务器程序
第十一章 并发客户服务程序
11.1 理解多客户问题
11.2 服务器函数概览
11.3 使用fork(2)函数实现多客户服务
11.3.1 理解全局服务进程
11.3.2 理解子服务进程流
11.3.3 理解进程的终止处理
11.4 使用select(2)函数设计服务器程序
11.4.1 select(2)函数简介
11.4.2 使用文件描述符集合
11.5 服务器程序设计中使用select(2)函数
11.5.1 使用select(2)函数的服务器程序
11.5.2 例程中的有关限制
第十二章 套接口选项
12.1 取套接口的选项值
12.2 设置套接口选项
12.3 取套接口类型(SO_TYPE)
12.4 设置SO_REUSEADDR选项
12.5 设置SO_LINGER选项
12.6 设置SO_KEEPALIVE选项
12.7 设置SO_BROADCAST选项
12.8 设置SO_OOBINLINE选项
12.9 选项SO_PASSCRED和SO_PEERCRED
第十三章 UDP广播
13.1 理解广播地址
13.1.1 在255.255.255.255上广播
13.1.2 增强mkaddr.c子程序的功能
13.2 服务器广播
13.3 接收广播
13.4 广播演示
13.5 面向网络的广播
13.5.1 启动广播
13.5.2 接收本地广播信息
13.5.3 接收远程广播信息
13.5.4 调试
第十四章 带外数据
14.1 带外数据概念
14.2 带外数据的必要性
14.3 套接口与带外数据
14.4 实现中的两种语义解释
14.5 使用带外数据
14.5.1 写带外数据
14.5.2 读带外数据
14.5.3 理解SIGURG信号
14.5.4 支撑子程序
14.5.5 使用SIGURG信号接收带外数据
14.5.6 发送带外数据
14.5.7 测试oobrecv和oobsend程序
14.6 紧急指针
14.6.1 TCP紧急模式
14.6.2 tcp_stdurg=1时的紧急模式
14.7 接收内嵌带外数据
14.7.1 确定紧急指针位置
14.7.2 使用内嵌带外数据
14.8 紧急指针的有关限制
第十五章 使用守护进程inetd
15.1 一般服务程序所遵循的通用模式
15.2 inetd简介
15.2.1 /etc/inetd.conf配置文件
15.2.2 inetd服务程序的设计参数
15.3 一个简单的TCP服务程序
15.3.1 通过inetd调用服务程序
15.3.2 禁止新增加的服务
15.4 数据报服务程序
第十六章 网络安全程序设计
16.1 什么是安全性
16.2 来自安全方面的挑战
16.3 区分合法用户与不合法用户
16.3.1 通过主机名或域名识别客户
16.3.2 通过IP地址识别客户
16.4 给inetd服务增加安全措施
16.4.1 集中式网络安全策略
16.4.2 理解TCP外包器概念
16.4.3 辨别客户的访问权限
16.5 安装外包器和服务程序
16.5.1 服务程序与外包器的日志代码
16.5.2 UDP服务程序代码
16.5.3 一个简单的TCP外包器程序
16.6 客户端程序
16.7 安装并测试外包器
16.7.1 监视日志文件
16.7.2 启动inetd守护进程
16.7.3 测试外包器程序
16.7.4 测试服务器超时
16.7.5 卸载示范程序
16.7.6 数据报的缺陷
第十七章 传递信任状和文件描述符
17.1 问题
17.2 辅助数据简介
17.3 I/O向量简介
17.3.1 I/O向量(struct iovec)
17.3.2 readv(2)函数和writev(2)函数
17.4 sendmsg(2)函数和recvmsg(2)函数
17.4.1 sendmsg(2)函数
17.4.2 recvmsg(2)函数
17.4.3 msghdr结构
17.5 辅助数据结构和宏
17.5.1 cmsghdr结构简介
17.5.2 cmsg(3)宏简介
17.5.3 创建辅助数据
17.6 辅助数据例程
17.6.1 通用头文件common.h
17.6.2 misc.c模块
17.6.3 recvcred.c模块
17.6.4 一个简单的Web服务器例程web80
17.6.5 reqport()函数
17.6.6 recv_fd()函数
17.6.7 服务器程序sockserv
17.6.8 send_fd()函数
17.7 测试套接口服务器
第十八章 一个实用的网络工程项目
18.1 问题
18.2 解决报价服务问题
18.3 测试报价服务器程序
18.4 通过get_tickinfo()获得报价单
18.5 通过broadcast()函数进行报价广播
18.6 分析客户端程序
18.7 编译并运行演示程序
18.7.1 启动报价服务器qserve
18.7.2 启动客户端程序mktwatch
18.7.3 如果finance.yahoo.com服务发生变化
附录A 套接口函数快速索引
A.1 特定的套接口函数
A.2 套接口定址函数
A.3 读套接口函数
A.4 写套接口函数
A.5 其他套接口I/O函数
A.6 套接口控制函数
A.7 网络支持函数
A.8 标准I/O支持函数
A.9 主机名支持函数
附录B 套接口相关的数据结构索引
B.1 套接口地址结构
B.2 其他数据结构
B.3 与I/O相关的数据结构
附录C 一些常用的表格
附录D 术语表
· · · · · · (
收起)