
本书遵循理论与实践相结合的教学目的,以实例讲解在Windows环境下如何开发网络应用程序的方法。全书共分7章:第1章介绍网络编程的一些基本概念;第2章介绍套接字的基本概念以及Windows Socket的内容;第3~5章分别介绍流式套接字、数据报套接字和原始套接字的编程原理,并用实例详细介绍如何开发相应的网络应用程序;第6章介绍常见的应用层协议(如FTP、SMTP、HTTP、MQTT)和WinInet的内容,并用实例描述如何编写基于应用层协议的网络应用程序;第7章介绍使用广泛的WinPcap的概念,以及如何用WinPcap开发相关网络应用程序。本书的特点是有大量的实例源代码及详细解析。
本书主要供普通高校计算机、信息安全、通信工程等专业的师生使用,也可供对网络编程感兴趣的各类人员自学使用。
前 言
互联网的普及和发展给人们日常生活带来了极大的便利,它呈现了一个高度便捷的信息网络环境,能联网的设备也不局限于计算机,而是扩展到了手机、家用电器、可穿戴设备等多种产品,这是一个一切皆TCP/IP的网络时代!这就对网络编程开发人员提出了新的要求,通过本书内容的学习,读者可以在了解TCP/IP的相关协议基础上掌握Socket编程。
本书主要介绍在Windows环境下如何开发网络应用程序,并用实例来介绍开发方法。全书共分7章:第1章介绍网络编程的一些基本概念,并用实例介绍如何获取计算机网络的基本信息。第2章阐述套接字的基本概念,重点介绍Windows环境下的套接字实现Windows Sockets。第3章介绍了流式套接字的编程原理,用实例介绍如何实现阻塞流式套接字和非阻塞流式套接字的网络应用程序,并分析两者之间的差别;还介绍了Windows下多线程编程的方法。第4章介绍了数据报套接字的编程原理,用实例介绍如何实现连接模式和非连接模式的数据报套接字网络应用程序。第5章介绍了原始套接字的基本概念和编程原理,分析了原始套接字和标准套接字(流式套接字、数据报套接字)的区别,用实例介绍如何用原始套接字开发有些特殊功能的网络应用程序。第6章介绍常见的应用层协议(如FTP、SMTP、HTTP、MQTT)和WinInet的内容,并用实例描述如何编写基于应用层协议的网络应用程序。第7章介绍了使用广泛的WinPcap的概念,以及如何用WinPcap开发相关网络应用程序。
本书提供了PPT课件、使用Visual Studio 开发的Visual C++应用程序源代码等辅助教学资源。本书的特点是有大量实例的源代码以及详细解析。配套示例源码下载请扫描右边维码获得,如果下载有问题,请联系booksaga@126.com,邮件主题为“网络程序设计应用教程”。
本书是编者根据多年网络应用程序开发和相关课程教学的经验逐步形成的,但由于网络技术的快速发展,加之作者水平有限,疏漏和错误之处在所难免,恳请读者和有关专家不吝赐教。
编 者
2019年7月
目 录
第1章 网络编程基础 1
1.1 计算机网络基础 1
1.1.1 计算机协议及协议分层 1
1.1.2 网络寻址方式 4
1.2 网络应用程序特点及类型 6
1.3 网络通信模型 7
1.4 客户端/服务器模型 8
1.4.1 客户端和服务器的关系 9
1.4.2 服务器的关键点 10
1.5 其他常见通信模型 11
1.6 网络数据 13
1.6.1 字节顺序 14
1.6.2 结构的对齐 14
1.7 NetBIOS 16
1.8 编程实现计算机网络基本信息查询 17
1.8.1 问题 17
1.8.2 实现方法 17
1.8.3 具体实现 17
1.9 习题 22
第2章 套接字基础 23
2.1 TCP/IP协议软件接口 23
2.2 套接字 24
2.2.1 套接字编程接口的起源与发展 24
2.2.2 套接字的抽象概念 24
2.2.3 套接字接口的特点和内容 25
2.3 Windows套接字 26
2.3.1 Windows Sockets规范 26
2.3.2 WinSock头文件和库文件 27
2.3.3 WinSock API 27
2.3.4 WinSock初始化 29
2.3.5 错误检查和处理 30
2.3.6 WinSock的地址描述 30
2.3.7 创建套接字 33
2.4 套接字选项和I/O控制命令 33
2.4.1 套接字选项 33
2.4.2 I/O控制命令 38
2.5 套接字的I/O模式 39
2.5.1 网络通信中的I/O等待 40
2.5.2 套接字的I/O模式 40
2.6 习题 43
第3章 流式套接字编程 44
3.1 TCP传输协议 44
3.1.1 TCP报文格式 44
3.1.2 TCP协议的传输特点 45
3.1.3 TCP连接的建立与关闭 46
3.2 流式套接字的编程模型 48
3.2.1 流式套接字的通信流程 48
3.2.2 流式套接字的编程模式 49
3.3 相关套接字函数 52
3.3.1 创建和关闭套接字 52
3.3.2 绑定地址 54
3.3.3 监听套接字 55
3.3.4 连接套接字 56
3.3.5 数据通信 58
3.4 阻塞流式套接字编程实例 59
3.4.1 问题 59
3.4.2 实现方法 60
3.4.3 基于阻塞流式套接字的服务器实现 60
3.4.4 基于阻塞流式套接字的客户端实现 62
3.5 非阻塞流式套接字编程实例 64
3.5.1 问题 64
3.5.2 实现方法 65
3.5.3 基于非阻塞流式套接字的服务器实现 65
3.5.4 基于非阻塞流式套接字的客户端实现 68
3.6 Windows下的多线程编程 71
3.6.1 线程的创建和终止 71
3.6.2 线程的同步 72
3.6.3 同步对象 73
3.7 基于流式套接字支持多客户端的编程实例 76
3.7.1 问题 76
3.7.2 实现方法 76
3.7.3 基于阻塞流式套接字的多线程服务器的实现 76
3.7.4 基于阻塞流式套接字的多线程客户端的实现 80
3.8 习题 83
第4章 数据报套接字编程 84
4.1 UDP用户数据报协议 84
4.1.1 UDP报文格式 84
4.1.2 UDP协议的传输特点 85
4.2 数据报套接字的编程模型 85
4.2.1 数据报套接字的通信流程 86
4.2.2 数据报套接字的编程模式 87
4.3 相关套接字函数 89
4.3.1 创建和关闭套接字 89
4.3.2 绑定地址 90
4.3.3 数据通信 90
4.4 数据报套接字编程实例 92
4.4.1 问题 92
4.4.2 实现方法 92
4.4.3 数据报套接字的服务器应用程序的实现 92
4.4.4 数据报套接字的客户端应用程序的实现 94
4.4.5 连接模式下数据报套接字的客户端应用程序的实现 97
4.5 数据报套接字广播通信编程实例 99
4.5.1 问题 99
4.5.2 实现方法 99
4.5.3 数据报套接字广播通信的服务器应用程序的实现 99
4.5.4 数据报套接字广播通信的客户端应用程序的实现 101
4.6 数据报套接字通信可靠性的提高 103
4.6.1 数据报套接字的不可靠问题 103
4.6.2 判断服务器是否启动 104
4.6.3 处理传输中数据报丢失的问题 105
4.6.4 处理接收到的干扰数据 106
4.6.5 流量溢出问题 106
4.7 习题 106
第5章 原始套接字编程 107
5.1 原始套接字简介 107
5.1.1 原始套接字和标准套接字的差别 107
5.1.2 原始套接字的功能 108
5.1.3 原始套接字的应用场合 109
5.2 原始套接字的编程模型 109
5.2.1 原始套接字的通信流程 109
5.2.2 原始套接字的编程模式 110
5.3 相关套接字函数 112
5.3.1 创建和关闭套接字 112
5.3.2 绑定地址 113
5.3.3 数据通信 114
5.4 通过原始套接字实现网络数据包捕获实例 115
5.4.1 问题 115
5.4.2 实现方法 115
5.4.3 IP协议介绍 115
5.4.4 实现网络数据包捕获应用程序 117
5.5 通过原始套接字实现主机连通性检测实例 121
5.5.1 问题 121
5.5.2 实现方法 121
5.5.3 ICMP协议介绍 122
5.5.4 实现主机连通性检测应用程序 123
5.6 习题 130
第6章 应用层网络编程 131
6.1 应用层协议 131
6.1.1 FTP协议 132
6.1.2 SMTP协议 135
6.1.3 POP3协议 138
6.1.4 HTTP协议 140
6.1.5 MQTT协议 144
6.2 WinInet 146
6.2.1 HINTERNET 句柄 147
6.2.2 WinInet函数 148
6.3 Internet应用相关类 156
6.3.1 CInternetSession类 156
6.3.2 CFtpConnection类 159
6.3.3 CHttpConnection类 162
6.3.4 CFtpFileFind类 163
6.4 下载HTTP资源编程实例 164
6.4.1 问题 164
6.4.2 实现方法 164
6.4.3 下载HTTP资源应用程序的实现 164
6.5 发送电子邮件编程实例 168
6.5.1 问题 168
6.5.2 实现方法 168
6.5.3 发送电子邮件应用程序的实现 168
6.6 FTP应用程序编程实例 179
6.6.1 问题 179
6.6.2 实现方法 180
6.6.3 FTP应用程序的实现 180
6.7 主机屏幕监控应用程序编程实例 185
6.7.1 问题 185
6.7.2 位图 185
6.7.3 实现方法 187
6.7.4 主机屏幕监控应用程序服务器的实现 187
6.7.5 主机屏幕监控应用程序客户端的实现 193
6.8 MQTT通信编程实例 197
6.8.1 问题 197
6.8.2 MQTT服务器搭建 197
6.8.3 编程实现MQTT客户端 198
6.9 习题 199
第7章 网络底层编程 200
7.1 WinPcap简介 200
7.2 WinPcap组成 202
7.2.1 WinPcap体系架构 202
7.2.2 网络接口驱动 203
7.2.3 NPF设备驱动 203
7.2.4 Packet.dll 204
7.2.5 Wpcap.dll 204
7.3 WinPcap安装及编程环境配置 205
7.3.1 下载安装WinPcap 205
7.3.2 在Visual Studio下配置WinPcap编程环境 207
7.4 Wpcap.dll中定义的主要数据结构和函数 208
7.4.1 主要数据结构 208
7.4.2 主要函数 209
7.5 Packet.dll的主要数据结构和函数 212
7.5.1 主要数据结构 212
7.5.2 主要函数 214
7.6 使用WinPcap实现网络数据包捕获实例 217
7.6.1 问题 217
7.6.2 实现方法 217
7.6.3 实现网络数据包捕获应用程序 217
7.7 使用WinPcap发送ARP伪装数据包实例 222
7.7.1 问题 222
7.7.2 实现方法 223
7.7.3 ARP协议介绍 223
7.7.4 实现网络发送ARP伪装数据包捕获应用程序 224
7.8 习题 229
本教材是针对《计算机网络》课程后续课程使用的,大多学校学生学习《计算机网络》课程后只是停留在理论层面,而不会实际去编写网络程序。本教材讲从最基本的网络编程起步,指导学生如何进行网络应用程序的编写,也结合一些广泛应用的互联网协议去编写相关的网络应用程序。教材的重点就是提高学生的编程能力,为以后工作打下基础。
曾凡锋,年IT课程(面向对象程序设计、Java程序设计、网络程序设计、Internet与互联网)的教学经验,多年的编程经验,精通C/C++、Java、C#的编程语言,参与多个网络项目的开发(比如北京网通的网络综合管理平台)。获得部级科技进步二等奖2次,三等奖3次。