《Linux网络编程 第2版》PDF下载

  • 购买积分:19 如何计算积分?
  • 作  者:宋敬彬等编著
  • 出 版 社:北京:清华大学出版社
  • 出版年份:2014
  • ISBN:9787302335283
  • 页数:677 页
图书介绍:本书从应用层到Linux内核,从基本知识点到综合案例,向读者介绍Linux下的网络程序设计。内容包含Linux系统概述、Linux编程环境、Linux文件系统简介、Linux下的进程和线程、TCP/IP协议族、应用层网络服务程序、TCP编程、主机信息获取、数据IO复用、UDP编程、高级套接字、套接字选项、原始套接字、服务器模型、IPv6、Linux内核网络部分结构及分布、netfilter框架内报文处理、三个综合案例。

第1篇 Linux网络开发基础 2

第1章 Linux操作系统概述 2

1.1 Linux发展历史 2

1.1.1 Linux的诞生和发展 2

1.1.2 Linux名称的由来 3

1.2 Linux的发展要素 3

1.2.1 UNIX操作系统 3

1.2.2 Minix操作系统 4

1.2.3 POSIX标准 4

1.3 Linux与UNIX的异同 5

1.4操作系统类型选择和内核版本的选择 5

1.4.1常见的不同公司发行的Linux异同 5

1.4.2内核版本的选择 6

1.5 Linux的系统架构 7

1.5.1 Linux内核的主要模块 7

1.5.2 Linux的文件结构 8

1.6 GNU通用公共许可证 9

1.6.1 GPL许可证的历史 9

1.6.2 GPL的自由理念 10

1.6.3 GPL的基本条款 11

1.6.4关于GPL许可证的争议 12

1.7 Linux软件开发的可借鉴之处 12

1.8小结 13

第2章 Linux编程环境 14

2.1 Linux环境下的编辑器 14

2.1.1 Vim使用简介 14

2.1.2使用Vim建立文件 15

2.1.3使用Vim编辑文本 16

2.1.4 Vim的格式设置 18

2.1.5 Vim配置文件.vimrc 18

2.1.6使用其他编辑器 19

2.2 Linux下的GCC编译器工具集 19

2.2.1 GCC简介 19

2.2.2编译程序的基本知识 21

2.2.3单个文件编译成执行文件 21

2.2.4编译生成目标文件 22

2.2.5多文件编译 22

2.2.6预处理 24

2.2.7编译成汇编语言 24

2.2.8生成和使用静态链接库 25

2.2.9生成动态链接库 26

2.2.10动态加载库 29

2.2.11 GCC常用选项 31

2.2.12编译环境的搭建 33

2.3 Makefile文件简介 33

2.3.1一个多文件的工程例子 33

2.3.2多文件工程的编译 35

2.3.3 Makefile的规则 37

2.3.4 Makefile中使用变量 39

2.3.5搜索路径 42

2.3.6自动推导规则 43

2.3.7递归make 44

2.3.8 Makefile中的函数 46

2.4用GDB调试程序 47

2.4.1编译可调试程序 48

2.4.2使用GDB调试程序 49

2.4.3 GDB常用命令 52

2.4.4其他的GDB 59

2.5小结 60

第3章 文件系统简介 61

3.1 Linux下的文件系统 61

3.1.1 Linux下文件的内涵 61

3.1.2文件系统的创建 62

3.1.3挂接文件系统 65

3.1.4索引节点inode 65

3.1.5普通文件 66

3.1.6设备文件 66

3.1.7虚拟文件系统VFS 68

3.2文件的通用操作方法 72

3.2.1文件描述符 72

6.4 NFS协议和服务 175

6.4.1安装NFS服务器和客户端 175

6.4.2服务器端的设定 176

6.4.3客户端的操作 176

6.4.4 showmount命令 177

6.5自定义网络服务 177

6.5.1 xinetd/inetd 177

6.5.2 xinetd服务配置 178

6.5.3自定义网络服务 179

6.6小结 180

第7章 TCP网络编程基础 181

7.1套接字编程基础知识 181

7.1.1套接字地址结构 181

7.1.2用户层和内核层交互过程 183

7.2 TCP网络编程流程 184

7.2.1 TCP网络编程架构 184

7.2.2创建网络插口函数socket() 186

7.2.3绑定一个地址端口对函数bind() 189

7.2.4监听本地端口listen 192

7.2.5接受一个网络请求函数accept() 194

7.2.6连接目标网络服务器函数connect() 199

7.2.7写入数据函数write() 200

7.2.8读取数据函数read() 201

7.2.9关闭套接字函数 202

7.3服务器/客户端的简单例子 202

7.3.1例子功能描述 202

7.3.2服务器网络程序 202

7.3.3服务器读取和显示字符串 205

7.3.4客户端的网络程序 205

7.3.5客户端读取和显示字符串 206

7.3.6编译运行程序 206

7.4截取信号的例子 207

7.4.1信号处理 207

7.4.2信号SIGPIPE 207

7.4.3信号SIGINT 208

7.5小结 208

第8章 服务器和客户端信息的获取 209

8.1字节序 209

8.1.1大端字节序和小端字节序 209

8.1.2字节序转换函数 211

8.1.3一个字节序转换的例子 213

8.2字符串IP地址和二进制IP地址的转换 216

8.2.1 inet_xxx()函数 216

8.2.2 inet_pton()和inet_ntop()函数 218

8.2.3使用8.2.1节地址转换函数的例子 219

8.2.4使用函数inet_ton()和函数inet_ntop()的例子 221

8.3套接字描述符判定函数issockettype() 222

8.3.1进行文件描述符判定的函数issockettype() 222

8.3.2 main()函数 223

8.4 IP地址与域名之间的相互转换 223

8.4.1 DNS原理 223

8.4.2获取主机信息的函数 224

8.4.3使用主机名获取主机信息的例子 227

8.4.4函数gethostbyname()不可重入的例子 229

8.5协议名称处理函数 230

8.5.1 xxxprotoxxx()函数 231

8.5.2使用协议族函数的例子 232

8.6小结 235

第9章 数据的IO和复用 236

9.1 IO函数 236

9.1.1使用recv()函数接收数据 236

9.1.2使用send()函数发送数据 238

9.1.3使用readv()函数接收数据 239

9.1.4使用writev()函数发送数据 239

9.1.5使用recvmsg()函数接收数据 241

9.1.6使用sendmsg()函数发送数据 243

9.1.7IO函数的比较 245

9.2使用IO函数的例子 245

9.2.1客户端处理框架的例子 245

9.2.2服务器端程序框架 247

9.2.3使用recv()和send()函数 248

9.2.4使用readv()和write()函数 250

9.2.5使用recvmsg()和sendmsg()函数 252

9.3 IO模型 255

9.3.1阻塞IO模型 255

9.3.2非阻塞IO模型 255

9.3.3 IO复用 256

9.3.4信号驱动IO模型 256

9.3.5异步IO模型 257

9.4 select()函数和pselect()函数 258

9.4.1 select()函数 258

9.4.2 pselect()函数 260

9.5 poll()函数和ppoll()函数 261

9.5.1 poll()函数 261

9.5.2 ppoll()函数 262

9.6非阻塞编程 263

9.6.1非阻塞方式程序设计介绍 263

9.6.2非阻塞程序设计的例子 263

9.7小结 264

第10章 基于UDP协议的接收和发送 265

10.1 UDP编程框架 265

10.1.1 UDP编程框图 265

10.1.2 UDP服务器编程框架 267

10.1.3 UDP客户端编程框架 267

10.2 UDP协议程序设计的常用函数 267

10.2.1建立套接字socket()和绑定套接字bind() 268

10.2.2接收数据recvfrom()/recv() 268

10.2.3发送数据sendto()/send() 273

10.3 UDP接收和发送数据的例子 277

10.3.1 UDP服务器端 277

10.3.2 UDP服务器端数据处理 278

10.3.3 UDP客户端 279

10.3.4 UDP客户端数据处理 279

10.3.5测试UDP程序 280

10.4 UDP协议程序设计中的几个问题 280

10.4.1 UDP报文丢失数据 280

10.4.2 UDP数据发送中的乱序 282

10.4.3 UDP协议中的connect()函数 284

10.4.4 UDP缺乏流量控制 285

10.4.5 UDP协议中的外出网络接口 287

10.4.6 UDP协议中的数据报文截断 288

10.5小结 289

第11章 高级套接字 290

11.1 UNIX域函数 290

11.1.1 UNIX域函数的地址结构 290

11.1.2套接字函数 291

11.1.3使用UNIX域函数进行套接字编程 291

11.1.4传递文件描述符 293

11.1.5 socketpair()函数 294

11.1.6传递文件描述符的例子 295

11.2广播 299

11.2.1广播的IP地址 300

11.2.2广播与单播的比较 300

11.2.3广播的示例 301

11.3多播 307

11.3.1多播的概念 308

11.3.2广域网的多播 308

11.3.3多播的编程 308

11.3.4内核中的多播 310

11.3.5一个多播例子的服务器端 313

11.3.6一个多播例子的客户端 315

11.4数据链路层访问 317

11.4.1 SOCK_PACKET类型 317

11.4.2设置套接口以捕获链路帧的编程方法 317

11.4.3从套接口读取链路帧的编程方法 318

11.4.4定位IP包头的编程方法 319

11.4.5定位TCP报头的编程方法 321

11.4.6定位UDP报头的编程方法 322

11.4.7定位应用层报文数据的编程方法 323

11.4.8使用SOCK_PACKET编写ARP请求程序的例子 323

11.5小结 326

第12章 套接字选项 328

12.1获取和设置套接字选项getsocketopt()/setsocketopt() 328

12.1.1 getsockopt()函数和setsocketopt()函数的介绍 328

12.1.2套接字选项 329

12.1.3套接字选项简单示例 330

12.2 SOL_SOCKET协议族选项 334

12.2.1 SO_BROADCAST广播选项 334

12.2.2 SO_DEBUG调试选项 335

12.2.3 SO_DONTROUTE不经过路由选项 335

12.2.4 SO_ERROR错误选项 335

12.2.5 SO_KEEPALIVE保持连接选项 336

12.2.6 SO_LINGER缓冲区处理方式选项 337

12.2.7 SO_OOBINLINE带外数据处理方式选项 339

12.2.8 SO_RCVBUF和SO_SNDBUF缓冲区大小选项 340

12.2.9 SO_RCVLOWAT和SO_SNDLOWAT缓冲区下限选项 340

12.2.10 SO_RCVTIMEO和SO_SNDTIMEO收发超时选项 341

12.2.11 SO_REUSERADDR地址重用选项 341

12.2.12 SO_EXCLUSIVEADDRUSE端口独占选项 342

12.2.13 SO_TYPE套接字类型选项 342

12.2.14 SO_BSDCOMPAT与BSD套接字兼容选项 342

12.2.15 SO_BINDTODEVICE套接字网络接口绑定选项 343

12.2.16 SO_PRIORITY套接字优先级选项 344

12.3 IPPROTO_IP选项 344

12.3.1 IP_HDRINCL选项 344

12.3.2 IP_OPTNIOS选项 344

12.3.3 IP_TOS选项 344

12.3.4 IP_TTL选项 345

12.4 IPPROTO_TCP选项 345

12.4.1 TCP_KEEPALIVE选项 345

12.4.2 TCP_MAXRT选项 346

12.4.3 TCP_MAXSEG选项 346

12.4.4 TCP_NODELAY和TCP_CORK选项 346

12.5使用套接字选项 348

12.5.1设置和获取缓冲区大小 348

12.5.2获取套接字类型的例子 353

12.5.3使用套接字选项的综合例子 353

12.6 ioctl()函数 358

12.6.1 ioctl()函数的命令选项 358

12.6.2 ioctl()函数的IO请求 360

12.6.3 ioctl()函数的文件请求 362

12.6.4 ioctl()函数的网络接口请求 362

12.6.5使用ioctl()函数对ARP高速缓存操作 369

12.6.6使用ioctl()函数发送路由表请求 371

12.7 fcntl()函数 371

12.7.1 fcntl()函数的选项 372

12.7.2使用fcntl()函数修改套接字非阻塞属性 372

12.7.3使用fcntl()函数设置信号属主 372

12.8小结 373

第13章 原始套接字 374

13.1概述 374

13.2原始套接字的创建 375

13.2.1 SOCK_RAW选项 375

13.2.2 IP_HDRINCL套接字选项 376

13.2.3不需要bind()函数 376

13.3原始套接字发送报文 376

13.4原始套接字接收报文 377

13.5原始套接字报文处理时的结构 377

13.5.1 IP头部的结构 377

13.5.2 ICMP头部结构 378

13.5.3 UDP头部结构 381

13.5.4 TCP头部结构 382

13.6 ping的例子 384

13.6.1协议格式 384

13.6.2校验和函数 385

13.6.3设置ICMP发送报文的头部 386

13.6.4剥离ICMP接受报文的头部 387

13.6.5计算时间差 388

13.6.6发送报文 389

13.6.7接收报文 390

13.6.8主函数过程 391

13.6.9主函数main() 393

13.6.10编译测试 396

13.7洪水攻击 396

13.8 ICMP洪水攻击 397

13.8.1 ICMP洪水攻击的原理 397

13.8.2 ICMP洪水攻击的例子 397

13.9 UDP洪水攻击 401

13.10 SYN洪水攻击 405

13.10.1 SYN洪水攻击的原理 405

13.10.2 SYN洪水攻击的例子 405

13.11小结 409

第14章 服务器模型选择 410

14.1循环服务器 410

14.1.1 UDP循环服务器 410

14.1.2 TCP循环服务器 413

14.2简单并发服务器 415

14.2.1并发服务器的模型 416

14.2.2 UDP并发服务器 416

14.2.3 TCP并发服务器 419

14.3 TCP的高级并发服务器模型 421

14.3.1单客户端单进程,统一accept() 422

14.3.2单客户端单线程,统一accept() 425

14.3.3单客户端单线程,各线程独自accept(),使用互斥锁 427

14.4 1O复用循环服务器 431

14.4.1 IO复用循环服务器模型介绍 431

14.4.2 IO复用循环服务器模型的例子 432

14.5小结 436

第15章 IPv6简介 437

15.1 IPv4的缺陷 437

15.2 IPv6的特点 438

15.3 IPv6的地址 439

15.3.1 IPv6的单播地址 439

15.3.2可聚集全球单播地址 439

15.3.3本地使用单播地址 440

15.3.4兼容性地址 441

15.3.5 IPv6多播地址 441

15.3.6 IPv6任播地址 442

15.3.7主机的多个IPv6地址 442

15.4 IPv6的头部 443

15.4.1 IPv6头部格式 443

15.4.2与IPv4头部的对比 444

15.4.3 IPv6的TCP头部 444

15.4.4 IPv6的UDP头部 444

15.4.5 IPv6的ICMP头部 445

15.5 IPv6运行环境 447

15.5.1加载IPv6模块 447

15.5.2查看是否支持IPv6 447

15.6 IPv6的结构定义 448

15.6.1 IPv6的地址族和协议族 448

15.6.2套接字地址结构 448

15.6.3地址兼容考虑 450

15.6.4 IPv6通用地址 450

15.7 IPv6的套接字函数 451

15.7.1 socket()函数 451

15.7.2没有发生改变的函数 451

15.7.3发生改变的函数 452

15.8 IPv6的套接字选项 452

15.8.1 IPv6的套接字选项 452

15.8.2单播跳限IPV6_UNICAST_HOPS 453

15.8.3发送和接收多播包 454

15.8.4 IPv6中获得时间戳的ioctl命令 455

15.9 IPv6的库函数 455

15.9.1地址转换函数的差异 455

15.9.2域名解析函数的差异 455

15.9.3测试宏 458

15.10 IPv6的编程的一个简单例子 458

15.10.1服务器程序 458

15.10.2客户端程序 460

15.10.3编译调试 461

15.11小结 462

第3篇 Linux内核网络编程 464

第16章 Linux内核中网络部分结构以及分布 464

16.1概述 464

16.1.1代码目录分布 464

16.1.2内核中网络部分流程简介 466

16.1.3系统提供修改网络流程点 468

16.1.4 sk_buff结构 469

16.1.5网络协议数据结构inet_protosw 471

16.2软中断CPU报文队列及其处理 473

16.2.1 Linux内核网络协议层的层间传递手段——软中断 473

16.2.2网络收发处理软中断的实现机制 475

16.3 socket数据如何在内核中接收和发送 476

16.3.1 socket()的初始化 476

16.3.2接收网络数据recv() 476

16.3.3发送网络数据send() 477

16.4小结 477

第17章 netfilter框架内报文处理 478

17.1 netfilter 478

17.1.1 netfilter简介 478

17.1.2 netfilter框架 479

17.1.3 netfilter检查时的表格 480

17.1.4 netfilter的规则 480

17.2 iptables和netfilter 481

17.2.1 iptables简介 481

17.2.2 iptables的表和链 481

17.2.3使用iptables设置过滤规则 483

17.3内核模块编程 485

17.3.1内核“Hello World!”程序 485

17.3.2内核模块的基本架构 487

17.3.3内核模块加载和卸载过程 489

17.3.4内核模块初始化和清理函数 490

17.3.5内核模块初始化和清理过程的容错处理 490

17.3.6内核模块编译所需的Makefile 491

17.4 5个钩子点 492

17.4.1 netfilter的5个钩子点 492

17.4.2 NF_HOOK宏 493

17.4.3钩子的处理规则 494

17.5注册/注销钩子 494

17.5.1结构nf_hook_ops 494

17.5.2注册钩子 495

17.5.3注销钩子 496

17.5.4注册注销函数 497

17.6钩子的简单处理例子 498

17.6.1功能描述 498

17.6.2需求分析 498

17.6.3 ping回显屏蔽实现 498

17.6.4禁止向目的IP地址发送数据的实现 499

17.6.5端口关闭实现 499

17.6.6动态配置实现 499

17.6.7可加载内核实现代码 501

17.6.8应用层测试代码实现 508

17.6.9编译运行 508

17.7一点多个钩子的优先级 508

17.8校验和问题 509

17.9小结 510

第4篇 综合案例 512

第18章 一个简单Web服务器的例子SHTTPD 512

18.1 SHTTPD的需求分析 512

18.1.1 SHTTPD启动参数可动态配置的需求 513

18.1.2 SHTTPD的多客户端支持的需求 515

18.1.3 SHTTPD支持方法的需求 515

18.1.4 SHTTPD支持的HTTP协议版本的需求 516

18.1.5 SHTTPD支持头部的需求 517

18.1.6 SHTTPD定位URI的需求 517

18.1.7 SHTTPD支持CGI的需求 518

18.1.8 SHTTPD错误代码的需求 519

18.2 SHTTPD的模块分析和设计 519

18.2.1 SHTTPD的主函数 520

18.2.2 SHTTPD命令行解析的分析设计 521

18.2.3 SHTTPD配置文件解析的分析设计 523

18.2.4 SHTTPD的多客户端支持的分析设计 523

18.2.5 SHTTPD头部解析的分析设计 526

18.2.6 SHTTPD对URI的分析设计 526

18.2.7 SHTTPD支持方法的分析设计 527

18.2.8 SHTTPD支持CGI的分析设计 527

18.2.9 SHTTPD错误处理的分析设计 530

18.3 SHTTPD各模块的实现 532

18.3.1 SHTTPD命令行解析的实现 532

18.3.2 SHTTPD文件配置解析的实现 535

18.3.3 SHTTPD的多客户端支持的实现 536

18.3.4 SHTTPD所请求URI解析的实现 540

18.3.5 SHTTPD方法解析的实现 541

18.3.6 SHTTPD响应方法的实现 541

18.3.7 SHTTPD支持CGI的实现 545

18.3.8 SHTTPD支持HTTP协议版本的实现 548

18.3.9 SHTTPD内容类型的实现 548

18.3.10 SHTTPD错误处理的实现 550

18.3.11 SHTTPD生成目录下文件列表文件的实现 552

18.3.12 SHTTPD主函数的实现 554

18.4 SHTTPD的编译、调试和测试 555

18.4.1建立源文件 555

18.4.2制作Makefile 555

18.4.3制作执行文件 555

18.4.4使用不同的浏览器测试服务器程序 556

18.5小结 557

第19章 一个简单网络协议栈的例子SIP 558

19.1 SIP网络协议栈的功能描述 558

19.1.1 SIP网络协议栈的基本功能描述 558

19.1.2 SIP网络协议栈的分层功能描述 559

19.1.3 SIP网络协议栈的用户接口功能描述 559

19.2 SIP网络协议栈的架构 560

19.3 SIP网络协议栈的存储区缓存 561

19.3.1 SIP存储缓冲的结构定义 561

19.3.2 SIP存储缓冲的处理函数 565

19.4 SIP网络协议栈的网络接口层 567

19.4.1 SIP网络接口层的架构 568

19.4.2 SIP网络接口层的数据结构 568

19.4.3 SIP网络接口层的初始化函数 570

19.4.4 SIP网络接口层的输入函数 571

19.4.5 SIP网络接口层的输出函数 574

19.5 SIP网络协议栈的ARP层 577

19.5.1 SIP地址解析层的架构 577

19.5.2 SIP地址解析层的数据结构 577

19.5.3 SIP地址解析层的映射表 579

19.5.4 SIP地址解析层的ARP映射表维护函数 580

19.5.5 SIP地址解析层的ARP网络报文构建函数 581

19.5.6 SIP地址解析层的ARP网络报文收发处理函数 583

19.6 SIP网络协议栈的IP层 586

19.6.1 SIP网际协议层的架构 586

19.6.2 SIP网际协议层的数据结构 587

19.6.3 SIP网际协议层的输入函数 589

19.6.4 SIP网际协议层的输出函数 593

19.6.5 SIP网际协议层的分片函数 594

19.6.6 SIP网际协议层的分片组装函数 595

19.7 SIP网络协议栈的ICMP层 599

19.7.1 SIP控制报文协议的数据结构 599

19.7.2 SIP控制报文协议的协议支持 600

19.7.3 SIP控制报文协议的输入函数 601

19.7.4 SIP控制报文协议的回显应答函数 602

19.8 SIP网络协议栈的UDP层 603

19.8.1 SIP数据报文层的数据结构 603

19.8.2 SIP数据报文层的控制单元 603

19.8.3 SIP数据报文层的输入函数 605

19.8.4 SIP数据报文层的输出函数 606

19.8.5 SIP数据报文层的建立函数 606

19.8.6 SIP数据报文层的释放函数 607

19.8.7 SIP数据报文层的绑定函数 607

19.8.8 SIP数据报文层的发送数据函数 608

19.8.9 SIP数据报文层的校验和计算 609

19.9 SIP网络协议栈的协议无关层 610

19.9.1 SIP协议无关层的系统架构 611

19.9.2 SIP协议无关层的函数形式 611

19.9.3 SIP协议无关层的接收数据函数 612

19.10 SIP网络协议栈的BSD接口层 613

19.10.1 SIP用户接口层的架构 613

19.10.2 SIP用户接口层的套接字建立函数 613

19.10.3 SIP用户接口层的套接字关闭函数 614

19.10.4 SIP用户接口层的套接字绑定函数 614

19.10.5 SIP用户接口层的套接字连接函数 615

19.10.6 SIP用户接口层的套接字接收数据函数 615

19.10.7 SIP用户接口层的发送数据函数 616

19.11 SIP网络协议栈的编译 617

19.11.1 SIP的文件结构 617

19.11.2 SIP的Makefile 618

19.11.3 SIP的编译运行 618

19.12小结 618

第20章 一个简单防火墙的例子SIPFW 620

20.1 SIPFW防火墙的功能描述 620

20.1.1 SIPFW防火墙对主机进行网络数据过滤的功能描述 620

20.1.2 SIPFW防火墙用户设置防火墙规则的功能描述 621

20.1.3 SIPFW防火墙配置文件等附加功能的功能描述 621

20.2 SIPFW需求分析 621

20.2.1 SIPFW防火墙条件和动作 621

20.2.2 SIPFW防火墙支持过滤的类型和内容 622

20.2.3 SIPFW防火墙过滤的方式和动作 625

20.2.4 SIPFW防火墙的配置文件 626

20.2.5 SIPFW防火墙命令行配置格式 627

20.2.6 SIPFW防火墙的规则文件格式 628

20.2.7 SIPFW防火墙的日志文件数据格式 630

20.2.8 SIPFW防火墙构建所采用的技术方案 630

20.3使用netlink进行用户空间和内核空间数据交互 631

20.3.1 netlink的用户空间程序设计 632

20.3.2 netlink的内核空间API 635

20.4使用proc进行内存数据用户空间映射 637

20.4.1 proc虚拟文件系统的结构 637

20.4.2创建proc虚拟文件 638

20.4.3删除proc虚拟文件 639

20.4.4 proc文件的写函数 639

20.4.5 proc文件的读函数 640

20.5内核空间的文件操作函数 641

20.5.1内核空间的文件结构 641

20.5.2内核空间的文件建立操作 641

20.5.3内核空间的文件读写操作 642

20.5.4内核空间的文件关闭操作 643

20.6 SIPFW防火墙的模块分析和设计 644

20.6.1 SIPFW防火墙的总体架构 644

20.6.2 SIPFW防火墙的用户命令解析 645

20.6.3 SIPFW用户空间与内核空间的交互 649

20.6.4 SIPFW防火墙内核链上的规则处理 651

20.6.5 SIPFW防火墙的PROC虚拟文件系统 654

20.6.6 SIPFW防火墙的配置文件和日志文件处理 655

20.6.7 SIPFW防火墙的过滤模块设计 657

20.7 SIPFW防火墙各功能模块的实现 660

20.7.1 SIPFW防火墙的命令解析代码 660

20.7.2 SIPFW防火墙的过滤规则解析模块代码 664

20.7.3 SIPFW防火墙的网络数据拦截模块代码 666

20.7.4 SIPFW防火墙的PROC虚拟文件系统 668

20.7.5 SIPFW防火墙对配置文件的解析 670

20.7.6 SIPFW防火墙内核模块初始化和退出 671

20.7.7用户空间处理主函数 672

20.8编译、调试和测试 673

20.8.1用户程序和内核程序的Makefile 673

20.8.2编译及运行 674

20.8.3下发过滤规则,测试过滤结果 674

20.9小结 676