本书主要介绍使用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错误代码
参考文献