资源预览内容
第1页 / 共29页
第2页 / 共29页
第3页 / 共29页
第4页 / 共29页
第5页 / 共29页
第6页 / 共29页
第7页 / 共29页
第8页 / 共29页
第9页 / 共29页
第10页 / 共29页
亲,该文档总共29页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
计算机网络课程设计题 目 Ping 程序与 Echo 程序的设计与实现 系 部 商学系 专 业 信息管理与信息系统 班 级 信息 N122 学 号 学生姓名 指导教师 编写日期 2014.12.25 1目录1. 目的 .22. 要求 .23. 知识 .34. 分析 .35. 代码 .96. 结果 .307. 心得 .3021. 目的通过设计 Ping 程序,讲解 Ping 程序的实现原理,并初步讲解了 c 语言网络编程技术。本章涉及很多网络编程函数和编程技巧。包括库文件的导入;winsock 的初始化、注销;socket 的创建、关闭;设置 socket 选项;根据主机名获取 IP 地址; 从堆中分配一定数量的空间、释放从堆中分配的空间;获取当前进程 ID 号;数据报的发送;数据报的接等。Echo 程序的功能是客户端向服务器发送一个字符串,服务器不做任何处理,直接把字符串返还给客服端,Echo 程序是最为基本的客户端/ 服务器程序。a、 通过 Echo 程序是学生掌握网络编程的基本知识和基本技能;b、 通过跟踪运行 java 包,使学生了解网络编程实现的细节。课程设计内容:本实验要求实现 Echo 程序,具有内容及要求如下:a、 分析 Echo 程序的功能,其功能包括:客户端输入一个字符串;服务器端接收到这个字符串后,直接把这些字符串发送给客户端;客户端在接收到这个字符串后把字符串现实出来。b、 设计实现 Echo 程序,包括客户端和服务器程序。c、 跟踪运行 java 包。2. 要求(1)实现 ping 功能。程序能实现基本的 ping 操作,发送 ICMP 回显请求报文,接收显应答报文。(2)能记录路由。程序提供了“-r”选项,用以记录从源主机到目的主机的路由。(3)能输出指定条数的记录。程序提供了“-n”选项,用以输出指定条数的记录。(4)能按照指定大小输出每条记录。程序提供了“datasize”选项,用以指定输出的数据报的大小。(5)能输出用户帮助。程序提供了用户帮助,显示程序提供的选项以及选项格式等。3Echo 程序的实现主要是利用 java 网络程序包中的服务器套接字(ServersSocket)和客户端套接字( Socket)来实现,思路如下:根据制定的端口创建服务器套接字,并阻塞客户的连接;根据 EchoService 所以主机名和侦听端口创建客户端套接字;向客户端套接字输出流中写入一个字符串;服务器套接字接收到连接请求,从服务器套接字输入流中读取该字符串;服务器套接字不做任何修改,直接把该字符串写入服务器套接字输出流中;客户端套接字从输入流中接收到 该字符串,直接打印到终端。3. 知识ping 命令是使用频率极高的一个网络测试命令,用以测试从一个主机到另一个主机间的网络上否可达。windows 自带的 ping 命令具有强大的功能,它有很多选项用于实现不同的测试目的。本章模仿 windows 的 ping 命令,用 c 语言实现了一个简单的命令。本章着重讲述 ping 命令的实现原理和 c 语言的网络编程方法。读者可以在本章的基础上,对本章实现的 ping 命令进行扩展,开发出功能更强大、更完善的 ping 命令,并进一步掌握网络编程的方法。4. 分析1. 功能模块图本系统共有 4 个模块,分别是初始化模块、功能控制模块、数据控制模块、数据报解读模块和 ping 测试模块,如图 9.1 所示。各模块功能描述如下。4Ping 程序设计初始化模块数ping命令是使用频率极高的一个网络测试命令,用以测试从一个主机到另一个主机间的网络上否可达。windows 自带的ping命令具有强大的功能,它有很多选项用于实现不同的测试目的。本章模仿windows 的ping命令,用 c语言实现了一个简单的命令。本章着重讲述ping命令的实现原理和c 语言的网络编程方法。读者可以在本章的基础上,对本章实现的ping命令进行扩展,开发出功能更强大、更完善的ping命令,并进一步掌握网络编程的方法据报解读模块功能控制模块Ping测试模块图 4.1 系统模块图(1) 初始化模块。改模块用于初始化各个全局变量,为全局变量赋初始值;初始化,加载库。(2)功能控制模块。改模块是被其它模块调用,其功能包括获取参数、计算校验和填充数据报文、释放占用资源和显示用户帮助。(3)数据报解读模块。改模块用于解读接收到的报文和选项。(4)测试模块。改模块是本程序的核心模块,调用其他模块实现其功能,主要是实现的功能。2系统流程图系统执行的流程图 9.2 所示。程序首先调用 IniPing()函数初始化各全局变量,然后 GetArgments()函数获取用户输入的参数,检查用户输入的参数,如果参数不正确或者没有输入参数,则显示用户帮助信息(User help ),并结束程序;如果参数正确,则对指定目的地执行 Ping 命令,如果 Ping 通,则显示 Ping 结果并释放占用资源,如果没有 Ping 通,则报告错误信息,并释放占用资源。5开始初始化个变量获取参数信息输入参数是否正确?Ping 目的地Ping 成功?输出 Ping 结果释放占用资源结束输出错误信息显示帮助信息图 4.2 系统流程图3.参数获取(GetArgments() 函数)流程图获取的参数包括“-r” (记录路由) 、 “-n”(记录条数程序,任意的整数)和datasize(数据报大小)。程序首先判断每一个参数的第一字符,如果第一个字符是“-” (短横线) ,则认为是“-r”或者“-n ”中的一个,然后作进一步判断。如果该参数的第二个字符是数字,则判断该参数为记录的条数,如果该参数的6第二个字符是“r” ,则判断该参数为“-r” , 用于记录路由;如果参数的第一个字符是数字,则认为 参数是 IP 地址;或者 datasize,然后作进一步的判断。如果该参数中不存在非数字的字符, 则判断该参数为 datasize;如果存在非数 字的字符,则判断该参数为 IP 地址;其他情况则判断为主机名。参数获取的流程如图所示:开始Argc=1?检查第一 i 个参数的第一个字符是“-”?检查第一 i 个参数的第二个字符是数字?该参数表示要获取的记录数转换成十进制记录到全局变量 packetNUM还有参数?结束是数字?该参数中有非数字字符?该参数表示IP 地址该参数表示数据报大小该参数表示主机名是“r”?显示用户帮助 设标志位 RecordFlag 为 tureI=i+1记录到变量Lpdest 中记录到变量Datasize 中记录到变量Lpdest 中图 4.3 参数获取流程图74.ping()函数流程图ping()函数是本程序的核心部分它调用其他模块的函数来实现,其主要步骤包括创建接字,设置路由选项(如果需要的话) 、设置接收和发送超时值、名字解析(如果需要的话) 、分配内存、创建 ICMP 报文、发送 ICMP 请求报文、接收 ICMP 应答报文和解读 ICMP 报文。其执行流程如图 4.4 所示。8开始创建原始套接字创建成功?记录路由?设置接收和发送超时值为每个 ICMP 设置路由选项设置成功?名字解析?根据主机名获取各种参数获取成功?设置目的地址各项字段根据 ICMP 报文大小分配内存分配成功创建 ICMP 报文发送 ICMP 请求发送成功?超时发送?输出超时发送 接收 ICMP 应答输出失败信息9接收成功?超时接收?输出失败信息 输出超时接收 读取 ICMP 数据报文记录数达到指定值?图 4.4 Ping 函数流程图5. 代码Ping 的代码:#pragma comment(lib, ws2_32.lib)1. 程序预处理/*导入库文件*/#pragma comment( lib, ws2_32.lib )/*加载头文件*/#include #include #include #include #include /*定义常量*/10/*表示要记录路由*/#define IP_RECORD_ROUTE 0x7/*默认数据报大小*/#define DEF_PACKET_SIZE 32 /*最大的 ICMP 数据报大小*/#define MAX_PACKET 1024 /*最大 IP 头长度*/#define MAX_IP_HDR_SIZE 60 /*ICMP 报文类型,回显请求*/ #define ICMP_ECHO 8/*ICMP 报文类型,回显应答*/ #define ICMP_ECHOREPLY 0/*最小的 ICMP 数据报大小*/#define ICMP_MIN 8/*自定义函数原型*/void InitPing();void UserHelp();void GetArgments(int argc, char* argv); USHORT CheckSum(USHORT *buffer, int size);void FillICMPData(char *icmp_data, int datasize);void Free
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号