网络编程实验指导书主 编:赵文栋 徐正芹 李艾静副主编:彭来献 陈 娟 刘 熹参 编:王向东 张 磊 徐任晖书内 容 提 要本书全面系统地介绍了网络编程的基本原理,剖析了网络应用程序实现与套接字实现之间的关联,分析了不同编程方法的实用性和优缺点。另外书中收录了丰富的示例,详细展现了 Linux 和 Windows 平台下套接字编程的共性与个性。特别是从代码角度说明了不同模型服务器端的区别,对开发实践有很大帮助。本书内容丰富、结构清晰、讲解细致、通俗易懂,既突出了基本原理和技术思想,也强调工程实现,可以作为大学本科、专科及高职相关专业的教材,也可作为广大网络应用程序开发人员的参考资料。图书在版编目(CIP)数据网络编程实验指导书 / 赵文栋,徐正芹,李艾静主编 —南京:东南大学出版社,2019 8ISBN 978 7 5641 8491 9Ⅰ ①网… Ⅱ ①赵… ②徐… ③李… Ⅲ ①计算机网络 程序设计 Ⅳ ①TP393中国版本图书馆 CIP 数据核字(2019)第 156570 号网络编程实验指导书Wangluo Biancheng Shiyan Zhidaoshu出版发行 东南大学出版社社 址 南京市四牌楼 2 号(邮编:210096)出 版 人 江建中责任编辑 姜晓乐(joy_supe@ 126.com)经 销 全国各地新华书店印 刷 江苏凤凰数码印务有限公司开 本 787mm×1092 mm 1 / 16印 张 12 25字 数 298 千字版 次 2019 年 8 月第 1 版印 次 2019 年 8 月第 1 次印刷书 号 ISBN 978 7 5641 8491 9定 价 43.00 元本社图书若有印装质量问题,请直接与营销部联系。电话:025—83791830。前 言网络编程是计算机专业一门重要的专业基础课,在学习过程中,学生们普遍反映,难以将所学到的理论知识付诸于具体应用中,鉴于此,我们进行了本实验教材的编写。本实验教材内容循序渐进,由浅入深,是理论教学的深化与补充。本书涵盖了网络编程的基本知识点,并对网络编程、局域网组播、广播等高级应用层网络程序设计作了初步探讨,给出了具有代表性的例子程序。最后,针对理论内容,精心设计了 7 个实验实例,通过学习,学生们不但可以掌握网络编程的常用方法,同时也能更深入地了解为什么这样用,以达到“知其然并知其所以然”。本书分为三个部分。第一部分介绍网络编程的基本概念和知识点,包括 OSI 七层模型、TCP / IP 四层模型、网络通信过程、套接字类型、网络应用程序设计模式、套接字地址结构以及 socket API。第二部分介绍本书所用软件的安装步骤及使用说明,主要有 Visual Studio 2015、Wireshark 及 Eclipse 等。第三部分选取 7 个典型案例,对各知识点进行深入剖析,包括基本 TCP 编程、基本 UDP编程、UDP 广播编程、UDP 组播编程、fork()函数应用编程、select()函数编程、raw socket编程。通过训练后,学生应该达到以下要求:(1)掌握 TCP 套接字、UDP 套接字编程,掌握 UDP 组播、广播编程,掌握 fork()和 select()函数编程及原始套接字编程。(2)能独立设计较简单的网络程序。(3)能独立解决较简单的网络编程问题,具有一定的提出问题、分析分题、解决问题的能力。本实验教材由赵文栋、徐正芹、李艾静、彭来献、陈娟等编写。由于时间仓促及作者水平所限,书中难免存在不妥之处,欢迎各位读者批评指正。作 者2019 年 4 月目 录目 录第一部分 网络编程基本知识第 1 章 网络编程中的基本概念 …………………………………………………………… 0031.1 网络协议与计算机网络体系结构 ………………………………………………… 0031.2 OSI 七层模型………………………………………………………………………… 0041.3 TCP / IP 四层模型 …………………………………………………………………… 0071.4 OSI 参考模型与 TCP / IP 参考模型的比较 ………………………………………… 0091.5 网络通信过程 ……………………………………………………………………… 0101.5.1 网络通信的服务———面向连接的服务与无连接的服务……………………… 0101.5.2 客户端 / 服务器模型 …………………………………………………………… 0121.5.3 客户端 / 服务器的通信过程 …………………………………………………… 014第 2 章 socket API 简介 …………………………………………………………………… 0152.1 socket(套接字)概念 ………………………………………………………………… 0152.2 socket 的初始化……………………………………………………………………… 0162.2.1 基于 Linux 操作系统的初始化 ………………………………………………… 0162.2.2 基于 Windows 操作系统的实现………………………………………………… 0172.3 创建和释放套接字 ………………………………………………………………… 0182.3.1 socket()函数 …………………………………………………………………… 0182.3.2 close ()/ closesocket()函数 …………………………………………………… 0192.4 面向连接的协议(TCP)……………………………………………………………… 0202.4.1 bind()函数……………………………………………………………………… 0202.4.2 listen()函数 …………………………………………………………………… 0212.4.3 accept()函数 …………………………………………………………………… 0232.4.4 connect()函数 ………………………………………………………………… 0242.4.5 send()函数……………………………………………………………………… 0242.4.6 recv()函数 ……………………………………………………………………… 0252.5 无连接协议(UDP) ………………………………………………………………… 0262.5.1 recvfrom()函数 ………………………………………………………………… 0262.5.2 sendto()函数 …………………………………………………………………… 0272.6 端口号 ……………………………………………………………………………… 0282.7 地址转换函数 ……………………………………………………………………… 028001网络编程实验指导书2.7.1 inet_addr()函数………………………………………………………………… 0292.7.2 inet_aton()函数 ………………………………………………………………… 0302.7.3 inet_ntoa()函数 ………………………………………………………………… 0302.7.4 inet_pton()函数 ………………………………………………………………… 0302.7.5 inet_ntop()函数 ………………………………………………………………… 0312.8 网络字节序 ………………………………………………………………………… 0312.8.1 htons()函数 …………………………………………………………………… 0322.8.2 ntohs()函数 …………………………………………………………………… 0322.8.3 htonl()函数 …………………………………………………………………… 0332.8.4 ntohl()函数 …………………………………………………………………… 0332.9 域名解析 …………………………………………………………………………… 0332.9.1 gethostbyname()函数 …………………………………………………………… 0332.9.2 gethostbyaddr()函数 …………………………………………………………… 0342.9.3 getservbyname()函数 …………………………………………………………… 035第 3 章 TCP 流式套接字编程……………………………………………………………… 0363.1 TCP 的传输特点和首部 …………………………………………………………… 0363.1.1 TCP 协议的传输特点…………………………………………………………… 0363.1.2 TCP 的首部……………………………………………………………………… 0363.2 TCP 连接的建立与终止 …………………………………………………………… 0383.3 TCP 通信的几个典型问题 ………………………………………………………… 0393.3.1 滑动窗口 (TCP 流量控制)…………………………………………………… 0393.3.2 TCP 状态转换…………………………………………………………………… 0413.3.3 半关闭…………………………………………………………………………… 0423.4 TCP 套接字编程模型 ……………………………………………………………… 0433.4.1 TCP 套接字编程的适用场合…………………………………………………… 0433.4.2 TCP 套接字的通信过程………………………………………………………… 0443.4.3 TCP 套接字的交互模型………………………………………………………… 0443.4.4 TCP 套接字的工作原理………………………………………………………… 046第 4 章 UDP 数据报套接字编程 ………………………………………………………… 0484.1 UDP 协议的传输特点 ……………………………………………………………… 0484.2 UDP 套接字的适用场合 …………………………………………………………… 0484.3 UDP 套接字的通信过程 …………………………………………………………… 0494.4 UDP 套接字编程的交互模型 ……………………………………………………… 0504.5 UDP 套接字服务器的工作原理 …………………………………………………… 0514.6 UDP 套接字的使用模式 …………………………………………………………… 052002目 录第 5 章 基于 UDP 的广播编程 …………………………………………………………… 0545.1 套接字选项与 setsockopt()函数 …………………………………………………… 0545.2 广播数据的发送与接收 …………………………………………………………… 0585.3 广播程序流程 ……………………………………………………………………… 0585.4 单播与广播的比较 ………………………………………………………………… 059第 6 章 基于 UDP 的局域网组播编程 …………………………………………………… 0636.1 概述 ………………………………………………………………………………… 0636.2 组播地址 …………………………………………………………………………… 0636.2.1 IPv4 的 D 类地址 ……………………………………………………………… 0636.2.2 组播地址范围…………………………………………………………………… 0646.2.3 组播的通信过程………………………………………………………………… 0656.2.4 局域网上的组播和广播的比较………………………………………………… 066第 7 章 原始套接字编程 …………………………………………………………………… 0687.1 原始套接字的功能 ………………………………………………………………… 0687.2 原始套接字编程模型 ……………………………………………………………… 0707.2.1 原始套接字的适用场合………………………………………………………… 0707.2.2 原始套接字的通信过程………………………………………………………… 0707.3 原始套接字的创建、输入与输出 …………………………………………………… 0717.3.1 创建原始套接字………………………………………………………………… 0727.3.2 使用原始套接字接收数据……………………………………………………… 0737.3.3 使用原始套接字发送数据……………………………………………………… 075第 8 章 基于 Select 模型的 socket 编程…………………………………………………… 0778.1 Select 模型的工作机制 ……………………………………………………………… 0778.2 使用 Select 模型编程的方法………………………………………………………… 079第二部分 软件介绍第 9 章 Visual Studio 2015 的使用 ……………………………………………………… 0839.1 Visual Studio 2015 集成开发环境组成……………………………………………… 0839.2 用向导创建 Windows 控制台(Console)应用程序 ………………………………… 0839.3 用向导创建 Windows GUI 应用程序 ……………………………………………… 0899.4 编译、链接的基本步骤 ……………………………………………………………… 0909.5 编译错误的处理 …………………………………………………………………… 0949.6 Visual Studio 2015 程序调试的基本方法…………………………………………… 0949.6.1 程序调试的基本方法…………………………………………………………… 094003网络编程实验指导书9.6.2 程序基本调试方法一:断点 …………………………………………………… 0969.6.3 程序基本调试方法二:查看变量 ……………………………………………… 098