第1章 TCP/IP网络通信原理 1
1.1 TCP/IP协议概述 1
1.1.1 TCP/IP参考模型 1
1.1.2 TCP/IP参考模型的通信原理 2
1.1.3 LINUX系统实现网络通信的基本原理 3
1.2 TCP/IP网络通信中的客户-服务器模型 9
1.2.1 客户-服务器模型 9
1.2.2 客户-服务器模型中的汇聚点问题及其解决方法 10
1.2.3 客户-服务器模型中服务器设计与实现的复杂性 10
1.2.4 服务器中的并发问题 11
1.2.5 服务器并发性的实现方法 11
1.2.6 服务器的分类 12
1.3 TCP/IP网络通信中的客户软件的设计流程 14
1.3.1 TCP客户算法 14
1.3.2 UDP客户算法 14
1.3.3 客户算法中服务器套接字端点地址的查找问题 14
1.3.4 客户算法中本地端点地址的选择问题 19
1.4 TCP/IP网络通信中的服务器软件的设计流程 20
1.4.1 主动套接字与被动套接字 20
1.4.2 TCP服务器算法 20
1.4.3 UDP服务器算法 20
1.4.4 服务器算法中熟知端口的绑定问题 21
1.5 本章小结 21
本章习题 21
第2章 套接字API 23
2.1 套接字API概述 23
2.2 套接字API中的主要系统函数 24
2.2.1 socket()函数 24
2.2.2 connect()函数 24
2.2.3 bind()函数 25
2.2.4 listen()函数 25
2.2.5 accept()函数 26
2.2.6 send()函数 26
2.2.7 recv()函数 27
2.2.8 sendto()函数 27
2.2.9 recvfrom()函数 28
2.2.10 close()函数 28
2.2.11 shutdown()函数 29
2.2.12 getpeername()函数 29
2.2.13 setsockopt()函数 30
2.2.14 getsockopt()函数 31
2.3 基于套接字API的C/S网络通信模型 32
2.3.1 基于UDP的C/S网络通信模型 32
2.3.2 基于TCP的C/S网络通信模型 34
2.4 本章小结 36
本章习题 36
第3章 循环服务器例程剖析 37
3.1 循环服务器进程结构 37
3.1.1 循环的UDP服务器进程结构 37
3.1.2 循环的TCP服务器进程结构 37
3.2 循环服务器软件设计流程 38
3.2.1 循环的UDP服务器软件设计流程 38
3.2.2 循环的TCP服务器软件设计流程 39
3.3 循环的无连接的TIME服务器例程 40
3.3.1 相关系统函数及其调用方法简介 40
3.3.2 服务器例程剖析 47
3.4 访问TIME服务的无连接的客户端例程 51
3.5 循环的面向连接的DAYTIME服务器例程 53
3.6 访问DAYTIME服务的面向连接的客户端例程 55
3.7 本章小结 56
本章习题 57
第4章 服务器中的并发机制 58
4.1 服务器中的并发概念 58
4.1.1 循环服务器与并发服务器 58
4.1.2 基于多进程或多线程的服务器并发概念 58
4.1.3 并发等级 59
4.2 基于多进程的服务器并发机制 60
4.2.1 创建一个新进程 60
4.2.2 终止一个进程 61
4.2.3 获得一个进程的进程标识 61
4.2.4 获得一个进程的父进程的进程标识 61
4.2.5 僵尸进程的清除 62
4.3 基于多线程的服务器并发机制 67
4.3.1 创建一个新线程 67
4.3.2 设置线程的运行属性 69
4.3.3 终止一个线程 74
4.3.4 获得一个线程的线程标识 75
4.3.5 多线程例程剖析 75
4.4 从线程/进程分配技术 76
4.4.1 从线程/进程预分配技术 76
4.4.2 延迟的从线程/进程分配技术 76
4.4.3 两种从线程/进程分配技术的结合 77
4.5 基于多进程与基于多线程的并发机制的性能比较 77
4.5.1 多进程与多线程的任务执行效率比较 77
4.5.2 多进程与多线程的创建与销毁效率比较 79
4.6 本章小结 82
本章习题 82
第5章 基于多进程并发的面向连接服务器例程剖析 83
5.1 基于多进程并发的面向连接服务器的进程结构 83
5.2 基于多进程并发的面向连接服务器软件的设计流程 84
5.2.1 不固定进程数的并发模型设计流程 84
5.2.2 固定进程数的并发模型设计流程 84
5.3 基于多进程并发的面向连接服务器例程 85
5.3.1 例程一 85
5.3.2 例程二 89
5.4 本章小结 95
本章习题 95
第6章 基于多线程并发的面向连接服务器例程剖析 96
6.1 线程之间的协调与同步 96
6.1.1 互斥锁 96
6.1.2 信号量 103
6.1.3 条件变量 112
6.2 基于多线程并发的面向连接服务器软件的设计流程 115
6.3 基于多线程并发的面向连接服务器例程 117
6.4 本章小结 120
本章习题 120
第7章 基于单线程并发的面向连接服务器例程剖析 121
7.1 单线程并发服务器的线程结构 121
7.2 单线程并发服务器程序设计流程 122
7.3 基于单线程并发的面向连接服务器例程 125
7.4 本章小结 130
本章习题 131
第8章 基于线程池并发的面向连接服务器例程剖析 132
8.1 线程池简介 132
8.1.1 线程池定义 132
8.1.2 线程池的基本工作原理 133
8.1.3 线程池的应用范围 134
8.1.4 使用线程池的风险 135
8.2 一个LINUX下线程池的C语言实现 135
8.3 基于线程池并发的面向连接服务器例程 140
8.4 本章小结 148
本章习题 148
第9章 基于Epoll的并发的面向连接服务器例程剖析 149
9.1 Epoll简介 149
9.2 Epoll的工作原理与调用方法 150
9.2.1 Epoll的基本接口函数 150
9.2.2 Epoll的事件模式 151
9.2.3 Epoll的工作原理 151
9.3 基于Epoll线程池的C语言例程 152
9.4 基于Epoll的并发的面向连接服务器例程 156
9.5 本章小结 160
本章习题 160
第10章 客户进程中的并发机制 161
10.1 实现并发客户的意义与进程结构 161
10.1.1 实现并发客户的意义 161
10.1.2 基于多线程/多进程的并发客户的进程结构 162
10.1.3 基于单线程的并发客户的进程结构 162
10.2 基于多线程的并发客户例程 163
10.3 基于单线程的并发客户例程 165
10.4 基于多进程的并发客户例程 167
10.5 本章小结 169
本章习题 169
第11章 客户-服务器系统中的死锁问题 170
11.1 死锁的定义 170
11.2 产生死锁的原因 170
11.2.1 竞争资源引起进程死锁 170
11.2.2 进程推进顺序不当引起死锁 171
11.3 产生死锁的必要条件 171
11.4 处理死锁的基本方法 172
11.5 存在死锁问题的多线程例程 173
11.6 本章小结 174
本章习题 175
第12章 GCC编译器简介 176
12.1 GCC编译器所支持的源程序格式 176
12.2 GCC编译选项解析 176
12.2.1 GCC编译选项分类 176
12.2.2 GCC编译过程解析 179
12.2.3 多个程序文件的编译 180
12.3 GCC编译器的安装 180
12.4 本章小结 182
本章习题 183
参考文献 184