Linux C/C++ 服務器開發實踐
內容描述
本書較為全面地介紹了基於Linux網絡編程的基礎知識和編程技術,章節安排貼近企業項目需求,對基於Linux C/C++語言的多線程編程和Linux操作系統支持的網絡庫函數等進行講解,由易到難,逐層遞進。 本書共分12章,內容包括網絡概述、網絡基礎概念、套接字、TCP編程、UDP編程、原始套接字編程、網絡I/O模型、服務器設計,以及四大綜合實踐項目(HTTP服務器、FTP服務器、並發聊天服務器與C/S和P2P聯合架構的並發游戲服務器),通過項目練習幫助讀者鞏固所學的編程技術。 本書適合具有Linux C/C++編程基礎、需要掌握Linux服務器編程的開發人員閱讀,也適合高等院校和培訓學校電腦軟件開發相關專業的師生作為參考用書。
目錄大綱
目 錄
第1章 TCP/IP基礎 1
1.1 TCP/IP協議的分層結構 1
1.2 應用層 5
1.2.1 DNS 5
1.2.2 埠 6
1.3 傳輸層 6
1.3.1 TCP協議 6
1.3.2 UDP協議 7
1.4 網絡層 7
1.4.1 IP協議 7
1.4.2 ARP協議 13
1.4.3 RARP協議 15
1.4.4 ICMP協議 16
1.5 數據鏈路層 24
1.5.1 數據鏈路層的基本概念 24
1.5.2 數據鏈路層主要功能 24
第2章 搭建Linux開發環境 26
2.1 準備虛擬機環境 26
2.1.1 在VMware下安裝Linux 26
2.1.2 開啟root賬戶 29
2.1.3 關閉防火牆 30
2.1.4 安裝網絡工具包 30
2.1.5 啟用SSH 31
2.1.6 拍攝快照 32
2.1.7 連接虛擬機Linux 32
2.1.8 和虛擬機互傳文件 43
2.2 搭建Linux下C/C++開發環境 44
2.3 搭建Windows下Linux C/C++開發環境 45
2.3.1 Windows下非集成式的Linux C/C++開發環境 45
2.3.2 Windows下集成式的Linux C/C++開發環境 48
第3章 多線程基本編程 52
3.1 使用多線程的好處 52
3.2 多線程編程的基本概念 53
3.2.1 操作系統和多線程 53
3.2.2 線程的基本概念 54
3.2.3 線程的狀態 54
3.2.4 線程函數 55
3.2.5 線程標識 55
3.2.6 C++多線程開發的兩種方式 55
3.3 利用POSIX多線程API函數進行多線程開發 56
3.3.1 線程的創建 56
3.3.2 線程的屬性 61
3.3.3 線程的結束 72
3.3.4 線程退出時的清理機會 79
3.4 C++11中的線程類 85
3.4.1 線程的創建 86
3.4.2 線程的標識符 93
3.4.3 當前線程this_thread 94
3.5 線程同步 97
3.5.1 同步的基本概念 98
3.5.2 臨界資源和臨界區 102
3.6 基於POSIX進行線程同步 102
3.6.1 互斥鎖 102
3.6.2 讀寫鎖 108
3.6.3 條件變量 115
3.7 C++11/14中的線程同步 121
3.7.1 基本互斥鎖std::mutex 122
3.7.2 定時互斥鎖std::time_mutex 123
3.8 線程池 125
3.8.1 線程池的定義 125
3.8.2 使用線程池的原因 125
3.8.3 基於POSIX實現線程池 126
3.8.4 基於C++11實現線程池 131
第4章 TCP服務器編程 136
4.1 套接字的基本概念 136
4.2 網絡程序的架構 137
4.3 IP地址的格式轉換 138
4.4 套接字的類型 139
4.5 套接字地址 140
4.5.1 通用socket地址 140
4.5.2 專用socket地址 141
4.5.3 獲取套接字地址 142
4.6 主機字節序和網絡字節序 144
4.7 協議族和地址族 146
4.8 TCP套接字編程的基本步驟 149
4.9 TCP套接字編程的相關函數 149
4.9.1 BSD socket的頭文件 149
4.9.2 socket函數 150
4.9.3 bind函數 151
4.9.4 listen函數 154
4.9.5 accept函數 154
4.9.6 connect函數 155
4.9.7 send函數 155
4.9.8 recv函數 156
4.9.9 close函數 157
4.10 簡單的TCP套接字編程 157
4.11 深入理解TCP編程 161
4.11.1 數據發送和接收涉及的緩沖區 161
4.11.2 TCP數據傳輸的特點 162
4.11.3 數據發送的六種情形 162
4.11.4 數據接收時的情形 163
4.11.5 一次請求響應的數據接收 164
4.11.6 多次請求響應的數據接收 168
4.12 I/O控制命令 179
4.13 套接字選項 182
4.13.1 基本概念 182
4.13.2 選項的級別 182
4.13.3 獲取套接字選項 183
4.13.4 設置套接字選項 187
第5章 UDP服務器編程 190
5.1 UDP套接字編程的基本步驟 190
5.2 UDP套接字編程的相關函數 191
5.2.1 sendto函數 192
5.2.2 recvfrom函數 192
5.3 實戰UDP套接字 192
5.4 UDP丟包及無序問題 198
第6章 原始套接字編程 199
6.1 原始套接字的強大功能 199
6.2 創建原始套接字的方式 201
6.3 原始套接字的基本編程步驟 201
6.3.1 創建原始套接字函數socket 202
6.3.2 接收函數recvfrom 203
6.3.3 發送函數sendto 205
6.4 AF_INET方式捕獲報文 205
6.5 PF_PACKET方式捕獲報文 212
第7章 服務器模型設計 219
7.1 I/O模型 220
7.1.1 基本概念 220
7.1.2 同步和異步 220
7.1.3 阻塞和非阻塞 222
7.1.4 同步與異步和阻塞與非阻塞的關系 224
7.1.5 採用socket I/O模型的原因 224
7.1.6 (同步)阻塞I/O模型 225
7.1.7 (同步)非阻塞式I/O模型 226
7.1.8 (同步)I/O多路復用模型 227
7.1.9 (同步)信號驅動式I/O模型 228
7.1.10 異步I/O模型 228
7.1.11 五種I/O模型比較 229
7.2 (分時)循環服務器 230
7.2.1 UDP循環服務器 230
7.2.2 TCP循環服務器 234
7.3 多進程並發服務器 237
7.4 多線程並發服務器 243
7.5 I/O多路復用的服務器 246
7.5.1 使用場景 247
7.5.2 基於select的服務器 247
7.5.3 基於poll的服務器 255
7.5.4 基於epoll的服務器 262
第8章 網絡性能工具Iperf 271
8.1 Iperf的特點 271
8.2 Iperf的工作原理 271
8.3 Iperf的主要功能 272
8.4 Iperf在Linux下的使用 273
8.4.1 在Linux下安裝Iperf 273
8.4.2 Iperf的簡單使用 274
8.5 Iperf在Windows下的使用 275
8.5.1 命令行版本 275
8.5.2 圖形化版本 276
第9章 HTTP服務器編程 277
9.1 CGI程序的工作方式 277
9.2 架設Web服務器Apache 278
9.3 HTTP的工作原理 281
9.4 HTTP的特點 281
9.5 HTTP的消息結構 282
9.6 客戶端請求消息 282
9.7 服務器響應消息 283
9.8 HTTP狀態碼 284
9.9 HTTP狀態碼分類 284
9.10 實現HTTP服務器 285
9.10.1 邏輯架構 285
9.10.2 程序工作流程 286
9.10.3 主要功能函數 286
9.10.4 工程實現 287
第10章 基於Libevent的FTP服務器 299
10.1 Reactor模式 299
10.1.1 Reactor模式的優點 300
10.1.2 Reactor模式的框架 300
10.1.3 Reactor事件處理流程 302
10.2 使用Libevnet的基本流程 302
10.3 下載和編譯Libevent 304
10.4 FTP概述 305
10.4.1 FTP的工作原理 306
10.4.2 FTP的傳輸方式 306
10.4.3 FTP的工作方式 307
10.4.4 FTP命令 308
10.4.5 FTP應答碼 311
10.5 開發FTP服務器 312
10.6 開發FTP客戶端 318
10.6.1 客戶端需求分析 319
10.6.2 概要設計 319
10.6.3 客戶端工作流程設計 319
10.6.4 實現主界面 319
10.6.5 實現登錄界面 323
10.6.6 實現登錄後的操作界面 323
10.6.7 運行結果 328
第11章 並發聊天服務器 331
11.1 系統平臺的選擇 331
11.1.1 應用系統平臺模式的選擇 331
11.1.2 C/S模式介紹 332
11.1.3 數據庫系統的選擇 333
11.2 系統需求分析 333
11.2.1 即時消息的一般需求 333
11.2.2 即時消息的協議需求 333
11.2.3 即時消息的安全需求 334
11.2.4 即時消息的加密和鑒別 334
11.2.5 即時消息的註冊需求 334
11.2.6 即時消息的通信需求 334
11.3 系統總體設計 334
11.4 即時通信系統的實施原理 335
11.4.1 IM的工作方式 336
11.4.2 IM的基本技術原理 336
11.4.3 IM的通信方式 336
11.5 功能模塊劃分 337
11.5.1 模塊劃分 337
11.5.2 服務器端功能 338
11.5.3 客戶端功能 338
11.5.4 服務器端多線程 338
11.5.5 客戶端多線程 339
11.6 數據庫設計 339
11.6.1 數據庫的選擇 339
11.6.2 準備MySQL環境 340
11.6.3 Linux下的MySQL的C編程 344
11.6.4 聊天系統數據庫設計 350
11.6.5 服務器端設計 351
11.6.6 客戶端設計 359
第12章 C/S和P2P聯合架構的游戲服務器 366
12.1 網絡游戲服務器發展現狀 367
12.2 現有網絡游戲服務器結構 368
12.2.1 C/S結構 368
12.2.2 游戲大廳代理結構 369
12.2.3 P2P結構 369
12.3 P2P網絡游戲技術分析 370
12.4 網絡游戲的同步機制 372
12.4.1 事件一致性 372
12.4.2 時間同步 372
12.5 總體設計 373
12.5.1 服務器系統架構模型 373
12.5.2 傳輸層協議的選擇 376
12.5.3 協議包設計 376
12.6 數據庫設計 378
12.7 服務器端詳細設計和實現 378
12.8 客戶端詳細設計和實現 388
12.8.1 五子棋簡介 388
12.8.2 棋盤類CTable 389
12.8.3 游戲模式類CGame 391
12.8.4 消息機制 393
12.8.5 游戲算法 396