本書主要介紹使用Visual C++基于Windows Socket開發網絡應用程序的方法。全書共分9章。第1章介紹計算機網絡的基本工作原理、網絡程序的工作模式、編程方法等內容;第2章介紹使用Visual C++ 2010開發Windows應用程序的方法;第3-8章由易到難逐步介紹流式套接字、數據報套接字以及原始套接字的編程方法和相關的Windows編程知識,并對網絡通信中的多線程編程、I/O模型以及IP分組的捕獲分析等內容進行深入講解;第9章介紹MFC提供的兩個WinSock類——CAsyncSocket類和CSocket類的使用方法。
隨著計算機網絡技術的飛速發展,以TCP/IP網絡技術為核心的因特網已成為支撐現代社會運行的基礎設施之一,深入理解網絡工作原理、了解網絡協議工作細節、具有扎實的高層次網絡應用開發能力已逐漸成為IT從業者的基本要求。
然而,由于計算機網絡技術復雜而抽象,在高校計算機類專業的人才培養中,單靠“計算機網絡”一門課程的理論教學及相應的協議分析及組網實驗,很難使學生真正理解掌握網絡技術并具備開發以TCP/IP為基礎的網絡應用程序的能力。為此,很多高校的計算機類專業都開設了“TCP/IP套接字(socket)網絡編程”課程,實踐證明,將本課程與網絡原理教學有機結合起來,不僅可以加深學生對網絡原理及實現方法的理解,還可以使學生掌握網絡編程的基本方法,逐步提高網絡軟件開發能力,培養學生的創新精神和自學能力。
本書是作者在長期從事“計算機網絡”和“網絡編程”兩門課程教學的經驗基礎之上,以作者自己編寫的“網絡編程”課程講義為基礎,不斷完善改進而成的。本書以Visual Studio 2010為平臺,通過大量實例,全面系統地介紹基于WinSock進行網絡編程的基本原理、基本方法和必需的知識。學習本書內容之前,要求讀者已學過C++語言程序設計,熟悉面向對象程序設計的概念和方法。
本書在內容組織方面,除WinSock網絡編程本身的原理和方法以及必要的計算機網絡知識外,還有較大的篇幅用于講解Windows編程的基本知識。這是因為目前多數應用型本科的教學都采用了“3+1模式”(前3年完成理論知識教學,最后1年集中實習實踐),導致很多專業課的安排被提前,本課程一般被安排在第五學期甚至是第四學期學習,此時,大多數學生幾乎還不具備Windows程序開發的任何知識和經驗,程序編寫能力不足。根據作者經驗,在講解WinSock編程的同時,詳盡地講解相關的Windows編程的知識和方法,對降低學生學習難度、提高學習興趣是很有幫助的。
全書共分9章,第1章主要介紹計算機網絡的基本概念和基本工作原理,以及網絡程序的工作模式和編程方法等; 第2章介紹使用Visual C++ 2010開發Windows應用程序的方法以及有關概念和基本原理,為后續各章的實例開發打好基礎; 第3~8章由易到難逐步介紹流式套接字、數據報套接字以及原始套接字的編程方法和相關的Windows編程知識,并對網絡通信中的多線程編程、I/O模型以及IP分組的捕獲分析等內容進行深入講解; 第9章介紹MFC提供的兩個WinSock類——CAsyncSocket類和CSocket類的使用方法。
本書系統性強,內容豐富、結構清晰、論述嚴謹,既突出基本原理和技術思想的講解,也強調工程實踐,適合作為網絡工程、計算機科學與技術等計算機類專業的本科生教材,也可供對網絡編程感興趣的讀者參考學習。
本書除兩位署名作者外,李文杰老師和高葵老師也參加了本書部分編寫工作,其中李文杰老師編寫了本書的第2章,高葵老師編寫了本書第5章。另外,感謝山東農業大學計算機系的各位老師對本書的支持。
限于作者的水平和經驗,錯誤與不足之處在所難免,懇請讀者批評指正。
本書的PPT課件及源代碼等配套資源可以從清華大學出版社網站www.tup.com.cn下載。
作者
2015年2月
第1章計算機網絡基礎知識
1.1計算機網絡的概念與原理
1.1.1計算機網絡的基本概念
1.1.2典型的計算機網絡——以太網
1.1.3廣域網與分組交換技術
1.1.4網絡互聯
1.1.5計算機網絡體系結構
1.2IP協議
1.2.1IP地址
1.2.2IPv4的分組結構
1.2.3路由與路由器
1.2.4主機的路由表及IP分組的發送過程
1.2.5ARP協議
1.3TCP與UDP
1.3.1端口號與網絡進程地址
1.3.2TCP協議
1.3.3UDP協議
1.4網絡應用編程接口——套接字
1.4.1套接字編程接口的起源與發展
1.4.2套接字的含義與分類
1.4.3套接字接口的位置及實現方式
1.5網絡應用程序的結構模型
1.6網絡編程的不同層次
習題
第2章簡單的Windows程序設計
2.1Visual C++2010概述
2.2Visual C++的數據類型
2.3Unicode字符集
2.4對話框應用程序
2.4.1對話框應用程序的創建
2.4.2Visual C++2010開發環境
2.4.3MFC對話框應用程序結構
2.4.4設置對話框的屬性
2.5Windows控件
2.5.1創建控件
2.5.2常用控件
2.6Windows的消息驅動機制與消息映射
2.6.1Windows的消息驅動機制
2.6.2消息映射
2.7使用控件變量訪問控制控件
2.8添加用戶自定義消息
2.9MFC的文件操作
2.9.1CFile類
2.9.2CFileDialog類
習題
實驗1創建對話框應用程序及控件使用
第3章WinSock編程初步
3.1WinSock API函數
3.2WinSock開發組件和運行組件
3.3WinSock的網絡地址表示
3.3.1地址結構
3.3.2地址轉換函數
3.4WinSock的錯誤處理
3.5網絡字節順序
3.6網絡配置信息查詢
3.6.1主機名字與IP地址查詢
3.6.2服務查詢
3.6.3協議查詢
3.6.4異步信息查詢函數及其編程方法
習題
實驗2查詢主機網絡配置信息
第4章TCP程序設計
4.1簡單的TCP程序設計
4.1.1TCP客戶端和服務器端的交互過程
4.1.2一個簡單的TCP通信程序
4.2獲取與套接字關聯地址
4.3數據發送和接收的過程
4.3.1發送緩沖區與接收緩沖區
4.3.2send函數的工作過程
4.3.3recv()函數的工作過程
4.4數據傳輸格式
4.5實例: 文件傳輸程序設計
4.5.1簡單的文件傳輸
4.5.2文件的斷點續傳
4.5.3文件的分片傳輸與多點下載
習題
實驗3使用流式套接字傳輸數據
第5章Visual C++中的多線程編程
5.1進程和線程
5.1.1進程和線程
5.1.2線程的概念
5.1.3進程與線程的差別
5.2VC++中的多線程編程
5.2.1使用Win32 SDK函數實現多線程
5.2.2C++運行庫中的多線程函數
5.2.3使用MFC類庫
5.3TCP服務器端程序的多線程編程
5.4線程間的通信
5.5線程的互斥與同步
5.5.1互斥
5.5.2線程的同步
5.6主監控線程和線程池
習題
實驗4TCP服務器端的多線程編程
第6章WinSock的I/O模型
6.1套接字的非阻塞工作模式
6.1.1阻塞與非阻塞模式的概念
6.1.2套接字非阻塞模式的設置方法
6.1.3套接字非阻塞模式下的編程方法
6.2Select模型
6.2.1Select模型的工作機制
6.2.2使用Select模型編程的方法
6.3WSAAsyncSelect模型
6.3.1WSAAsyncSelect()函數
6.3.2WSAAsyncSelect模型的編程方法
6.4WSAEventSelect模型
6.4.1WinSock中的事件對象函數
6.4.2WSAEventSelect模型的函數
6.4.3WSAEventSelect模型的編程方法
6.5重疊I/O模型
6.5.1重疊I/O的概念
6.5.2重疊I/O模型的程序流程
6.6完成端口模型
6.6.1實現完成端口模型的流程
6.6.2工作線程的主要任務
6.6.3關閉阻塞的工作線程
習題
實驗5WinSock的I/O模型
第7章UDP程序設計
7.1數據報套接字編程的基本方法
7.1.1客戶/服務器模式
7.1.2常用的數據收發函數——sendto()與recvfrom()
7.1.3對等模式
7.1.4使用WSAAsyncSelect模型
7.1.5WSASendTo()函數與WSARecvFrom()函數
7.2廣播程序設計
7.2.1套接字選項與setsockopt()函數
7.2.2廣播數據的發送與接收
7.2.3廣播程序流程
習題
實驗6數據報套接字編程
第8章原始套接字編程
8.1原始套接字及其功能
8.2原始套接字的通信流程
8.2.1創建原始套接字
8.2.2使用原始套接字發送和接收數據
8.3收發ICMP數據包
8.4發送自定義的IP分組
8.5捕獲IP數據包
習題
第9章使用MFC的WinSock類編程
9.1CAsyncSocket類
9.1.1CAsyncSocket對象
9.1.2CAsyncSocket類的使用
9.2CSocket類
9.2.1CSocket類概述
9.2.2CArchive類與對象串行化
9.2.3CSocketFile類
9.2.4使用CSocket及串行化方法編寫網絡程序
習題
附錄常見的WinSock錯誤代碼
參考文獻