Linux網絡程序設計 基於龍芯平臺
趙洪 李兆斌 魏占禎
相關主題
商品描述
本書著重闡述基於龍芯平臺(龍芯CPU和Loongnix操作系統)的網絡程序開發。本書首先介紹龍芯平臺下的C語言編譯工具鏈,包括Loongnix操作系統的安裝、Loongnix操作系統的基本使用方法、Loongnix操作系統中C語言的編程工具和代碼管理工具Git;然後介紹在龍芯平臺上基於編譯工具鏈編寫網絡程序的相關知識,包括網絡程序的基本原理,套接字應用程序接口的基本使用方法,多線程、多進程和I/O復用網絡程序的編程方法,原始套接字的編程方法;最後通過一個綜合性的網絡軟件項目案例,介紹使用Qt編寫圖形界面的網絡程序的基本方法。
本書適合作為應用型普通高校的電子信息類專業、電腦科學與技術等專業的教材,也可作為高職院校相關專業的擴展教材。自主信息技術領域的相關技術人員也可將本書用作網絡程序開發的參考資料。
作者簡介
赵洪
从 2004 年起在北京电子科技学院负责“通信软件设计”“网络安全与保密技术”等课程的教学工作,有近 20 年的教学经验。曾带领技术团队完成了多个产品的研制和产业化,有丰富的软件开发经验。2014 年起,主持或参与了多个重要信创项目攻关及标准制定工作,为信创做出了自己的贡献。
李兆斌
北京电子科技学院副教授,长期从事计算机网络、通信安全方面的教学工作,负责“计算机网络安全实践”“IP 通信互联技术”等课程的教学。主持或参与了多个信创相关课题,有丰富的工程实践经验。
魏占祯
北京电子科技学院教授,长期从事通信网络、信息安全方面的教学和科研工作,多次获得省部级科技进步奖。近年来参与了信创领域的多项工作,有丰富的信创工程科研经验。
目錄大綱
目 錄
第 1章 信創平臺概述 1
1.1 信創CPU簡介 1
1.1.1 龍芯CPU 1
1.1.2 其他信創CPU 2
1.2 Linux及信創操作系統 3
1.2.1 Linux操作系統簡介 3
1.2.2 Linux與Windows的差異 3
1.2.3 常見的Linux發行版 4
1.2.4 信創操作系統 5
第 2章 龍芯信創平臺 7
2.1 龍芯桌面電腦硬件平臺 7
2.2 Loongnix操作系統 8
2.3 Loongnix操作系統使用入門 12
2.3.1 常用命令 12
2.3.2 應用軟件安裝與卸載 23
2.3.3 Vim編輯器基本使用方法 25
第3章 信創平臺C語言編程環境 28
3.1 GCC與GDB 28
3.1.1 編譯的基本概念 28
3.1.2 編譯應用程序 32
3.1.3 編譯靜態鏈接庫 34
3.1.4 編譯動態鏈接庫 35
3.1.5 使用GDB調試代碼 42
3.2 Makefile基礎 45
3.2.1 Makefile基本語法 45
3.2.2 使用變量與模式匹配 47
3.2.3 在Makefile文件中指定搜索路徑 49
3.2.4 Makefile文件中基本函數的使用 50
3.2.5 簡單的Makefile模板 51
3.3 CMake基礎 53
3.3.1 CMake基本語法 53
3.3.2 使用CMake編譯應用程序 56
3.3.3 使用CMake編譯動態鏈接庫 58
3.4 使用VSCode開發C程序 60
3.4.1 VSCode常用插件及設置 60
3.4.2 在VSCode中應用Makefile編譯代碼 61
3.4.3 在VSCode中使用CMake編譯代碼 62
3.4.4 VSCode中調試C程序的基本方法 63
3.4.5 在VSCode中應用代碼規範格式化工具 65
第4章 使用Git管理代碼 66
4.1 Git概述 66
4.1.1 Git代碼版本控制概述 66
4.1.2 集中式和分佈式版本控制系統 67
4.1.3 Git的基本結構 67
4.2 Git基本操作 68
4.2.1 Git安裝與初始設置 68
4.2.2 保存代碼到Git倉庫 69
4.2.3 Git的基本工作流程 75
4.3 Git分支 76
4.3.1 分支的創建與切換 76
4.3.2 切換分支的註意事項 80
4.3.3 分支合並 88
4.3.4 分支變基 99
4.4 Git遠程倉庫和遠程分支 102
4.4.1 遠程倉庫賬戶創建及密鑰配置 102
4.4.2 創建遠程倉庫 103
4.4.3 使用變基重做 110
4.4.4 代碼管理工作流程 114
第5章 網絡編程基礎 118
5.1 網絡程序及其基本要素 118
5.2 網絡通信協議 118
5.2.1 分層模型 118
5.2.2 TCP/IP 120
5.3 網絡通信地址 124
5.3.1 MAC地址 125
5.3.2 IP地址 125
5.4 應用標識 127
5.4.1 埠號 127
5.4.2 埠號分配及常用埠號 128
5.5 進程的網絡地址 128
5.5.1 三元組(半相關) 128
5.5.2 五元組(全相關) 129
5.6 網絡程序的基本模式 129
5.6.1 客戶端/服務器模式 129
5.6.2 瀏覽器/服務器模式 129
5.6.3 兩種模式的對比 129
第6章 套接字編程 131
6.1 套接字概述 131
6.1.1 應用程序接口 131
6.1.2 發展歷程 131
6.1.3 套接字通信的基礎流程 132
6.2 編寫“hello,world!”通信服務器程序 133
6.2.1 查詢函數文檔 133
6.2.2 創建套接字 133
6.2.3 綁定地址信息 135
6.2.4 建立套接字連接 138
6.2.5 發送消息 140
6.2.6 關閉套接字 142
6.3 編寫“hello,world!”通信客戶端程序 142
6.3.1 發送連接請求 142
6.3.2 接收消息 143
6.4 運行“hello,world!”程序 144
6.5 完善“hello,world!”程序 144
6.5.1 通過命令行輸入服務器信息 144
6.5.2 優化錯誤處理 145
6.5.3 通過設置套接字選項解除地址被使用 145
6.5.4 循環實現服務器功能 148
6.5.5 使用shutdown()函數關閉套接字 149
6.5.6 使用多文件實現檢錯代碼 149
6.6 編寫TCP“回聲”程序 150
6.6.1 “回聲”的邏輯與實現 150
6.6.2 “回聲”程序中的隱患—“粘包” 152
6.6.3 基於TCP的應用層協議設計 152
6.7 編寫UDP“回聲”程序 154
6.7.1 sendto()函數和recvfrom()函數 154
6.7.2 實現UDP的“回聲”程序 156
6.7.3 UDP通信使用connect()函數註冊地址信息 157
第7章 多線程網絡程序 159
7.1 線程概述 159
7.1.1 操作系統、進程和線程之間的關系 159
7.1.2 進程和線程之間的關系 159
7.2 線程的創建與銷毀 160
7.2.1 線程創建函數 160
7.2.2 線程銷毀函數 162
7.3 線程同步方法 165
7.3.1 多線程同步問題 165
7.3.2 使用互斥量實現線程同步 167
7.3.3 使用信號量實現線程同步 168
7.4 編寫多線程聊天室程序 171
7.4.1 使用多線程實現服務器的並發 172
7.4.2 實現轉發消息到所有客戶端 174
7.4.3 斷開與對應客戶端的連接 175
7.4.4 正確實現線程同步 176
7.4.5 實現聊天室客戶端程序 177
7.4.6 代碼優化 179
第8章 多進程網絡程序 181
8.1 進程概述 181
8.1.1 進程ID 181
8.1.2 父進程和子進程 182
8.2 進程的創建與銷毀 183
8.2.1 創建進程 183
8.2.2 銷毀進程 184
8.2.3 進程退出 187
8.2.4 “僵屍”進程 188
8.2.5 使用異步方式銷毀“僵屍”進程 190
8.3 多進程“回聲”程序實現 195
8.3.1 服務器多進程的實現 195
8.3.2 “僵屍”進程的處理方法 198
8.3.3 使用多進程實現客戶端的讀、寫功能分離 200
8.4 使用管道實現進程間通信 201
8.4.1 管道的使用方法 201
8.4.2 管道通信應用到多進程網絡程序中 204
第9章 I/O復用套接字編程 206
9.1 I/O復用概述 206
9.2 使用select()函數實現I/O復用 207
9.2.1 select()函數 207
9.2.2 文件集合的基本操作函數 207
9.2.3 select()函數調用流程 208
9.3 使用select()函數實現服務器並發 210
9.3.1 使用select()函數監聽套接字 210
9.3.2 使用select()函數監聽通信套接字 211
9.3.3 並發服務器代碼執行情況 212
9.4 epoll基本使用方法 213
9.4.1 epoll與select()函數的差異 213
9.4.2 epoll的基本操作函數 214
9.5 使用epoll實現並發服務器 216
9.5.1 使用epoll處理監聽套接字 216
9.5.2 使用epoll處理通信套接字 216
9.6 epoll的邊緣觸發與條件觸發 218
9.6.1 邊緣觸發與條件觸發的概念 218
9.6.2 邊緣觸發下的數據讀、寫方法 218
9.6.3 3種並發實現方法的簡單比較 220
第 10章 套接字編程補充 221
10.1 域名與IP地址 221
10.1.1 域名與DNS 221
10.1.2 ICP備案 222
10.1.3 編程中域名與IP地址的轉換 222
10.2 其他I/O函數 225
10.2.1 recv()與send()函數 225
10.2.2 發送與接收帶外數據 227
10.2.3 writev()與readv()函數 228
10.3 多播與廣播的實現 229
10.3.1 多播與廣播的概念 229
10.3.2 多播數據發送與接收 229
10.3.3 廣播數據發送與接收 230
第 11章 原始套接字 232
11.1 原始套接字概述 232
11.2 原始套接字編程簡介 233
11.2.1 原始套接字創建 233
11.2.2 原始套接字發送與接收數據包 234
11.2.3 原始套接字涉及的數據包結構 235
11.3 鏈路層原始套接字 239
11.3.1 鏈路層原始套接字的發送流程 239
11.3.2 ARP數據包發送樣例 243
11.3.3 鏈路層原始套接字的接收流程 245
11.3.4 鏈路層原始套接字抓包程序樣例 246
11.4 網絡層原始套接字 248
11.4.1 網絡層原始套接字的發送流程 248
11.4.2 使用ping工具發送ICMP數據包樣例 250
11.4.3 網絡層原始套接字的接收流程 252
11.4.4 使用ping工具接收ICMP數據包樣例 253
11.5 pcap簡介 255
11.5.1 pcap概述 255
11.5.2 pcap抓包流程 255
11.5.3 設置過濾條件 258
11.5.4 pcap抓包樣例 260
第 12章 綜合運用案例 262
12.1 實現簡單的Web服務器 262
12.1.1 多線程Web服務器實現 262
12.1.2 HTTP簡介 264
12.1.3 HTTP請求和響應報文結構 264
12.1.4 HTTP請求處理和返回HTTP響應 267
12.2 實現遠程過程調用 270
12.2.1 遠程過程調用簡介 270
12.2.2 遠程接口調用協議設計 271
12.2.3 遠程調用服務實現 272
12.2.4 遠程殼函數庫的實現 274
12.3 使用Qt實現網絡程序 278
12.3.1 Qt編程環境的安裝及設置 278
12.3.2 面向對象編程與Qt中的信號與槽機制 282
12.3.3 基於對話框的Qt圖形界面實現 286
12.3.4 QSocket相關類的使用方法 290
12.3.5 用Qt實現簡單聊天室客戶端 293
12.3.6 實現簡單聊天室服務器 301