LINUX网络编程(第3版)
1星价
¥111.3
(7.0折)
2星价¥111.3
定价¥159.0
图文详情
- ISBN:9787302660514
- 装帧:平装
- 册数:暂无
- 重量:暂无
- 开本:其他
- 页数:644
- 出版时间:2024-04-01
- 条形码:9787302660514 ; 978-7-302-66051-4
本书特色
“Linux典藏大系”畅销15年,经久不衰,累计销售30万余册。
广受好评的Linux经典畅销书全新改版,ChinaUnix社区力荐。
资深工程师25年开发经验的总结,深入剖析用户层和内核层网络编程。
详细展现Web服务器、网络协议栈和防火墙3个经典案例的实现。
内容全面:涵盖Linux网络编程从基础知识到高级技术的大部分重要知识点。
内容深入:重点讲解技术性较强的Linux用户空间网络编程和内核网络编程。
注重原理:从基本概念和原理两个维度对每个知识点进行详细和透彻的分析。
插图丰富:绘制220余幅原理图,以直观的方式剖析复杂度和难度较高的知识点。
代码典型:书中的示例代码大多是从实际项目中总结而来,有很强的实用性。
注重实践:结合500多个典型示例和3个综合案例讲透核心知识点。
视频讲解:专门为重点内容录制多媒体教学视频,高效、直观。
提供习题:每章都提供习题,帮助读者巩固和自测重点内容的掌握情况。
丛书15年经久不衰,畅销30万册,全新改版,前版畅销2.5万册,视频+导图+PPT…
内容简介
本书是获得大量读者好评的“Linux典藏大系”中的《Linux网络编程》第3版。《Linux网络编程》第1、2版出版后得到了大量读者的好评,曾经多次印刷并得到了ChinaUnix技术社区的推荐。《Linux网络编程(第3版)》全面、系统、深入地介绍Linux网络编程的相关知识,涉及面很广,从编程工具和环境搭建,到高级技术和核心原理,再到项目实战,几乎涵盖Linux网络编程的所有重要知识点。《Linux网络编程(第3版)》提供教学视频、思维导图、教学PPT和习题参考答案等超值配套资料,可以帮助读者高效、直观地学习。
《Linux网络编程(第3版)》共20章,分为4篇。第1篇“Linux网络开发基础知识”,涵盖Linux操作系统概述、Linux编程环境、文件系统概述,以及程序、进程和线程等相关知识;第2篇“Linux用户层网络编程”,涵盖TCP/IP族概述、应用层网络服务程序概述、TCP网络编程基础知识、服务器和客户端信息获取、数据的I/O及其复用、基于UDP接收和发送数据、高级套接字、套接字选项、原始套接字、服务器模型、IPv6基础知识等;第3篇“Linux内核网络编程”,涵盖Linux内核层网络架构和netfilter框架的报文处理;第4篇“综合案例”,介绍3个网络编程综合案例的实现,包括一个简单的Web服务器SHTTPD的实现、一个简单的网络协议栈SIP的实现和一个简单的防火墙SIPFW的实现。
《Linux网络编程(第3版)》内容丰富,讲解深入,适合想全面、系统、深入学习Linux网络编程的人员阅读,尤其适合Linux网络开发工程技术人员和基于Linux平台的网络程序设计人员作为参考读物。
目录
目录
第1篇 Linux网络开发基础知识
第1章 Linux操作系统概述 2
1.1 Linux的发展历史 2
1.1.1 Linux的诞生和发展 2
1.1.2 Linux名称的由来 2
1.2 Linux的发展要素 3
1.2.1 UNIX操作系统 3
1.2.2 Minix操作系统 3
1.2.3 POSIX标准 3
1.3 Linux与UNIX的异同 3
1.4 常见的Linux发行版本和内核版本的选择 4
1.4.1 常见的Linux发行版本 4
1.4.2 内核版本的选择 5
1.5 Linux系统架构 5
1.5.1 Linux内核的主要模块 5
1.5.2 Linux的文件结构 7
1.6 GNU通用公共许可证 7
1.6.1 GPL许可证的发展历史 8
1.6.2 GPL的自由理念 8
1.6.3 GPL的基本条款 8
1.6.4 关于GPL许可证的争议 9
1.7 Linux软件开发的可借鉴之处 9
1.8 小结 9
1.9 习题 10
第2章 Linux编程环境 11
2.1 编辑器 11
2.1.1 Vim简介 11
2.1.2 使用Vim建立文件 12
2.1.3 使用Vim编辑文本 13
2.1.4 Vim的格式设置 14
2.1.5 Vim的配置文件.vimrc 15
2.1.6 使用其他编辑器 15
2.2 GCC编译器工具集 16
2.2.1 GCC简介 16
2.2.2 编译程序基础知识 16
2.2.3 将单个文件编译成可执行文件 17
2.2.4 生成目标文件 18
2.2.5 多文件编译 18
2.2.6 预处理 19
2.2.7 编译成汇编语言 20
2.2.8 生成并使用静态链接库 21
2.2.9 生成动态链接库 22
2.2.10 动态加载库 24
2.2.11 GCC的常用选项 26
2.2.12 搭建编译环境 27
2.3 Makefile文件简介 27
2.3.1 多文件工程实例 27
2.3.2 多文件工程的编译 29
2.3.3 Makefile的规则 31
2.3.4 在Makefile中使用变量 33
2.3.5 搜索路径 36
2.3.6 自动推导规则 37
2.3.7 递归调用 37
2.3.8 Makefile中的函数 39
2.4 GDB调试工具 40
2.4.1 编译可调试程序 40
2.4.2 使用GDB调试程序 42
2.4.3 GDB的常用命令 45
2.4.4 其他GDB程序 52
2.5 小结 52
2.6 习题 53
第3章 文件系统概述 54
3.1 Linux文件系统简介 54
3.1.1 Linux的文件分类 54
3.1.2 创建文件系统 55
3.1.3 挂载文件系统 58
3.1.4 索引节点 59
3.1.5 普通文件 59
3.1.6 设备文件 60
3.1.7 虚拟文件系统 61
3.2 文件的通用操作方法 64
3.2.1 文件描述符 64
3.2.2 打开文件函数open() 64
3.2.3 关闭文件函数close() 66
3.2.4 读取文件函数read() 67
3.2.5 写文件函数write() 69
3.2.6 文件偏移函数lseek() 70
3.2.7 获得文件状态 73
3.2.8 文件空间映射函数mmap()和munmap() 74
3.2.9 文件属性函数fcntl() 77
3.2.10 文件输入/输出控制函数ioctl() 81
3.3 socket文件类型 82
3.4 小结 82
3.5 习题 82
第4章 程序、进程和线程 84
4.1 程序、进程和线程的概念 84
4.1.1 程序和进程的区别 84
4.1.2 Linux环境中的进程 84
4.1.3 进程和线程 85
4.2 进程产生的方式 85
4.2.1 进程号 86
4.2.2 fork()函数 86
4.2.3 system()函数 87
4.2.4 exec()族函数 88
4.2.5 所有用户态进程的产生进程systemd 89
4.3 进程间通信和同步 90
4.3.1 半双工管道 90
4.3.2 命名管道 95
4.3.3 消息队列 96
4.3.4 消息队列实例 100
4.3.5 信号量 103
4.3.6 共享内存 107
4.3.7 信号 110
4.4 Linux线程 111
4.4.1 多线程编程实例 112
4.4.2 线程创建函数pthread_create() 113
4.4.3 线程结束函数pthread_join()和pthread_exit() 114
4.4.4 线程的属性 115
4.4.5 线程间的互斥 116
4.4.6 线程的信号量函数 118
4.5 小结 120
4.6 习题 121
第2篇 Linux用户层网络编程
第5章 TCP/IP族概述 124
5.1 OSI网络分层简介 124
5.1.1 OSI网络分层结构 124
5.1.2 OSI模型的7层结构 125
5.1.3 OSI模型的数据传输 125
5.2 TCP/IP栈简介 126
5.2.1 TCP/IP栈参考模型 126
5.2.2 主机到网络层协议 128
5.2.3 IP简介 129
5.2.4 互联网控制报文协议 131
5.2.5 传输控制协议 135
5.2.6 用户数据报文协议 138
5.2.7 地址解析协议 140
5.3 IP地址分类与TCP/UDP端口 142
5.3.1 因特网中的IP地址分类 142
5.3.2 子网掩码 144
5.3.3 IP地址的配置 145
5.3.4 端口 146
5.4 主机字节序和网络字节序 146
5.4.1 字节序的含义 147
5.4.2 网络字节序的转换 147
5.5 小结 149
5.6 习题 149
第6章 应用层网络服务程序概述 151
6.1 HTTP及其服务 151
6.1.1 HTTP简介 151
6.1.2 HTTP实现的基本通信过程 151
6.2 FTP及其服务 153
6.2.1 FTP简介 153
6.2.2 FTP的工作模式 154
6.2.3 FTP的传输方式 155
6.2.4 一个简单的FTP下载过程 155
6.2.5 常用的FTP工具 156
6.3 TELNET协议及其服务 156
6.3.1 远程登录简介 156
6.3.2 使用TELNET协议进行远程登录 156
6.3.3 TELNET协议简介 157
6.4 NFS协议及其服务 158
6.4.1 安装NFS服务器和客户端 158
6.4.2 服务器端的设定 158
6.4.3 客户端操作 158
6.4.4 showmount命令 159
6.5 自定义网络服务 159
6.5.1 xinetd简介 159
6.5.2 xinetd配置方式 159
6.5.3 自定义网络服务 161
6.6 小结 162
6.7 习题 162
第7章 TCP网络编程基础知识 163
7.1 套接字编程基础知识 163
7.1.1 套接字地址结构 163
7.1.2 用户层和内核的交互过程 164
7.2 TCP网络编程流程 165
7.2.1 TCP网络编程架构 165
7.2.2 创建网络插口函数socket() 167
7.2.3 绑定一个地址端口 169
7.2.4 监听本地端口函数listen() 172
7.2.5 接收一个网络请求函数accept() 175
7.2.6 连接目标网络服务器函数connect() 178
7.2.7 写入数据函数write() 179
7.2.8 读取数据函数read() 180
7.2.9 关闭套接字函数shutdown() 180
7.3 服务器/客户端实例 180
7.3.1 功能描述 181
7.3.2 服务器网络程序 181
7.3.3 服务器端和客户端的连接 183
7.3.4 客户端网络程序 183
7.3.5 客户端读取和显示字符串 184
7.3.6 编译运行程序 184
7.4 截取信号实例 185
7.4.1 信号处理 185
7.4.2 SIGPIPE信号 186
7.4.3 SIGINT信号 186
7.5 小结 186
7.6 习题 187
第8章 服务器和客户端信息获取 188
8.1 字节序 188
8.1.1 大端字节序和小端字节序 188
8.1.2 字节序转换函数 190
8.1.3 字节序转换实例 192
8.2 字符串IP地址和二进制IP地址的转换 194
8.2.1 inet_xxx()函数 195
8.2.2 inet_pton()和inet_ntop()函数 197
8.2.3 地址转换实例 197
8.2.4 inet_pton()和inet_ntop()函数实例 200
8.3 套接字描述符判定函数issockettype() 200
8.3.1 issockettype()函数 201
8.3.2 main()函数 201
8.4 IP地址与域名的相互转换 201
8.4.1 DNS原理 202
8.4.2 获取主机信息的函数 203
8.4.3 通过主机名获取主机信息实例 205
8.4.4 gethostbyname()函数不可重入实例 206
8.5 协议名称处理函数 208
8.5.1 xxxprotoxxx()函数 208
8.5.2 使用协议族函数实例 209
8.6 小结 212
8.7 习题 213
第9章 数据的I/O及其复用 214
9.1 I/O函数 214
9.1.1 使用recv()函数接收数据 214
9.1.2 使用send()函数发送数据 215
9.1.3 使用readv()函数接收数据 215
9.1.4 使用writev()函数发送数据 216
9.1.5 使用recvmsg()函数接收数据 216
9.1.6 使用sendmsg()函数发送数据 218
9.1.7 I/O函数的比较 220
9.2 I/O函数使用实例 220
9.2.1 客户端的处理流程 220
9.2.2 服务器端的处理流程 222
9.2.3 recv()和send()函数 223
9.2.4 readv()和write()函数 225
9.2.5 recvmsg()和sendmsg()函数 227
9.3 I/O模型 230
9.3.1 阻塞I/O模型 230
9.3.2 非阻塞I/O模型 231
9.3.3 I/O复用模型 231
9.3.4 信号驱动I/O模型 231
9.3.5 异步I/O模型 232
9.4 select()和pselect()函数 232
9.4.1 select()函数 233
9.4.2 pselect()函数 234
9.5 poll()和ppoll()函数 236
9.5.1 poll()函数 236
9.5.2 ppoll()函数 237
9.6 非阻塞编程 237
9.6.1 非阻塞方式程序设计简介 238
9.6.2 非阻塞程序设计实例 238
9.7 小结 239
9.8 习题 239
第10章 基于UDP接收和发送数据 241
10.1 UDP程序设计简介 241
10.1.1 UDP编程框架 241
10.1.2 UDP服务器端编程框架 242
10.1.3 UDP客户端编程框架 243
10.2 UDP程序设计的常用函数 243
10.2.1 建立套接字函数socket()和绑定套接字函数bind() 243
10.2.2 接收数据函数recvfrom()和recv() 244
10.2.3 发送数据函数sendto()和send() 247
10.3 UDP接收和发送数据实例 251
10.3.1 UDP服务器端 251
10.3.2 UDP服务器端数据处理 252
10.3.3 UDP客户端 252
10.3.4 UDP客户端数据处理 253
10.3.5 测试UDP程序 253
10.4 UDP程序设计的常见问题 253
10.4.1 UDP报文丢失数据 254
10.4.2 UDP数据发送乱序 256
10.4.3 在UDP中使用connect()函数的副作用 257
10.4.4 UDP缺乏流量控制 258
10.4.5 UDP的外出网络接口 260
10.4.6 UDP的数据报文截断 261
10.5 小结 262
10.6 习题 262
第11章 高级套接字 263
11.1 UNIX域函数 263
11.1.1 UNIX域函数的地址结构 263
11.1.2 套接字函数 263
11.1.3 使用UNIX域函数进行套接字编程 264
11.1.4 传递文件描述符 266
11.1.5 socketpair()函数 266
11.1.6 传递文件描述符实例 267
11.2 广播 271
11.2.1 广播的IP地址 271
11.2.2 广播与单播比较 272
11.2.3 广播实例 274
11.3 多播 279
11.3.1 多播的概念 279
11.3.2 广域网的多播 279
11.3.3 多播编程 279
11.3.4 内核中的多播 281
11.3.5 多播服务器端实例 285
11.3.6 多播客户端实例 286
11.4 数据链路层访问 287
11.4.1 SOCK_PACKET类型 287
11.4.2 设置套接口捕获链路帧的编程方法 288
11.4.3 从套接口读取链路帧的编程方法 289
11.4.4 定位IP报头的编程方法 290
11.4.5 定位TCP报头的编程方法 291
11.4.6 定位UDP报头的编程方法 292
11.4.7 定位应用层报文数据的编程方法 293
11.4.8 使用SOCK_PACKET编写ARP请求程序实例 294
11.5 小结 297
11.6 习题 297
第12章 套接字选项 299
12.1 获取和设置套接字选项 299
12.1.1 getsockopt()和setsocketopt()函数 299
12.1.2 套接字选项 300
12.1.3 套接字选项的简单示例 300
12.2 SOL_SOCKET协议族选项 303
12.2.1 广播选项SO_BROADCAST 304
12.2.2 调试选项SO_DEBUG 304
12.2.3 不经过路由选项SO_DONTROUTE 304
12.2.4 错误选项SO_ERROR 304
12.2.5 保持连接选项SO_KEEPALIVE 305
12.2.6 缓冲区处理方式选项SO_LINGER 306
12.2.7 带外数据处理方式选项SO_OOBINLINE 308
12.2.8 缓冲区大小选项SO_RCVBUF和SO_SNDBUF 309
12.2.9 缓冲区下限选项SO_RCVLOWAT和SO_SNDLOWAT 309
12.2.10 收发超时选项SO_RCVTIMEO和SO_SNDTIMEO 309
12.2.11 地址重用选项SO_REUSERADDR 310
12.2.12 端口独占选项SO_EXCLUSIVEADDRUSE 310
12.2.13 套接字类型选项SO_TYPE 310
12.2.14 是否与BSD套接字兼容选项SO_BSDCOMPAT 310
12.2.15 套接字网络接口绑定选项SO_BINDTODEVICE 311
12.2.16 套接字优先级选项SO_PRIORITY 312
12.3 IPPROTO_IP选项 312
12.3.1 IP_HDRINCL选项 312
12.3.2 IP_OPTIONS选项 312
12.3.3 IP_TOS选项 312
12.3.4 IP_TTL选项 313
12.4 IPPROTO_TCP选项 313
12.4.1 TCP_KEEPALIVE选项 313
12.4.2 TCP_MAXRT选项 313
12.4.3 TCP_MAXSEG选项 314
12.4.4 TCP_NODELAY和TCP_CORK选项 314
12.5 套接字选项使用实例 316
12.5.1 设置和获取缓冲区大小 316
12.5.2 获取套接字的类型 320
12.5.3 套接字选项综合实例 321
12.6 ioctl()函数 325
12.6.1 ioctl()函数的选项 325
12.6.2 ioctl()函数的I/O请求 326
12.6.3 ioctl()函数的文件请求 328
12.6.4 ioctl()函数的网络接口请求 328
12.6.5 使用ioctl()函数对ARP高速缓存进行操作 335
12.6.6 使用ioctl()函数发送路由表请求 337
12.7 fcntl()函数 337
12.7.1 fcntl()函数的命令选项 337
12.7.2 使用fcntl()函数修改套接字非阻塞属性 337
12.7.3 使用fcntl()函数设置信号属主 338
12.8 小结 338
12.9 习题 338
第13章 原始套接字 340
13.1 原始套接字概述 340
13.2 创建原始套接字 341
13.2.1 SOCK_RAW选项 341
13.2.2 IP_HDRINCL套接字选项 342
13.2.3 不需要bind()函数 342
13.3 使用原始套接字发送报文 342
13.4 使用原始套接字接收报文 343
13.5 原始套接字报文处理的结构 343
13.5.1 IP的头部结构 343
13.5.2 ICMP的头部结构 344
13.5.3 UDP的头部结构 347
13.5.4 TCP的头部结构 348
13.6 ping命令使用实例 350
13.6.1 协议格式 350
13.6.2 校验和函数 351
13.6.3 设置ICMP发送报文的头部 352
13.6.4 剥离ICMP接收报文的头部 353
13.6.5 计算时间差 354
13.6.6 发送报文 355
13.6.7 接收报文 356
13.6.8 主函数实现过程 357
13.6.9 主函数main() 359
13.6.10 编译测试 362
13.7 洪水攻击 362
13.8 ICMP洪水攻击 362
13.8.1 ICMP洪水攻击的原理 362
13.8.2 ICMP洪水攻击实例 364
13.9 UDP洪水攻击 367
13.10 SYN洪水攻击 370
13.10.1 SYN洪水攻击的原理 370
13.10.2 SYN洪水攻击实例 371
13.11 小结 374
13.12 习题 374
第14章 服务器模型 376
14.1 循环服务器 376
14.1.1 UDP循环服务器 376
14.1.2 TCP循环服务器 378
14.2 并发服务器 381
14.2.1 简单的并发服务器模型 381
14.2.2 UDP并发服务器 382
14.2.3 TCP并发服务器 384
14.3 TCP的高级并发服务器模型 387
14.3.1 单客户端单进程统一接收请求 387
14.3.2 单客户端单线程统一接收请求 390
14.3.3 单客户端单线程独自接收请求 392
14.4 I/O复用循环服务器 395
14.4.1 I/O复用循环服务器模型简介 395
14.4.2 I/O复用循环服务器模型实例 396
14.5 小结 400
14.6 习题 400
第15章 IPv6基础知识 402
15.1 IPv4的缺陷 402
15.2 IPv6的特点 403
15.3 IPv6的地址 403
15.3.1 IPv6的单播地址 404
15.3.2 可聚集全球单播地址 404
15.3.3 本地单播地址 405
15.3.4 兼容性地址 405
15.3.5 IPv6的多播地址 406
15.3.6 IPv6的任播地址 407
15.3.7 主机的多个IPv6地址 407
15.4 IPv6的头部 407
15.4.1 IPv6的头部结构 407
15.4.2 IPv6的头部结构与IPv4的头部结构对比 408
15.4.3 IPv6的TCP头部结构 409
15.4.4 IPv6的UDP头部结构 409
15.4.5 IPv6的ICMP头部结构 409
15.5 IPv6运行环境 410
15.5.1 加载IPv6模块 411
15.5.2 查看是否支持IPv6 411
15.6 IPv6的结构定义 412
15.6.1 IPv6的地址族和协议族 412
15.6.2 套接字地址结构 412
15.6.3 地址兼容考虑 413
15.6.4 IPv6的通用地址 413
15.7 IPv6的套接字函数 414
15.7.1 socket()函数 414
15.7.2 没有改变的函数 414
15.7.3 改变的函数 415
15.8 IPv6的套接字选项与控制命令 415
15.8.1 IPv6的套接字选项 415
15.8.2 单播跳限IPV6_UNICAST_HOPS 416
15.8.3 发送和接收多播包 416
15.8.4 在IPv6中获得时间戳的ioctl命令 417
15.9 IPv6的库函数 417
15.9.1 地址转换函数的差异 417
15.9.2 域名解析函数的差异 417
15.9.3 测试宏 419
15.10 IPv6编程实例 419
15.10.1 服务器程序 419
15.10.2 客户端程序 421
15.10.3 编译程序 422
15.11 小结 423
15.12 习题 423
第3篇 Linux内核网络编程
第16章 Linux内核层网络架构 426
16.1 Linux网络协议栈概述 426
16.1.1 代码目录分布 426
16.1.2 网络数据在内核中的处理过程 427
16.1.3 修改内核层的网络数据 429
16.1.4 sk_buff结构 429
16.1.5 网络协议数据结构inet_protosw 434
16.2 软中断CPU报文队列及其处理 435
16.2.1 软中断简介 435
16.2.2 网络收发处理软中断的实现机制 436
16.3 如何在内核中接收和发送socket数据 437
16.3.1 初始化函数socket() 437
16.3.2 接收网络数据函数recv() 437
16.3.3 发送网络数据函数send() 438
16.4 小结 439
16.5 习题 439
第17章 netfilter框架的报文处理 440
17.1 netfilter框架概述 440
17.1.1 netfilter框架简介 440
17.1.2 在IPv4栈上实现netfilter框架 440
17.1.3 netfilter框架的检查 441
17.1.4 netfilter框架的规则 442
17.2 iptables和netfilter 442
17.2.1 iptables简介 442
17.2.2 iptables的表和链 443
17.2.3 使用iptables设置过滤规则 444
17.3 内核模块编程 446
17.3.1 内核层的Hello World程序 446
17.3.2 内核模块的基本架构 448
17.3.3 内核模块的加载和卸载过程 450
17.3.4 内核模块的初始化和清理函数 450
17.3.5 内核模块的初始化和清理过程的容错处理 451
17.3.6 编译内核模块所需的Makefile 452
17.4 5个钩子 453
17.4.1 netfilter框架的5个钩子 453
17.4.2 NF_HOOK()宏函数 454
17.4.3 钩子的处理规则 454
17.5 注册和注销钩子 455
17.5.1 nf_hook_ops结构 455
17.5.2 注册钩子 455
17.5.3 注销钩子 456
17.5.4 注册和注销函数 456
17.6 钩子处理实例 457
17.6.1 功能描述 457
17.6.2 需求分析 458
17.6.3 ping回显屏蔽 458
17.6.4 禁止向目的IP地址发送数据 458
17.6.5 端口关闭 458
17.6.6 动态配置 459
17.6.7 可加载内核代码 460
17.6.8 应用层测试代码 467
17.6.9 编译和测试 467
17.7 多个钩子的优先级设置 467
17.8 校验和问题 468
17.9 小结 469
17.10 习题 469
第4篇 综合案例
第18章 一个简单的Web服务器SHTTPD的实现 472
18.1 SHTTPD的需求分析 472
18.1.1 启动参数可动态配置 473
18.1.2 多客户端支持 475
18.1.3 支持的方法 475
18.1.4 支持的HTTP版本 476
18.1.5 支持的头域 476
18.1.6 URI定位 476
18.1.7 支持的CGI 477
18.1.8 错误代码 478
18.2 SHTTPD的模块分析和设计 478
18.2.1 主函数 478
18.2.2 命令行解析模块 479
18.2.3 文件配置解析模块 481
18.2.4 多客户端支持模块 481
18.2.5 头部解析模块 483
18.2.6 URI解析模块 484
18.2.7 请求方法解析模块 484
18.2.8 支持的CGI模块 485
18.2.9 错误处理模块 487
18.3 SHTTPD各模块的实现 489
18.3.1 命令行解析模块的实现 489
18.3.2 文件配置解析模块的实现 491
18.3.3 多客户端支持模块的实现 493
18.3.4 URI解析模块的实现 496
18.3.5 请求方法解析模块的实现 497
18.3.6 响应方法模块的实现 498
18.3.7 CGI模块的实现 501
18.3.8 支持的HTTP版本的实现 504
18.3.9 支持的内容类型模块的实现 504
18.3.10 错误处理模块的实现 506
18.3.11 返回目录文件列表模块的实现 508
18.3.12 主函数的实现 510
18.4 程序的编译和测试 511
18.4.1 建立源文件 511
18.4.2 制作Makefile和执行文件 511
18.4.3 使用不同的浏览器测试服务器程序 512
18.5 小结 512
18.6 习题 513
第19章 一个简单的网络协议栈SIP的实现 514
19.1 功能描述 514
19.1.1 基本功能描述 514
19.1.2 分层功能描述 515
19.1.3 用户接口功能描述 515
19.2 基本架构 516
19.3 SIP网络协议栈的存储区缓存 517
19.3.1 SIP存储缓冲结构定义 517
19.3.2 SIP存储缓冲的处理函数 520
19.4 SIP网络协议栈的网络接口层 522
19.4.1 网络接口层架构 523
19.4.2 网络接口层的数据结构 523
19.4.3 网络接口层的初始化函数 525
19.4.4 网络接口层的输入函数 526
19.4.5 网络接口层的输出函数 529
19.5 SIP网络协议栈的ARP层 531
19.5.1 ARP层的架构 531
19.5.2 ARP层的数据结构 532
19.5.3 ARP层的映射表 533
19.5.4 ARP层的映射表维护函数 533
19.5.5 ARP层的网络报文构建函数 535
19.5.6 ARP层的网络报文收发处理函数 537
19.6 SIP网络协议栈的IP层 539
19.6.1 IP层的架构 540
19.6.2 IP层的数据结构 540
19.6.3 IP层的输入函数 542
19.6.4 IP层的输出函数 546
19.6.5 IP层的分片函数 546
19.6.6 IP层的分片组装函数 548
19.7 SIP网络协议栈的ICMP层 551
19.7.1 ICMP层的数据结构 552
19.7.2 ICMP层的协议支持 552
19.7.3 ICMP层的输入函数 554
19.7.4 ICMP层的回显应答函数 555
19.8 SIP网络协议栈的UDP层 556
19.8.1 UDP层的数据结构 556
19.8.2 UDP层的控制单元 556
19.8.3 UDP层的数据输入函数 557
19.8.4 UDP层的数据输出函数 558
19.8.5 UDP层的创建函数 558
19.8.6 UDP层的释放函数 559
19.8.7 UDP层的绑定函数 559
19.8.8 UDP层的发送数据函数 560
19.8.9 UDP层的校验和计算 561
19.9 SIP网络协议栈的协议无关层 562
19.9.1 协议无关层的系统架构 562
19.9.2 协议无关层的函数形式 563
19.9.3 协议无关层的接收数据函数 563
19.10 SIP网络协议栈的BSD接口层 564
19.10.1 BSD接口层的架构 565
19.10.2 BSD接口层的套接字创建函数 565
19.10.3 BSD接口层的套接字关闭函数 566
19.10.4 BSD接口层的套接字绑定函数 566
19.10.5 BSD接口层的套接字连接函数 567
19.10.6 BSD接口层的套接字接收数据函数 567
19.10.7 BSD接口层的发送数据函数 568
19.11 SIP网络协议栈的编译 569
19.11.1 SIP的文件结构 569
19.11.2 SIP的Makefile 569
19.11.3 SIP的编译运行 570
19.12 小结 570
19.13 习题 571
第20章 一个简单的防火墙SIPFW的实现 572
20.1 SIPFW防火墙功能描述 572
20.1.1 网络数据过滤功能描述 572
20.1.2 防火墙规则设置功能描述 573
20.1.3 附加功能描述 573
20.2 SIPFW防火墙需求分析 573
20.2.1 SIPFW防火墙的条件和动作 573
20.2.2 支持的过滤类型 574
20.2.3 过滤方式 575
20.2.4 基本配置文件 576
20.2.5 命令行配置格式 576
20.2.6 防火墙规则配置文件 577
20.2.7 防火墙日志文件 578
20.2.8 构建防火墙采用的技术方案 579
20.3 使用netlink机制进行用户空间和内核空间的数据交互 579
20.3.1 用户空间程序设计 580
20.3.2 内核空间的netlink API 582
20.4 使用proc实现内核空间和用户空间通信 584
20.4.1 proc虚拟文件系统的结构 584
20.4.2 创建proc虚拟文件 584
20.4.3 删除proc虚拟文件 585
20.5 内核空间的文件操作函数 585
20.5.1 内核空间的文件结构 585
20.5.2 内核空间的文件建立操作 586
20.5.3 内核空间的文件读写操作 586
20.5.4 内核空间的文件关闭操作 587
20.6 SIPFW防火墙的模块设计和分析 587
20.6.1 总体架构 588
20.6.2 用户命令解析模块 590
20.6.3 用户空间与内核空间的交互模块 593
20.6.4 内核链的规则处理模块 596
20.6.5 proc虚拟文件系统模块 598
20.6.6 配置文件和日志文件处理模块 598
20.6.7 过滤模块 600
20.7 SIPFW防火墙各模块的实现 603
20.7.1 用户命令解析模块的实现 603
20.7.2 过滤规则解析模块的实现 607
20.7.3 网络数据拦截模块的实现 609
20.7.4 proc虚拟文件系统模块的实现 610
20.7.5 配置文件解析模块的实现 612
20.7.6 内核模块初始化和退出的实现 613
20.7.7 用户空间处理主函数的实现 614
20.8 程序的编译和测试 615
20.8.1 用户程序和内核程序的Makefile 615
20.8.2 编译并运行程序 616
20.8.3 过滤测试 616
20.9 小结 618
20.10 习题 619
展开全部
作者简介
宋敬彬,海信集团国家重点实验室高级工程师,海信数字家庭原型系统的主要设计和实现人。有25年的编程经验,对Linux内核和网络协议栈十分熟悉。长期从事嵌入式Linux设备、机顶盒产品和IGRS设备互联的研究和开发工作。目前主要从事数字家庭系统的设计和实现。曾经在技术期刊上发表了多篇论文,并参与国家863高性能集群服务器和电子发展基金的IPv6等项目。
预估到手价 ×
预估到手价是按参与促销活动、以最优惠的购买方案计算出的价格(不含优惠券部分),仅供参考,未必等同于实际到手价。
确定