Linux網絡編程(第3版)

宋敬彬

  • 出版商: 清華大學
  • 出版日期: 2024-04-01
  • 售價: $954
  • 貴賓價: 9.5$906
  • 語言: 簡體中文
  • ISBN: 7302660514
  • ISBN-13: 9787302660514
  • 相關分類: Linux
  • 立即出貨 (庫存 < 4)

  • Linux網絡編程(第3版)-preview-1
  • Linux網絡編程(第3版)-preview-2
  • Linux網絡編程(第3版)-preview-3
Linux網絡編程(第3版)-preview-1

買這商品的人也買了...

相關主題

商品描述

本書是獲得大量讀者好評的“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平臺的網絡程序設計人員作為參考讀物。

目錄大綱

(京東、當當目錄請直接傳目錄jpg圖)

 

目錄

  

第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

 

Linux網絡編程(第3版)

  

目錄

  

·VI·

  

  

·IX·