c 伺服器開發精髓

c 伺服器開發精髓

《c 伺服器開發精髓》是2021年6月電子工業出版社出版的圖書,作者是[漢]張遠龍,本書從作業系統原理角度講解進行C 伺服器開發所需掌握的技術棧。

基本介紹

  • 書名:c 伺服器開發精髓
  • 作者:[漢]張遠龍
  • 出版社:電子工業出版社
  • ISBN:9787121412639
內容簡介,圖書目錄,作者簡介,

內容簡介

本書從作業系統原理角度講解進行C 伺服器開發所需掌握的技術棧。全書總計9章,第1~2章講解C 11/14/17新標準中的常用特性、新增類庫,以及C 開發者必須熟練掌握的開發調試工具鏈;第3~6章詳細講解C 伺服器開發中的多執行緒編程技術、網路編程重難點知識、網路故障調試與排查常用工具,以及通信協定的設計思路、技巧;第7~8章詳細講解一個帶網路通信組件的高性能服務的基本設計思路和注意事項;第9章進一步補充服務相關的常用模組設計思路和方法。本書秉承的思想是,通過掌握技術原理,可以輕鬆製造“輪子”,靈活設計出優雅、魯棒的服務,並快速學習新技術。無論是對於C/C 開發者、計算機專業的學生,還是對於想了解作業系統原理的讀者,本書都極具參考價值。

圖書目錄

第1章 C 必知必會 1
1.1 C RAII慣用法 1
1.1.1 版本1:初的寫法 1
1.1.2 版本2:使用goto語句 3
1.1.3 版本3:使用do...while(0)循環 5
1.1.4 版本4:使用RAII慣用法 7
1.1.5 小結 12
1.2 pimpl慣用法 12
1.3 C 11/14/17新增的實用特性 17
1.4 統一的類成員初始化語法與std::initializer_list<T> 19
1.5 C 17註解標籤(attributes) 24
1.5.1 C 98/03的enumeration和C 11的enumerator 25
1.5.2 C 17的註解標籤 25
1.6 final、override關鍵字和=default、=delete語法 28
1.6.1 final關鍵字 28
1.6.2 override關鍵字 29
1.6.3 =default語法 31
1.6.4 =delete語法 32
1.7 auto關鍵字的用法 34
1.8 Range-based循環語法 35
1.8.1 自定義對象如何支持Range-based循環語法 37
1.8.2 for-each循環的實現原理 38
1.9 C 17結構化綁定 39
1.10 stl容器新增的實用方法 43
1.10.1 原位構造與容器的emplace系列函式 43
1.10.2 std::map的try_emplace方法與insert_or_assign方法 44
1.11 stl 中的智慧型指針類詳解 52
1.11.1 C 98/03的嘗試——std::auto_ptr 52
1.11.2 std::unique_ptr 55
1.11.3 std::shared_ptr 59
1.11.4 std::enable_shared_from_this 61
1.11.5 std::weak_ptr 63
1.11.6 智慧型指針對象的大小 67
1.11.7 使用智慧型指針時的注意事項 68
第2章 C 後端開發的工具和調試知識 71
2.1 SSH工具與FTP工具 71
2.1.1 Xshell 71
2.1.2 FTP 75
2.2 makefile與CMake 76
2.3 使用Visual Studio管理和閱讀開源項目代碼 83
2.4 gdb調試 87
2.4.1 被調試的程式需要帶調試信息 87
2.4.2 啟動gdb調試的方法 89
2.5 gdb常用命令詳解——利用gdb調試Redis 94
2.5.1 gdb常用調試命令概覽和說明 94
2.5.2 用gdb調試Redis前的準備工作 96
2.5.3 run命令 97
2.5.4 continue命令 98
2.5.5 break命令 98
2.5.6 tbreak命令 101
2.5.7 backtrace與frame命令 101
2.5.8 info break、enable、disable、delete命令 102
2.5.9 list命令 104
2.5.10 print與ptype命令 107
2.5.11 info與thread命令 109
2.5.12 next、step、until、finish、return、jump命令 112
2.5.13 disassemble命令 122
2.5.14 set args與show args命令 122
2.5.15 watch命令 123
2.5.16 display命令 124
2.5.17 dir命令 125
2.6 使用gdb調試多執行緒程式 126
2.6.1 調試多執行緒程式的方法 126
2.6.2 在調試時控制執行緒切換 128
2.7 使用gdb調試多進程程式——以調試Nginx為例 137
2.8 gdb實用調試技巧 143
2.8.1 將print輸出的字元串或字元數組完整顯示 144
2.8.2 讓被gdb調試的程式接收信號 144
2.8.3 函式明明存在,添加斷點時卻無效 145
2.8.4 調試中的斷點 146
2.8.5 自定義gdb調試命令 147
2.9 gdb tui——gdb圖形化界面 148
2.9.1 開啟gdb TUI模式 149
2.9.2 gdb TUI模式下的4個視窗 149
2.9.3 解決tui視窗不自動更新內容的問題 150
2.9.4 視窗焦點切換 150
2.10 gdb的升級版——cgdb 151
2.11 使用VisualGDB調試 154
2.11.1 使用VisualGDB調試已經運行的程式 155
2.11.2 使用VisualGDB從頭調試程式 156
第3章 多執行緒編程與資源同步 159
3.1 執行緒的基本概念及常見問題 159
3.1.1 主執行緒退出,支執行緒也將退出嗎 159
3.1.2 某個執行緒崩潰,會導致進程退出嗎 160
3.2 執行緒的基本操作 160
3.2.1 創建執行緒 160
3.2.2 獲取執行緒ID 166
3.2.3 等待執行緒結束 173
3.3 慣用法:將C 類對象實例指針作為執行緒函式的參數 178
3.4 整型變數的原子操作 184
3.4.1 為什麼給整型變數賦值不是原子操作 185
3.4.2 Windows平台上對整型變數的原子操作 186
3.4.3 C 11對整型變數原子操作的支持 187
3.5 Linux執行緒同步對象 190
3.5.1 Linux互斥體 190
3.5.2 Linux信號量 198
3.5.3 Linux條件變數 202
3.5.4 Linux讀寫鎖 208
3.6 Windows執行緒同步對象 217
3.6.1 WaitForSingleObject與WaitForMultipleObjects函式 217
3.6.2 Windows臨界區對象 219
3.6.3 Windows Event對象 224
3.6.4 Windows Mutex對象 229
3.6.5 Windows Semaphore對象 231
3.6.6 Windows讀寫鎖 235
3.6.7 Windows條件變數 238
3.6.8 在多進程之間共享執行緒同步對象 243
3.7 C 11/14/17執行緒同步對象 244
3.7.1 std::mutex系列 244
3.7.2 std::shared_mutex 248
3.7.3 std::condition_variable 253
3.8 如何確保創建的執行緒一定能運行 256
3.9 多執行緒使用鎖經驗總結 258
3.9.1 減少鎖的使用次數 258
3.9.2 明確鎖的範圍 259
3.9.3 減少鎖的使用粒度 259
3.9.4 避免死鎖的一些建議 260
3.9.5 避免活鎖的一些建議 262
3.10 執行緒局部存儲 262
3.10.1 Windows的執行緒局部存儲 262
3.10.2 Linux的執行緒局部存儲 264
3.10.3 C 11 的 thread_local 關鍵字 267
3.11 C庫的非執行緒安全函式 268
3.12 執行緒池與佇列系統的設計 270
3.12.1 執行緒池的設計原理 270
3.12.2 環形佇列 275
3.12.3 訊息中間件 275
3.13 纖程(Fiber)與協程(Routine) 277
3.13.1 纖程 277
3.13.2 協程 280
第4章 網路編程重難點解析 282
4.1 學習網路編程時應該掌握的socket函式 282
4.1.1 在Linux上查看socket函式的幫助信息 283
4.1.2 在Windows上查看socket函式的幫助信息 285
4.2 TCP網路通信的基本流程 286
4.3 設計跨平台網路通信庫時的一些socket函式用法 290
4.3.1 socket數據類型 290
4.3.2 在Windows上調用socket函式 290
4.3.3 關閉socket函式 291
4.3.4 獲取socket函式的錯誤碼 291
4.3.5 套接字函式的返回值 293
4.3.6 select函式第1個參數的問題 293
4.3.7 錯誤碼WSAEWOULDBLOCK和EWOULDBLOCK 294
4.4 bind函式重難點分析 294
4.4.1 對bind函式如何選擇綁定地址 294
4.4.2 bind函式的連線埠號問題 295
4.5 select函式的用法和原理 302
4.5.1 Linux上的select函式 302
4.5.2 Windows上的select函式 317
4.6 socket的阻塞模式和非阻塞模式 318
4.6.1 如何將socket設定為非阻塞模式 318
4.6.2 send和recv函式在阻塞和非阻塞模式下的表現 320
4.6.3 非阻塞模式下send和recv函式的返回值總結 331
4.6.4 阻塞與非阻塞socket的各自適用場景 333
4.7 傳送0位元組數據的效果 333
4.8 connect函式在阻塞和非阻塞模式下的行為 339
4.9 連線時順便接收第1組數據 343
4.10 如何獲取當前socket對應的接收緩衝區中的可讀數據量 346
4.10.1 分析 346
4.10.2 注意事項 350
4.11 Linux EINTR錯誤碼 351
4.12 Linux SIGPIPE信號 352
4.13 Linux poll 函式的用法 353
4.14 Linux epoll模型 361
4.14.1 基本用法 361
4.14.2 epoll_wait與poll函式的區別 363
4.14.3 LT 模式和ET 模式 363
4.14.4 EPOLLONESHOT 選項 380
4.15 高效的readv和writev函式 386
4.16 主機位元組序和網路位元組序 387
4.16.1 主機位元組序 387
4.16.2 網路位元組序 388
4.16.3 作業系統提供的位元組轉換函式匯總 389
4.17 域名解析API介紹 390
第5章 網路通信故障排查常用命令 397
5.1 ifconfig命令 397
5.2 ping命令 401
5.3 telnet命令 402
5.4 netstat命令 407
5.5 lsof命令 409
5.6 nc命令 412
5.7 curl命令 415
5.8 tcpdump命令 416
第6章 網路通信協定設計 422
6.1 理解TCP 422
6.2 如何解決粘包問題 423
6.3 解包與處理 425
6.4 從struct到TLV 430
6.4.1 協定的演化 430
6.4.2 協定的分類 434
6.4.3 協定設計工具 434
6.5 整型數值的壓縮 435
6.6 設計通信協定時的注意事項 437
6.6.1 位元組對齊 437
6.6.2 顯式地指定整型欄位的長度 438
6.6.3 涉及浮點數時要考慮精度問題 438
6.6.4 大小端問題 438
6.6.5 協定與自動升級功能 438
6.7 包分片 439
6.8 XML與JSON格式的協定 444
6.9 一個自定義協定示例 445
6.10 理解HTTP 460
6.10.1 HTTP格式介紹 460
6.10.2 GET與POST方法 461
6.10.3 HTTP chunk編碼 465
6.10.4 HTTP客戶端的編碼實現 466
6.10.5 HTTP服務端的實現 466
6.10.6 HTTP與長連線 471
6.10.7 libcurl 471
6.10.8 Restful接口與Java Spring MVC 477
6.11 SMTP、POP3與郵件客戶端 478
6.11.1 郵件協定簡介 478
6.11.2 SMTP 479
6.11.3 POP3 494
6.11.4 郵件客戶端 499
6.12 WebSocket協定 499
6.12.1 WebSocket協定的握手過程 500
6.12.2 WebSocket協定的格式 503
6.12.3 WebSocket協定的壓縮格式 506
6.12.4 WebSocket協定裝包與解包示例 508
6.12.5 解析握手協定 512
第7章 單個服務的基本結構 515
7.1 網路通信組件的效率問題 515
7.1.1 高效網路通信框架的設計原則 515
7.1.2 連線的被動關閉與主動關閉 519
7.1.3 長連線和短連線 519
7.2 原始的伺服器結構 520
7.3 一個連線對應一個執行緒模型 522
7.4 Reactor模式 523

作者簡介

本人有一個千人的技術QQ群,群成員為C 伺服器開發相關學習者及同行;另外是技術公眾號【高性能伺服器開發】的維護者,目前冬粉8000左右。另有CSDN部落格、個人站點也可用於宣傳。

熱門詞條

聯絡我們