《网络工程课程设计PING程序设计与FTP设计.doc》由会员分享,可在线阅读,更多相关《网络工程课程设计PING程序设计与FTP设计.doc(42页珍藏版)》请在三一办公上搜索。
1、课 程 设 计 课程名称_网络工程课程设计 题目名称_PING程序设计 题目名称 文件传输协议的简单设计 题目名称 数据链路层协议的设计 学生学院_ _ 专业班级_网络工程 学 号_ 学生姓名_ _ 指导教师_ _ 2009 年 12 月 25 日PING目录1 具体设计任务311实验目的312实验内容和要求.3121实验内容.3122具体要求.31. 3实验主要仪器设备和材料.42工作原理及设计方案.42.1 PING的工作原理.42.2原理框图.53 主要代码及其功能.64 结果分析.105 思考题.116 心得体会.12课程设计一:PING程序设计1 设计任务目的及要求1.1 设计目的P
2、ING程序是我们使用的比较多的用于测试网络连通性的程序。PING程序基于ICMP,使用ICMP的回送请求和回送应答来工作。由计算机网络课程知道,ICMP是基于IP的一个协议,ICMP包通过IP的封装之后传递。课程设计中选取PING程序的设计,其目的是希望同学们通过PING程序的设计,能初步掌握TCP/IP网络协议的基本实现方法,对网络的实现机制有进一步的认识。1.2 设计要求1、RAW模式的SOCKET编程PING程序是面向用户的应用程序,该程序使用ICMP的封装机制,通过IP协议来工作。为了实现直接对IP和ICMP包进行操作,实验中使用RAW模式的SOCKET编程。熟悉SOCKET的编程,包
3、括基本的系统调用如SOCKET、BIND等;2、具体内容1) 定义数据结构需要定义好IP数据报、ICMP包等相关的数据结构;2) 程序实现在WINDOWS环境下实现PING程序;3) 程序要求在命令提示符下输入: PING .其中为目的主机的IP地址,不要求支持域名,对是否带有开关变量也不做要求。不带开关变量时,要求返回4次响应。返回信息的格式: REPLY FROM .或 REQUEST TimeOut (无法PING通的情况)。1.3实验环境Pc机一台(可以与其他机联通或者可以上网)操作系统为windows xp软件为vc6.0Windows 环境下2 工作原理及设计方案2.1 PING的
4、工作原理ping 程序是用来探测主机到主机之间是否可通信,如果不能ping到某台主机,表明不能和这台主机建立连接。ping 使用的是ICMP协议,它发送ICMP回送请求消息给目的主机。ICMP协议规定:目的主机必须返回ICMP回送应答消息给源主机。如果源主机在一定时间内收到应答,则认为主机可达。ICMP协议通过IP协议发送的,IP协议是一种无连接的,不可靠的数据包协议。因此,保证数据送达的工作应该由其他的模块来完成。其中一个重要的模块就是ICMP(网络控制报文)协议。当传送IP数据包发生错误比如主机不可达,路由不可达等等,ICMP协议将会把错误信息封包,然后传送回给主机。给主机一个处理错误的机
5、会,这也就是为什么说建立在IP层以上的协议是可能做到安全的原因。ICMP数据包由8bit的错误类型和8bit的代码和16bit的校验和组成。而前 16bit就组成了ICMP所要传递的信息。PING利用ICMP协议包来侦测另一个主机是否可达。原理是用类型码为0的ICMP发请求,受到请求的主机则用类型码为8的ICMP回应。ping程序来计算间隔时间,并计算有多少个包被送达。用户就可以判断网络大致的情况。2.2原理框图否输出失败信息结束程序3是是否否否否是是是开始发送数据包?接收数据包?解析数据包?结束输出失败信息结束函数输出失败信息结束函数创建套接字判断是不是无限?输入域名、大小和次数解析域名填写
6、ICMP数据包?计算校验和输出失败信息结束函数.3程序源代码填写ICMP数据包*void fill_icmp_data(char * icmp_data, int datasize)/填充ICMPIcmpHeader *icmp_hdr; char *datapart; icmp_hdr = (IcmpHeader*)icmp_data; icmp_hdr-i_type = ICMP_ECHO; icmp_hdr-i_code = 0; icmp_hdr-i_id=(USHORT)GetCurrentProcessId()icmp_hdr-i_cksum = 0; icmp_hdr-i_seq
7、 = 0; datapart = icmp_data + sizeof(IcmpHeader); /数据段地址memset(datapart,0,datasize - sizeof(IcmpHeader); 计算校验和USHORT checksum(USHORT *buffer, int size)/求校验和unsigned long cksum=0; while(size 1) cksum+=*buffer+; size -=sizeof(USHORT); if(size) cksum += *(UCHAR*)buffer; cksum = (cksum 16) + (cksum & 0xf
8、fff); cksum += (cksum 16); return (USHORT)(cksum); ICMP 头结构typedef struct icmphdr BYTE i_type; / 数据的类型BYTE i_code; / subcode类型USHORT i_cksum; / 校验和USHORT i_id; / idUSHORT i_seq; / 序号 ULONG timestamp; IcmpHeader;IP 头结构typedef struct iphdr unsigned int h_len:4; /长度unsigned int version:4; / 版本 unsigned
9、 char tos; / 服务类型unsigned short total_len; / 实际长度unsigned short ident; / 标识 unsigned short frag_and_flags; /标志 unsigned char ttl; /生存时间unsigned char proto; /协议(TCP, UDP etc) unsigned short checksum; / IP校验 unsigned int sourceIP;unsigned int destIP;IpHeader;数据包解码Int decode_resp(char *buf, int bytes,s
10、truct sockaddr_in*from,unsignedlong &arrivetime,CListBox *info)/解码IpHeader *iphdr; IcmpHeader *icmphdr; unsigned short iphdrlen; /ip头的长度CString str,str1,str2;iphdr = (IpHeader *)buf; iphdrlen = (iphdr-h_len) * 4 ; if (bytes sin_addr);info-AddString(Too few bytes from + str1); info-PostMessage(WM_VSC
11、ROLL,SB_BOTTOM, 0); /str.Format();icmphdr = (IcmpHeader*)(buf + iphdrlen); if (icmphdr-i_type != ICMP_ECHOREPLY) str1.Format(%d,icmphdr-i_type);info-AddString(non-echo type + str1 + recvd ); info-PostMessage(WM_VSCROLL, SB_BOTTOM, 0); return 1; if(icmphdr-i_id!=(USHORT)GetCurrentProcessId() info-Add
12、String(someone elses packet!);info-PostMessage(WM_VSCROLL, SB_BOTTOM, 0); return 1; int k = (int)iphdr-ttl;CString ttl;ttl.Format(%d,k);str.Format(%d,(int) bytes);str1.Format(%d,icmphdr-i_seq);str2.Format(%d,arrivetime-icmphdr-timestamp);info-AddString(str + bytes from + : + inet_ntoa(from-sin_addr)
13、+ icmp_seq = + str1 + . + time: + str2 + ms. + TTL + ttl); info-PostMessage(WM_VSCROLL, SB_BOTTOM, 0); Sleep(1000); return 0; if(bag-select = 1)bag-IPCtrl-GetAddress( addr );addr = (DWORD)htonl(unsigned long)addr);dest.sin_addr = *( in_addr * )&addr; hp = gethostbyaddr(char*)&addr,16,AF_INET);if (hp
14、 != NULL) (bag-dnsCtrl)-SetSel(0,-1,FALSE);(bag-dnsCtrl)-ReplaceSel(hp-h_name);if (!hp) & (addr = INADDR_NONE) ) str = inet_ntoa(dest.sin_addr);bag-infolist-AddString(Unable to resolve + str); return 0; /初始化destif (hp) dest.sin_family = hp-h_addrtype; elsedest.sin_family = AF_INET;/获取IP或域名,并显示dest_i
15、p = inet_ntoa(dest.sin_addr); /将网络地址转换成“.”点隔的字符串格式times=DEF_PACKET_NUMBER;datasize = DEF_PACKET_SIZE; datasize += sizeof(IcmpHeader); /数据段的大小icmp_data = (char*)xmalloc(MAX_PACKET); /为icmp分配内存recvbuf = (char*)xmalloc(MAX_PACKET); if (!icmp_data) str.Format(%d,GetLastError();bag-infolist-AddString(Hea
16、pAlloc failed + str); return 0; .while(true)/ping 4次for(int i=0;ii_cksum = 0; (IcmpHeader*)icmp_data)-timestamp= GetTickCount(); /获取发送时间(IcmpHeader*)icmp_data)-i_seq = seq_no+; (IcmpHeader*)icmp_data)-i_cksum= checksum(USHORT*)icmp_data,datasize);/求校验和bwrote=sendto(sockRaw,icmp_data,datasize,0,(stru
17、ct sockaddr*)&dest,sizeof(dest); /发送if (bwrote = SOCKET_ERROR) if (WSAGetLastError() = WSAETIMEDOUT) bag-infolist-AddString(Request timed out.); bag-infolist-PostMessage(WM_VSCROLL, SB_BOTTOM, 0);continue; str.Format(%d,WSAGetLastError();bag-infolist-AddString(sendto failed: + str); return 0; if (bw
18、rote infolist-AddString(Wrote + str + bytes); bread=recvfrom(sockRaw,recvbuf,MAX_PACKET,0,(struct sockaddr*)&from,&fromlen); /接收arrivetime = GetTickCount(); /获取接收时间if (bread = SOCKET_ERROR) if (WSAGetLastError() = WSAETIMEDOUT) bag-infolist-AddString(Request timed out.); bag-infolist-PostMessage(WM_
19、VSCROLL, SB_BOTTOM, 0);continue; str.Format(%d,WSAGetLastError();bag-infolist-AddString(recvfrom failed: + str); return 0; if(!decode_resp(recvbuf,bread,&from,arrivetime,bag-infolist)/解码statistic+; /* 成功接收的数目+ */Sleep(1000); if(!bag-T)/等于复选按钮的值,为真就做-t,无限循环pingbreak;/*显示统计结果*/str = dest_ip;bag-infoli
20、st-AddString(Ping statistics for + str);CString str1,str2;str.Format(%d,statistic);str1.Format(%d,times-statistic);str2.Format(%f,(float)(times-statistic)/times*100);bag-infolist-AddString( Packets: Sent = 4,Received = + str + , Lost = + str1 + + str2+% loss);bag-infolist-AddString();WSACleanup();re
21、turn 0;测试步骤及实验结果首先,运行程序,使用默认ip(本机ip)ping:接着,选择域名,并输入,默认ping次数为4次,在ip地址栏可以显示相应的ip地址:最后,我们将“-t”选中,连续循环“ping”:结论本程序能全部完成课程设计的要求功能,能域名解析,ping服务器,并能实现-t参数无限循环ping。界面比较友好,显示、按键等均正常,并有“停止重ping”、 “退出”按键,能较好与用户交互。缺点是程序不稳定,不能很好应付网络状况不明朗的情况。5 思考题1. 本题目只要求实现PING的一些简单功能,在Windows命令行模式下,输入“Ping”回车,查看PING的所有功能,考虑如何
22、实现这些功能。答:首先,Ping命令会构建一个固定格式的ICMP请求数据包,然后由ICMP协议将这个数据包连同地址“192.168.1.2”一起交给IP层协议(和ICMP一样,实际上是一组后台运行的进程),IP层协议将以地址“192.168.1.2”作为目的地址,本机IP地址作为源地址,加上一些其他的控制信息,构建一个IP数据包,并在一个映射表中查找出IP地址192.168.1.2所对应的物理地址(也叫MAC地址,熟悉网卡配置的朋友不会陌生,这是数据链路层协议构建数据链路层的传输单元帧所必需的),一并交给数据链路层。后者构建一个数据帧,目的地址是IP层传过来的物理地址,源地址则是本机的物理地址
23、,还要附加上一些控制信息,依据以太网的介质访问规则,将它们传送出去。2. 如果一台主机能ping通自己但网络不通,可能是什么原因?答:(1)可能计算机的网卡安装不正确,也可能是没连通;(2)计算机的TCP/IP协议没有与网卡有效的绑定;(3)Windows服务器的网络服务功能还没启动3. 考虑Netstat、Traceroute、ipconfig等网络测试应用程序的工作原理以及使用。答:Netstat的工作原理及使用:(1)显示本地或与之相连的远程机器的连接状态,包括TCP、IP、UDP、ICMP协议的使用情况,了解本地机开放的端口情况.(2)检查网络接口是否已正确安装,如果在用netstat
24、这个命令后仍不能显示某些网络接口的信息,则说明这个网络接口没有正确连接,需要重新查找原因。(3)通过加入“-r”参数查询与本机相连的路由器地址分配情况。(4)检查一些常见的木马等黑客程序,因为任何黑客程序都需要通过打开一个端口来达到与其服务器进行通信的目的。Traceroute程序的设计是利用ICMP及IP header的TTL(Time To Live)。首先,traceroute送出一个TTL是1的IP 数据报到目的地,当路径上的第一个路由器(router)收到这个数据报时,它将TTL减1。此时,TTL变为0了,所以该路由器会将此数据报丢掉,并送回一个ICMP time exceeded消
25、息,traceroute 收到这个消息后,便知道这个路由器存在于这个路径上,接着traceroute 再送出另一个TTL是2 的datagram,发现第2 个路由器. traceroute 每次将送出的数据报的TTL 加1来发现另一个路由器,这个重复的动作一直持续到某个数据报抵达目的地。当数据报到达目的地后,该主机并不会送回ICMP time exceeded消息,因为它已是目的地了。Ipconfig的工作原理及使用: (1)查找目标主机的IP地址及其它有关TCP/IP协议的信息。(2)当用户的网络中设置的是DHCP(动态IP地址配置协议)时,利用Ipconfig/winipcfg可以让用户很
26、方便地了解到所用IPconfig/winipcfg机的IP地址的实际配置情况。因为它有一个“/all”这个参数,所以它可侦查到本机上所有网络适配的IP地址分配情况,比ping命令更为详细。如果我们一台IP地址为192.168.2.199上运行”Ipconfig”命令后,窗口中显示了主机名、DNS服务器、节点类型以及主机的相关信息如网卡类型、MAC地址、IP地址、子网掩码以及默认网关等。其中网络适配器的MAC地址在检测网络错误时非常有用。 配置不正确的IP地址或子网掩码是接口配置的常见故障。其中配置不正确的IP地址有两种情情况: (1)网号部分不正确。此时执行每一条Ipconfig命令都会显示“
27、no answer”,这样,执行该命令后错误的IP地址就能被发现,修改即可。(2)主机部分不正确。如与另一主机配置的地址相同而引起冲突。这种故障是当两台主机同时配置相同的IP地址时出现的间歇性的通信问题。更换IP地址中的主机号部分,该问题即能排除。6 心得体会通过仔细阅读程序代码,查找相关资料,我大概弄懂了程序的基本过程。程序通过发送一个ICMP回显请求报文到目的地主机,如果有IP选项途中的主机通过报文记录各自的IP地址,目的地主机回发一个回显应答报文,然后发送主机通过解析回显应答报文,查看通过路由地址,并计算发送回收报文所用的传送时间,以确定回显报文是否超时。在学习的过程中发现程序良好的算法
28、和优良的编程思想的同时我也发现很多是我没见过的函数例如WSAStartup(MAKEWORD(2, 2), &wsaData) != 0),soket的版本是2.2的、socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)、ZeroMemory(&ipopt, sizeof(ipopt)。通过查阅资料,对域名有了相关了解。有的网址的主机名是取不到的。如取的主机名的时候取不到, 而去的主机名的时候是取的到的。网络上的机器名并不是tcp/ip协议簇中的东西,而是netbios协议中的。支持tcp/ip的机器,并不一定支持netbios。 不同的操作系统,不同的系统配置,你用
29、gethostbyaddr()拿到的结果自然不同,以上 csdn的系统是不支持netbios的,而的系统打开了netbios服务。FTP目录1 具体设计任务11实验目的.1412实验内容和要求.14121实验内容.14122具体要求.141. 3实验主要仪器设备和材料.152 文件传输协议的实现原理.152.1 相关理论.152.2 基本思路.152.2.1 设计的服务器功能.152.2.2 设计的客户端功能.152.3程序实现方法和方案.162.3.1 FTP服务器流程图.162.3.2 FTP客户端流程图.173 主要代码及其功能.183.1 服务端代码.183.1.1判断用户指令代码.1
30、93.1.2执行命令及调用的函数.203.2客户端主函数 .223.2.1连接、返回及路径代码.223.2.2客户端下载代码.233.2.3 客户端上传代码.244 结果分析.25 4.1 服务器运行.264.2 客户端运行.275 思考题.28课程设计二:文件传输协议的简单设计与实现1 具体设计任务11实验目的文件传送是各种计算机网络都实现的基本功能,文件传送协议是一种最基本的应用层协议按照客户/服务器的模式进行工作,提供交互式的访问,是INTERNET使用最广泛的协议之一。本实验的目的是,学会利用已有网络环境设计并实现简单应用层协议,掌握TCP/IP 网络应用程序基本的设计方法和实现技巧。
31、12实验内容和要求121实验内容我们的计算机网络实验环境建立在TCP/IP 网络体系结构之上。各计算机除了安装TCP/IP 软件外,还安装了TCP/IP 开发系统。实验室各计算机具备Windows环境中套接字socket 的编程接口功能,可为用户提供全网范围的进程通信功能。本实验要求学生利用这些功能,设计和实现一个简单的文件传送协议。122具体要求用socket 编程接口编写两个程序,分别为客户程序(client.c)和服务器程序(server.c),该程序应能实现下述命令功能:get:取远方的一个文件put:传给远方一个文件pwd:显示远主当前目录dir:列出远方当前目录cd :改变远方当前
32、目录? :显示你提供的命令quit :退出返回这此命令的具体工作方式(指给出结果的形式)可以参照FTP 的相应命令,有余力的同学可以多实现几个命令。最后,写出实验报告。1 3实验主要仪ni器设备和材料Pc机一台(可以与其他机联通或者可以上网)操作系统为windows xp软件为 Visual studio 2005 C#Windows 环境下2 文件传输协议的实现原理2.1 相关理论1) 了解关于TCP/IP网络协议的理论知识 了解课本的理论知识。 2)深入了解标准TCP/IP编程接口socket套接字的TCP连接在MFC编程中的实现在本实验中主要是在VC6.0环境下实现socket套接字的T
33、CP连接以实现文件传送的功能。在实现上述功能时我们要用到的几个关键API函数是:Int WSAstartup(WORD wVersionRequested,LPWSADATA lpWSAData):wVersionRequested 是Windows Sockets API提供的调用方可使用的最高版本号.高位字节指出副版本(修正)号,低位字节指明主版本号。lpWSAData 指向WSADATA数据结构的指针,用来接收Windows Sockets实现的细节。注释:在调用任何Winsock之前都必须先调用WSAstartup()来初始化Windows Sockets DLL。SOCKET PAS
34、CAL FAR socket( int af, int type, int protocol):af:一个地址描述。目前仅支持AF_INET格式,也就是说ARPA Internet地址格式。type:新套接口的类型描述。protocol:套接口所用的协议。如调用者不想指定,可用0。注释:创建一个新的套接字。int PASCAL FAR bind( SOCKET s, const struct sockaddr FAR* name,int namelen):s:标识一未捆绑套接口的描述字。name:赋予套接口的地址。namelen:name名字的长度。注释:使新建的socket和IP地址、端口号
35、绑定在一起,唯一标识该接口。int PASCAL FAR listen( SOCKET s, int backlog):S:用于标识一个已捆绑未连接套接口的描述字。backlog:等待连接队列的最大长度。注释:这个函数其实是确认服务器的地位,一旦调用了lesten(),s就变成被动连接即应该调用accept()来等待服务器来发送连接请求。SOCKET PASCAL FAR accept( SOCKET s, struct sockaddr FAR* addr,int FAR* addrlen):s:套接口描述字,该套接口在listen()后监听连接。addr:(可选)指针,指向一缓冲区,其中接
36、收为通讯层所知的连接实体的地址。Addr参数的实际格式由套接口创建时所产生的地址族确定。addrlen:(可选)指针,指向存有addr地址长度的整形数。注释:等待客户端的连接,服务器处于阻塞状态,一直到接通。int PASCAL FAR connect( SOCKET s, const struct sockaddr FAR* name,int namelen):s:标识一个未连接套接口的描述字。name:欲进行连接的端口名。namelen:名字长度。注释:由客户端发出的连接请求,与服务器的accept()函数交互。int PASCAL FAR recv( SOCKET s, char FAR
37、* buf, int len, int flags):s:一个标识已连接套接口的描述字。buf:用于接收数据的缓冲区。len:缓冲区长度。flags:指定调用方式。注释:用来接收已连通的对方socket发来的数据,与send()函数交互。int PASCAL FAR send( SOCKET s, const char FAR* buf, int len, int flags):s:一个用于标识已连接套接口的描述字。buf:包含待发送数据的缓冲区。len:缓冲区中数据的长度。flags:调用执行方式。注释:用来给已连通的对方socket发送的数据,与recv()函数交互。2.2 基本思路2.2.1 设计的服务器功能 a)浏览本地目录b) 将本地目录发送至客户端(客户端能够在相应位置显示)c)上传某文件至客户端2.2.2 设计的客户端功能 a)查看本地目录(将要下载的文件存入到目录中) b)显示从服务器获得的目录 c)下载文件 d)上传文件到服务器2.3程序实现方法和方案客户端请求上传等待客户端的命令成功?启动按钮发送菜单目录客户端请求下载客户端请求退出把文件发给客户端从客户端处接收文件成功?结束结束选择菜单按钮获得菜单目录监听,等待客户端的连接连接成功?