第1篇 基础知识篇 3
第1章 Linux操作系统概述 3
1.1 Linux操作系统简介 4
1.1.1 Linux的来源 4
1.1.2 Linux的特征 5
1.2 常用的Linux命令 6
1.2.1 操作目录和处理文件 6
1.2.2 正文编辑命令vi 9
1.2.3 进程处理 11
1.2.4 安全与权限设置 12
1.2.5 基本的网络命令 14
1.2.6 联机帮助 16
1.3 文件系统 17
1.3.1 Linux文件系统概述 18
1.3.2 Linux文件系统的组成 18
1.3.3 文件系统管理 20
1.3.4 虚拟文件系统VFS 22
1.3.5 文件系统的相关调用 25
1.3.6 安装和卸载文件系统 27
1.4 Linux系统的安全性 29
1.4.1 安装和启动安全 29
1.4.2 用户账号与口令 30
1.4.3 文件与系统备份 31
1.4.4 网络服务的安全 32
1.5 小结与练习 33
1.5.1 小结 33
1.5.2 习题与思考 33
第2章 TCP/IP协议 35
2.1 网络传输分层 36
2.1.1 OSI参考模型 36
2.1.2 TCP/IP协议簇 37
2.2 IP协议 39
2.2.1 IP报文格式 40
2.2.2 IP地址 42
2.2.3 子网与网络掩码 44
2.2.4 IP路由 45
2.2.5 IP层的其他控制协议 46
2.3 差错和控制报文协议ICMP 47
2.4 TCP协议 49
2.4.1 TCP传输原理 49
2.4.2 传输层端口 50
2.4.3 TCP格式 50
2.4.4 建立一个TCP连接 53
2.4.5 TCP序列号预测 53
2.5 UDP协议 54
2.5.1 UDP协议简介 54
2.5.2 何时使用UDP协议 55
2.6 小结与练习 56
2.6.1 小结 56
2.6.2 习题与思考 56
第3章 网络编程基础 57
3.1 客户端与服务器通信模型 58
3.2 套接字编程基础 59
3.2.1 套接字简介 59
3.2.2 套接字网络编程原理 60
3.2.3 基本套接字函数 62
3.3 完整的读写函数 72
3.4 数据的传递 76
3.4.1 传递整形数据示例 76
3.4.2 传递字符串数据示例 81
3.4.3 数据传递的格式问题 85
3.5 小结与练习 85
3.5.1 小结 85
3.5.2 习题与思考 86
第4章 进程控制 87
4.1 进程的概念 88
4.1.1 程序与进程 88
4.1.3 进程的标志 89
4.1.2 进程控制块PCB 89
4.1.4 多进程程序的特点 92
4.2 用fork创建进程 93
4.2.1 Linux系统描述进程的数据结构 93
4.2.2 fork调用完成的操作 94
4.2.3 子进程与父进程 95
4.2.4 一个fork调用的简单实例 96
4.2.5 fork调用对文件的共享存取 97
4.3 和进程相关的系统调用 101
4.3.1 Linux系统调用简介 101
4.3.2 exec系统调用 101
4.3.3 system函数调用 104
4.3.4 wait函数调用 104
4.3.5 waitpid函数调用 105
4.3.6 setpgrp函数调用 107
4.3.7 signal函数调用 107
4.3.8 kill函数调用 109
4.3.9 alarm系统调用 110
4.3.10 exit函数调用 111
4.4 守护进程 112
4.5 多进程编程的技巧 114
4.5.1 程序结构问题 114
4.5.2 选择主体分叉点 114
4.5.3 进程间关系处理 114
4.5.4 进程间通信问题 115
4.6 小结与练习 115
4.6.1 小结 115
4.6.2 习题与思考 115
第5章 域名系统与套接字选项 117
5.1 域名系统简介 118
5.1.1 域名 119
5.1.2 名称服务器 120
5.1.3 DNS客户/服务器机制 120
5.2.1 通过域名获得IP地址 121
5.2 域名和IP地址的获取 121
5.2.2 通过IP地址获取域名信息 123
5.2.3 获取本地主机的域名地址 125
5.2.4 获取套接字本地名和相连的端地址 126
5.2.5 internet地址操作的函数调用 129
5.3 端口号和服务名的获取 130
5.3.1 通过服务名获取端口号 130
5.3.2 通过端口号获取服务名 131
5.4 其他网络相关信息的获取 132
5.4.1 getprotoent函数调用 132
5.4.2 getservent函数调用 134
5.5 套接字选项 136
5.4.1 函数getsockopt和setsockopt 136
5.4.2 通用套接字选项 137
5.4.3 函数fcntl和ioctl 141
5.5.1 小结 142
5.5 小结与练习 142
5.5.2 习题与思考 143
第6章 UDP数据报编程 145
6.1 UDP数据报编程概述 146
6.2 recvfrom和sendto函数 147
6.3 UDP服务器的工作特点 149
6.4 UDP客户机的工作特点 152
6.5.1 UDP套接字如何建立连接 156
6.5 UDP套接字的连接 156
6.5.2 数据报发送后情况 158
6.5.3 连接的重设与取消 158
6.6 UDP应用程序示例 159
6.6.1 发送和接收指定的数据报实例 159
6.6.2 OICQ的实现原理 163
6.7 UDP编程的一些常见问题 166
6.7.1 UDP与TCP的比较 166
6.7.2 UDP缺乏流量控制 166
6.8 小结与练习 167
6.8.1 小结 167
6.7.4 数据的排序问题 167
6.7.3 数据报的丢失问题 167
6.8.2 习题与思考 168
第2篇 应用提高篇 171
第7章 进程间通信与同步 171
7.1 信号处理 172
7.1.1 信号的概念 172
7.1.2 Linux系统支持的信号集 172
7.1.3 信号的捕获与处理 174
7.1.4 信号掩码 176
7.1.5 sigaction系统调用 177
7.1.6 pause系统调用 179
7.2 管道 179
7.2.1 管道的概念 179
7.2.2 创建管道 180
7.2.3 其他相关的系统调用 181
7.3.1 消息队列的数据结构 183
7.3 消息队列 183
7.3.2 有关的系统调用 184
7.4 共享内存 188
7.4.1 共享内存的创建 189
7.4.2 有关的系统调用 191
7.5 信号量 194
7.5.1 信号量的基本概念 194
7.5.2 POSIX无名信号量 195
7.5.3 system V信号量 196
7.5.4 用信号量解决互斥问题 201
7.6 小结与练习 204
7.6.1 小结 204
7.6.2 习题与思考 205
第8章 高级套接字函数 207
8.1 函数recv和send 208
8.1.1 send的用法 208
8.1.2 recv的用法 209
8.2 函数readv和writev 211
8.3 函数recvfrom和sendto 214
8.4 函数recvmsg和sendmsg 214
8.5 套接字的关闭 216
8.5.1 用close函数关闭套接字 216
8.5.2 shutdown函数的使用 216
8.6 小结与练习 218
8.6.1 小结 218
8.6.2 习题与思考 218
第9章 系统I/O与服务器模型 219
9.1 系统I/O模型简介 220
9.2 阻塞与非阻塞 221
9.2.1 阻塞套接字的特点 221
9.2.2 阻塞式I/O实现超时控制 226
9.2.3 非阻塞套接字 227
9.3 多路复用的I/O模型 231
9.3.1 多路复用简介 231
9.3.2 select函数 232
9.3.3 多路复用I/O的应用实例 234
9.4 信号驱动的I/O模型 244
9.5 创建Linux网络服务器 246
9.5.1 TCP循环服务器 246
9.5.2 TCP并发服务器 247
9.5.3 UDP循环服务器 247
9.5.4 UDP并发服务器 248
9.5.6 一个TCP并发服务器实例 249
9.5.5 多路复用I/O并发服务器 249
9.6 小结与练习 252
9.6.1 小结 252
9.6.2 习题与思考 252
第10章 带外数据 253
10.1 带外数据概述 254
10.2 带外数据的发送与接收 255
10.2.1 带外数据标志 255
10.2.2 发送带外数据 256
10.2.3 接收带外数据 257
10.2.5 带外数据的覆盖 259
10.2.4 应用程序对带外数据的处理 259
10.3 发送带外数据应用实例 260
10.4 几种接收带外数据的方法 263
10.4.1 通过信号SIGURG接收带外数据 263
10.4.2 通过多路复用模型接收带外数据 267
10.4.3 通过检测带外标识接收带外数据 269
10.5 带外数据的覆盖实例 273
10.6.2 习题与思考 278
10.6 小结与练习 278
10.6.1 小结 278
第3篇 深入实例篇 283
第11章 多线程编程 283
11.1 线程的基本概念 284
11.1.1 什么是线程 285
11.1.2 采用多线程的优点 285
11.1.3 线程的结构一览 286
11.1.4 多线程的标准 288
11.2.1 创建线程的函数 289
11.2 线程的相关调用 289
11.2.2 退出线程的函数 290
11.2.3 创建线程的简单实例 290
11.2.4 其他相关的函数调用 292
11.3 线程间的互斥 298
11.3.1 线程互斥的概念 298
11.3.2 相关的函数调用 299
11.4.2 相关的函数调用 303
11.4 线程的同步 303
11.4.1 线程同步的概念 303
11.5 线程的特定数据区 307
11.5.1 线程特定数据区概念 307
11.5.2 相关的函数调用 308
11.5.3 线程特定数据使用的方法 310
11.6 一个多线程扫描端口的实例 311
11.7.2 习题与思考 316
11.7 小结与练习 316
11.7.1 小结 316
第12章 原始套接字编程 319
12.1 原始套接字概述 320
12.2 创建原始套接字 320
12.3 发送和接收数据包 322
12.4 产生欺骗的IP数据包 323
12.5 Ping应用程序分析 327
12.5.1 Ping命令的功能 327
12.5.2 Ping程序的设计实现 328
12.5.3 Ping命令攻击目标机器 334
12.6 小结与练习 337
12.6.1 小结 337
12.6.2 习题与思考 337
第13章 综合实例——网络业务系统模拟 339
13.1.1 银行业务系统遵循的原则 340
13.1.2 银行业务系统的特点 340
13.1 银行业务系统背景 340
13.2 总体设计方案 341
13.2.1 系统构成 341
13.2.2 功能说明 342
13.3 详细设计方案(网络编程部分) 343
13.3.1 系统网络拓扑结构图 343
13.3.2 程序流程介绍 344
13.3.3 功能模块的划分 345
13.4.1 相关的头文件 346
13.4 源代码解析 346
13.4.2 公用函数的说明 349
13.4.3 地市服务器通信模块 361
13.4.4 与对方前置机通信模块 378
13.4.5 前置机处理模块 395
13.5 小结与练习 417
13.5.1 小结 417
13.5.2 习题与思考 417
附录 部分习题参考答案 419