第一部分 网络基础 1
第1章 Unix系统基础 1
1.1 Unix系统概述 1
1.1.1 Unix系统的历史 1
1.1.2 Unix系统的特点 1
1.1.3 Unix系统的体系结构 1
1.1.4 Unix系统的地址空间 2
1.1.5 POSIX标准 2
1.2 常用Unix网络命令 2
1.2.1 ping 2
1.2.2 netstat 3
1.2.3 ifconfig 3
1.2.5 tcpdump 4
1.2.4 route 4
1.3 网络基本配置文件 5
1.4 软件开发环境 5
1.4.1 vi编辑器 5
1.4.2 gcc编译器 7
1.4.3 gdb调试器 7
1.5 简单实例 8
1.5.1 源程序分析 8
1.5.2 实现过程 10
1.6 小结 12
第2章 TCP/IP 13
2.1 TCP/IP体系 13
2.2 IP协议 14
2.2.1 IP包的结构 14
2.2.4 IP地址类型 15
2.2.3 IP地址表示 15
2.2.2 IP地址组成 15
2.2.5 子网掩码 16
2.3 TCP协议 16
2.3.1 建立TCP连接 16
2.3.2 关闭TCP连接 16
2.3.3 TCP数据包结构 17
2.4 UDP协议 17
2.5 ICMP协议 18
2.6 端口号分配 19
2.6.1 端口分类 19
2.6.2 常用端口号 19
2.7.1 路由表分类 20
2.7.2 IP路由过程 20
2.7 IP路由 20
2.8 小结 21
第二部分 套接字 22
第3章 套接字基础 22
3.1 套接字概述 22
3.2 套接字类型 23
3.3 套接字地址结构 23
3.3.1 INET协议簇地址结构sockaddr_in 23
3.3.2 存储地址和端口信息的sockaddr 24
3.3.3 32位IPv4地址结构in_addr 24
3.4 端口 25
3.5 带外数据 26
3.6 连接类型 26
3.7 小结 27
4.1.1 TCP套接字实现过程 28
4.1 基本方法 28
第4章 TCP套接字 28
4.1.2 TCP服务器模板 29
4.1.3 TCP客户模板 30
4.2 实现TCP套接字 31
4.2.1 产生TCP套接字 31
4.2.2 绑定 32
4.2.3 监听 34
4.2.4 接受请求 35
4.2.5 连接建立 36
4.2.6 数据传输 38
4.2.7 终止连接 39
4.3 TCP套接字编程实例 40
4.3.1 实例说明 40
4.3.2 TCP服务器 40
4.3.3 TCP客户 42
4.3.4 运行程序 44
4.4 小结 45
第5章 UDP套接字 46
5.1 基本方法 46
5.1.1 UDP套接字实现过程 46
5.1.2 UDP服务器模板 47
5.1.3 UDP客户模板 48
5.2 函数说明 49
5.2.1 UDP套接字的数据发送——sendto()函数 49
5.2.2 UDP套接字的数据接收——recvfrom()函数 49
5.3 UDP套接字编程实例 51
5.3.1 UDP服务器 51
5.3.2 UDP客户 53
5.4 小结 55
5.3.3 运行程序 55
第三部分 Unix网络编程实用技术 57
第6章 并发服务器 57
6.1 并发服务器基础 57
6.1.1 服务器分类 57
6.1.2 重复性服务器实例 58
6.1.3 并发技术 64
6.1.4 并发服务器算法 64
6.2 多进程服务器 68
6.2.1 进程概念 68
6.2.2 创建进程 68
6.2.3 终止进程 70
6.2.4 多进程并发服务器 73
6.2.5 多进程并发服务器实例 77
6.3 多线程服务器 83
6.3.1 线程基础 84
6.3.2 线程函数调用(POSIX) 84
6.3.3 多线程并发服务器 87
6.3.4 给新线程传递参数 88
6.3.5 多线程并发服务器实例 92
6.3.6 线程安全(MT-safe)实例 96
6.4 I/O多路复用服务器 112
6.4.1 I/O模式 113
6.4.2 select()函数 114
6.4.3 单线程并发服务器实例 116
6.5 套接字终止处理 123
6.6 小结 124
7.2.1 地址结构 126
7.2 套接字地址 126
7.1 名字解析 126
第7章 名字和IP地址转换 126
7.2.2 字节顺序 127
7.2.3 IP地址转换函数 128
7.2.4 套接字地址信息函数 129
7.3 套接字信息函数 130
7.3.1 主机名转换为IP地址:gethostbyname()函数 130
7.3.2 IP地址转换为主机名:gethostbyaddr()函数 132
7.3.3 获得服务的端口号:getservbyname()函数 134
7.3.4 端口号转换为服务名:getservbyport()函数 135
7.4 小结 135
8.1.2 斥锁基础 136
8.1.1 线程同步基础 136
8.1 线程同步 136
第8章 同步及进程间通信 136
8.1.3 加锁和解锁互斥锁 138
8.1.4 条件变量 142
8.1.5 同步线程退出 151
8.1.6 死锁 158
8.2 进程同步 165
8.2.1 进程关系 165
8.2.2 信号处理 167
8.2.3 处理僵死进程 171
8.3 进程间通信 175
8.3.1 管道 176
8.3.2 FIFO 176
8.3.3 消息队列 180
8.3.4 共享内存 180
8.3.5 信号量 181
8.4 小结 182
第9章 异常处理 183
9.1 异常处理基础 183
9.2 函数调用的错误处理 183
9.2.1 显示错误信息 184
9.2.2 定义错误处理函数 187
9.3 I/O超时处理 188
9.3.1 使用alarm()函数 188
9.3.2 使用select函数 189
9.4 服务器异常处理 190
9.4.1 异常处理的系统调用 190
9.4.2 服务器异常处理实例 191
9.5 客户异常处理 196
9.6 小结 196
10.1.2 建立库文件索引 197
10.1.3 连接库文件 197
第10章 创建实用套接字类库 197
10.1.1 创建库文件 197
10.1 创建静态链接库 197
10.2 创建动态链接库 198
10.2.1 创建库文件 198
10.2.2 使用动态链接库 198
10.2.3 相互引用的库文件 199
10.2.4 动态库与静态库并存 199
10.3 创建自定义的套接字类库 199
10.3.1 设计套接字类库 199
10.3.2 套接字系统调用:MySocket类 201
10.3.3 多线程实现:MyThread类 202
10.3.4 加锁/解锁:MyMutex类和MyCondition类 205
10.3.5 基于TCP的多线程并发服务器:TcpServThr类 209
10.3.6 TCP多线程客户类:TcpCliThr类 214
10.4 实例分析 218
10.4.1 实现聊天室服务器 218
10.4.2 实现聊天室客户 225
10.4.3 运行程序 227
10.5 小结 230
第四部分 高级网络编程技术 231
第11章 守护进程 231
11.1 输出守护进程消息 231
11.1.1 syslogd进程 231
11.1.2 syslog()函数 232
11.2.1 守护进程的创建过程 234
11.2.2 创建守护进程的代码 234
11.2 创建守护进程 234
11.1.3 closelog()函数 234
11.3 配置守护进程 235
11.4 守护进程实例 236
11.5 小结 241
第12章 原始套接字 243
12.1 产生原始套接字 243
12.2 写原始套接字 244
12.3 读原始套接字 244
12.4 原始套接字实例 245
12.5 小结 253
13.1.2 DLPI 254
13.1.1 BSD包过滤器 254
13.1.3 SOCK_PACKET 254
第13章 数据链路访问 254
13.1 数据链路访问方法 254
13.1.4 libpcap 255
13.2 libpcap应用 255
13.2.1 libpcap库函数 255
13.2.2 libpcap数据结构 258
13.2.3 过滤程序 258
13.3 数据链路访问实例 259
13.4 小结 264
第14章 多接口设计 265
14.1 单个服务器绑定到多个接口 265
14.2 多个服务器绑定到多个接口 269
14.3 小结 274
15.1 创建路由套接字 275
15.2 读写路由套接字 275
第15章 路由套接字 275
15.3 读取路由信息 277
15.4 路由套接字实例 279
15.5 小结 282
第16章 简单路由器实例分析 283
16.1 设计专用路由器 283
16.2 实现专用路由器 286
16.2.1 捕获数据包:myCap类和myCapIP类 286
16.2.2 查询系统路由:myRoute类 293
16.2.3 发送IP包:myRaw类 297
16.2.4 封装串口通信:SerialComm类 300
16.2.5 处理专用数据传输网络协议:myDevice类 300
16.2.6 同时发送和接收:sendThr、recvThr和myRouter类 302
16.3 小结 310
附录A 套接字Wrapper类源程序 311
附录B 串口通信类源程序 337