ping程序和FTP传输课程设计报告---广工.doc_第1页
ping程序和FTP传输课程设计报告---广工.doc_第2页
ping程序和FTP传输课程设计报告---广工.doc_第3页
ping程序和FTP传输课程设计报告---广工.doc_第4页
ping程序和FTP传输课程设计报告---广工.doc_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

一:PING程序设计21具体设计任务21.1 实验目的21.2 实验内容和要求21.2.1 RAW模式的SOCKET编程21.2.2 具体内容32.3 实验主要仪器设备和材料33 基本思路及设计方案4构造ICMP请求回应包,发送,接收回应,若超时,打印超市43.1 原理框图43.2 主要程序源代码64 实验结果125 遇到的问题及解决方法136实验心得137 思考题13二.文件传输协议的简单设计和实现161 具体设计任务1611实验目的1612实验内容和要求16121实验内容16122具体要求161.3实验主要仪器设备和材料172 文件传输协议的实现原理172.1基本思路及设计方案172.2 相关理论172.3程序实现方法和方案182.3.1 FTP服务器流程图182.3.2 FTP客户端流程图203 主要代码及其功能213.1 服务端代码:213.2客户端主函数:284 结果分析325思考题346.问题及解决方法:36问题:数据包丢失。36原因:后来的数据把先来的数据淹没了。367.心得体会36一:PING程序设计摘要:该程序的核心为ping程序,通过ping 程序来探测主机到主机之间是否可通信,如果不能ping到某台主机,表明不能和这台主机建立连接。ping 使用的是ICMP协议,主要流程为:它发送ICMP回送请求消息给目的主机,ICMP协议规定,目的主机必须返回ICMP回送应答消息给源主机,如果源主机在一定时间内收到应答,则认为主机可达。若传送IP数据包发生错误比如主机不可达,路由不可达等等,ICMP协议将会把错误信息封包,然后传送回给主机。给主机一个处理错误的机会,这也就是为什么说建立在IP层以上的协议是可能做到安全的原因。ICMP数据包由8bit的错误类型和8bit的代码和16bit的校验和组成。而前 16bit就组成了ICMP所要传递的信息。关键词:ping ICMP协议 IP1具体设计任务 1.1 实验目的 PING程序是我们使用的比较多的用于测试网络连通性的程序。PING程序基于ICMP,使用ICMP的回送请求和回送应答来工作。由计算机网络课程知道,ICMP是基于IP的一个协议,ICMP包通过IP的封装之后传递。课程设计中选取PING程序的设计,其目的是希望同学们通过PING程序的设计,能初步掌握TCP/IP网络协议的基本实现方法,对网络的实现机制有进一步的认识。 1.2 实验内容和要求 1.2.1 RAW模式的SOCKET编程PING程序是面向用户的应用程序,该程序使用ICMP的封装机制,通过IP协议来工作。为了实现直接对IP和ICMP包进行操作,实验中使用RAW模式的SOCKET编程。熟悉SOCKET的编程,包括基本的系统调用如SOCKET、BIND等;1.2.2 具体内容1)定义数据结构需要定义好IP数据报、ICMP包等相关的数据结构;2)程序实现在WINDOWS环境下实现PING程序;3)程序要求在命令提示符下输入: PING .其中为目的主机的IP地址,不要求支持域名,对是否带有开关变量也不做要求。不带开关变量时,要求返回4次响应。返回信息的格式: REPLY FROM .或 REQUEST TimeOut (无法PING通的情况)。2.3 实验主要仪器设备和材料联网计算机3 基本思路及设计方案构造ICMP请求回应包,发送,接收回应,若超时,打印超市3.1 原理框图开始输入IP地址套街字的创建并连接ping()函数SendEchoRequest()RecvEchoReply()检测目标主机,创建ICMP包,计算校验和,发送回应请求接收应答回复并进行解析显示结果找到主机设置目标IP地址是否释放socketWSACleanup()3.2 主要程序源代码#include #include #include #pragma comment(lib, ws2_32.lib)/导入库文件#define ICMP_ECHOREPLY 0 /ICMP回应答复#define ICMP_ECHOREQ 8 /ICMP回应请求#define REQ_DATASIZE 32 /请求数据报大小#include using namespace std;/定义IP首部格式typedef struct _IPHeader u_char VIHL; /版本和首部长度u_char ToS; /服务类型u_short TotalLen; /总长度u_short ID; /标识号u_short Frag_Flags; /片偏移量u_char TTL; /生存时间u_char Protocol; /协议u_short Checksum; /首部校验和struct in_addr SrcIP; /源IP地址struct in_addr DestIP; /目的地址IPHDR, *PIPHDR;/定义ICMP首部格式typedef struct _ICMPHeaderu_char Type; /类型u_char Code; /代码u_short Checksum; /首部校验和u_short ID; /标识u_short Seq; /序列号char Data; /数据ICMPHDR, *PICMPHDR; /定义ICMP回应请求typedef struct _ECHOREQUESTICMPHDR icmpHdr;DWORD dwTime;char cDataREQ_DATASIZE;ECHOREQUEST, *PECHOREQUEST;/定义ICMP回应答复typedef struct _ECHOREPLYIPHDR ipHdr;ECHOREQUEST echoRequest;char cFiller256;ECHOREPLY, *PECHOREPLY;/*/计算校验和u_short checksum(u_short *buffer, int len)register int nleft = len;register u_short *w = buffer;register u_short answer;register int sum = 0;/使用32位累加器,进行16位的反馈计算while ( nleft 1 )sum += *w+;nleft -= 2;/补全奇数位if ( nleft = 1 )u_short u = 0;*(u_char *)(&u) = *(u_char*)w;sum += u;/将反馈的16位从高位移到低位sum = (sum 16) + (sum & 0xffff);sum += (sum 16);answer = sum;return (answer);/*/发送回应请求函数int SendEchoRequest(SOCKET s, struct sockaddr_in *lpstToAddr)static ECHOREQUEST echoReq;static nId = 1;static nSeq = 1;int nRet;/填充回应请求消息echoReq.icmpHdr.Type = ICMP_ECHOREQ;echoReq.icmpHdr.Code = 0;echoReq.icmpHdr.Checksum = 0;echoReq.icmpHdr.ID = nId+;echoReq.icmpHdr.Seq = nSeq+;/填充要发送的数据for (nRet = 0; nRet h_addr); /设置目标IPdestIP.sin_family = AF_INET; /地址规格destIP.sin_port = 0;/提示开始进行PINGprintf(nPinging %s %s with %d bytes of data:n,pstrHost,inet_ntoa(destIP.sin_addr),REQ_DATASIZE);/发起多次PING测试for (nLoop=0; nLoopmaximum)maximum=dwElapsed;if(dwElapsedminimum)minimum=dwElapsed;average+=dwElapsed;printf(nReply from %s: bytes = %d time = %ldms TTL = %d, inet_ntoa(srcIP.sin_addr),REQ_DATASIZE,dwElapsed,cTTL);printf(nn);printf(Ping statistics for %s:n,inet_ntoa(srcIP.sin_addr);printf( Packets: Sent = %d, Received = %d, Lost = %d (%.f% loss),n,sent,reveived,lost,(float)(lost*1.0/sent)*100);if(lost=0)printf(Approximate round trip times in milli-seconds:n);printf( Minimum = %dms, Maximum = %dms, Average = %dmsn,minimum,maximum,average/sent);printf(nn);nRet = closesocket(rawSocket);if (nRet = SOCKET_ERROR)printf(closesocket() error:%dn, WSAGetLastError();/主程序void main()printf(Welcome to the Ping Testn);while(1)WSADATA wsd;/检测输入的参数/初始化Winsockif (WSAStartup(MAKEWORD(1, 1), &wsd) != 0)printf(加载 Winsock 失败!n);char opt1100;char *ptr=opt1;bool log=false;printf(Ping );cin.getline(opt1,100,n); if(opt10=-)&(opt11=t)(opt12=))log=true;ptr=opt1+3;/开始PINGPing(ptr,log);/程序释放 Winsock 资源WSACleanup();4 实验结果直接PING IP地址,且PING通的情况下,返回四次响应。如下图:PING域名PING域名,若有丢包,如下图所示:PING(域名前加-t,显示循环):5 遇到的问题及解决方法调试时发现发送时间比预料中的长很多,经检查原来是函数中的符号“”放置的位置过后。6实验心得通过这次的课程设计,加深了对网络协议的理解,一部机器想联网,必须遵守共同的通信约定(协议),才能正常同其他机器进行通信。 7 思考题1. 本题目只要求实现PING的一些简单功能,在Windows命令行模式下,输入“Ping”回车,查看PING的所有功能,考虑如何实现这些功能。答:首先,Ping命令会构建一个固定格式的ICMP请求数据包,然后由ICMP协议将这个数据包连同地址“”一起交给IP层协议(和ICMP一样,实际上是一组后台运行的进程),IP层协议将以地址“”作为目的地址,本机IP地址作为源地址,加上一些其他的控制信息,构建一个IP数据包,并在一个映射表中查找出IP地址所对应的物理地址(也叫MAC地址,熟悉网卡配置的朋友不会陌生,这是数据链路层协议构建数据链路层的传输单元帧所必需的),一并交给数据链路层。后者构建一个数据帧,目的地址是IP层传过来的物理地址,源地址则是本机的物理地址,还要附加上一些控制信息,依据以太网的介质访问规则,将它们传送出去。2. 如果一台主机能ping通自己但网络不通,可能是什么原因?答:(1)Windows服务器的网络服务功能还没启动(2)计算机的TCP/IP协议没有与网卡有效的绑定;(3)可能计算机的网卡安装不正确,也可能是没连通;3. 考虑Netstat、Traceroute、ipconfig等网络测试应用程序的工作原理以及使用。答:Netstat的工作原理及使用:(1)显示本地或与之相连的远程机器的连接状态,包括TCP、IP、UDP、ICMP协议的使用情况,了解本地机开放的端口情况.(2)检查网络接口是否已正确安装,如果在用netstat这个命令后仍不能显示某些网络接口的信息,则说明这个网络接口没有正确连接,需要重新查找原因。(3)通过加入“-r”参数查询与本机相连的路由器地址分配情况。(4)检查一些常见的木马等黑客程序,因为任何黑客程序都需要通过打开一个端口来达到与其服务器进行通信的目的。Traceroute程序的设计是利用ICMP及IP header的TTL(Time To Live)。首先,traceroute送出一个TTL是1的IP 数据报到目的地,当路径上的第一个路由器(router)收到这个数据报时,它将TTL减1。此时,TTL变为0了,所以该路由器会将此数据报丢掉,并送回一个ICMP time exceeded消息,traceroute 收到这个消息后,便知道这个路由器存在于这个路径上,接着traceroute 再送出另一个TTL是2 的datagram,发现第2 个路由器. traceroute 每次将送出的数据报的TTL 加1来发现另一个路由器,这个重复的动作一直持续到某个数据报抵达目的地。当数据报到达目的地后,该主机并不会送回ICMP time exceeded消息,因为它已是目的地了。Ipconfig的工作原理及使用: (1)查找目标主机的IP地址及其它有关TCP/IP协议的信息。(2)当用户的网络中设置的是DHCP(动态IP地址配置协议)时,利用Ipconfig/winipcfg可以让用户很方便地了解到所用IPconfig/winipcfg机的IP地址的实际配置情况。因为它有一个“/all”这个参数,所以它可侦查到本机上所有网络适配的IP地址分配情况,比ping命令更为详细。如果我们一台IP地址为99上运行”Ipconfig”命令后,窗口中显示了主机名、DNS服务器、节点类型以及主机的相关信息如网卡类型、MAC地址、IP地址、子网掩码以及默认网关等。其中网络适配器的MAC地址在检测网络错误时非常有用。 配置不正确的IP地址或子网掩码是接口配置的常见故障。其中配置不正确的IP地址有两种情情况: (1)网号部分不正确。此时执行每一条Ipconfig命令都会显示“no answer”,这样,执行该命令后错误的IP地址就能被发现,修改即可。(2)主机部分不正确。如与另一主机配置的地址相同而引起冲突。这种故障是当两台主机同时配置相同的IP地址时出现的间歇性的通信问题。更换IP地址中的主机号部分,该问题即能排除。二.文件传输协议的简单设计和实现摘要:初始化套接字,使用TCP协议实现客户端对服务器的硬盘文件的访问,包括上传和下载。关键词:上传 下载 TCP 套接字1 具体设计任务11实验目的文件传送是各种计算机网络都实现的基本功能,文件传送协议是一种最基本的应用层协议按照客户/服务器的模式进行工作,提供交互式的访问,是INTERNET使用最广泛的协议之一。本实验的目的是,学会利用已有网络环境设计并实现简单应用层协议,掌握TCP/IP 网络应用程序基本的设计方法和实现技巧。12实验内容和要求121实验内容我们的计算机网络实验环境建立在TCP/IP 网络体系结构之上。各计算机除了安装TCP/IP 软件外,还安装了TCP/IP 开发系统。实验室各计算机具备Windows环境中套接字socket 的编程接口功能,可为用户提供全网范围的进程通信功能。本实验要求学生利用这些功能,设计和实现一个简单的文件传送协议。122具体要求用socket 编程接口编写两个程序,分别为客户程序(client.c)和服务器程序(server.c),该程序应能实现下述命令功能:get:取远方的一个文件put:传给远方一个文件pwd:显示远主当前目录dir:列出远方当前目录cd :改变远方当前目录? :显示你提供的命令quit :退出返回这此命令的具体工作方式(指给出结果的形式)可以参照FTP 的相应命令,有余力的同学可以多实现几个命令。最后,写出实验报告。1.3实验主要仪器设备和材料联网计算机2 文件传输协议的实现原理2.1基本思路及设计方案FTP的基本思路为,客户端向服务器提交查看/下载文件的请求,服务器则一直作检查请求的活动,当检测到有请求时,则响应请求。具体的功能如下:服务器功能:1)浏览本地目录、自动获取IP,将本地目录发送至客户端(客户端能够在相应位置显示)2)上传某文件至客户端客户端功能 1)查看本地目录(将要下载的文件存入到目录中),显示从服务器获得的目录2)下载文件2.2 相关理论连接套接字socket,用TCP相关功能侦听,socket发送(send),socket接收(receive)。2.3程序实现方法和方案2.3.1 FTP服务器流程图开始初始化(路径、端口)获取IP、端口将文件上传侦听根据客户端操作命令传送目录初始化完成否?能启动?是否有连接?请求下载?输出提示信息其他请求?结束输出错误信息否否否否否是是是是2.3.2 FTP客户端流程图3 主要代码及其功能3.1 服务端代码:#include #include #includeusing namespace std;#pragma comment(lib, ws2_32.lib)bool m_connected=0;int m_sendingFile=0;char m_currentPath1500=0;FILE *m_file=0;sockaddr_in addr_Client;SOCKET sock_Client;void Analysis(char *buf,int );DWORD WINAPI RecvThread( LPVOID lpParameter / thread data)printf(%s已连接n,inet_ntoa(addr_Client.sin_addr);SOCKET sock=(SOCKET)lpParameter;char buf1500;for(;1;)int len=recv(sock,buf,1500,0);if(len=-1)closesocket(sock);m_connected=0;if(m_file)fclose(m_file);m_file=0;m_sendingFile=0;printf(与 %s 连接断开n,inet_ntoa(addr_Client.sin_addr);return 0;Analysis(buf,len);return 1;DWORD WINAPI ListenThread( LPVOID lpParameter / thread data)SOCKET LISTEN=(SOCKET)lpParameter;for(;1;)if(!m_connected)int len=sizeof(sockaddr);:GetCurrentDirectory(1500,m_currentPath);/当前路径/strcpy(m_currentPath,Z:);sock_Client=accept(LISTEN,(sockaddr*)&addr_Client,&len);CreateThread(0,0,RecvThread,(void*)sock_Client,0,0);else Sleep(2000);return 1;void main() WORD wVersionRequested;WSADATA wsaData;int err;wVersionRequested = MAKEWORD( 1, 1 );err = WSAStartup( wVersionRequested, &wsaData );if ( err != 0 ) return;if ( LOBYTE( wsaData.wVersion ) != 1 | HIBYTE( wsaData.wVersion ) != 1 ) WSACleanup( );return; SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);SOCKADDR_IN addrSrv;addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);addrSrv.sin_family=AF_INET;addrSrv.sin_port=htons(2438);bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR);listen(sockSrv,5);CreateThread(0,0,ListenThread,(void*)sockSrv,0,0);for(;1;)Sleep(100);#includevoid OnDir();void OnPwd();void OnCd(char *buf);void OnPut(char *buf);/*DWORD WINAPI OnGet( LPVOID lpParameter / thread data);*/void OnGet(char *);void Analysis(char* buf,int len) int *comand=(int *)buf;switch(*comand)case 1:OnGet(buf);break;case 2:OnPut(buf);break;case 3:OnPwd();break;case 4:/返回 显示命令 + 目录 OnDir();break;case 5:OnCd(buf);break;/CreateThread(0,0,OnGet,(void*)buf,0,0);/返回改变目录后的目录 case 11:/请求文件数据 if(!m_sendingFile)break; char sendBuf1500; *(int*)sendBuf)=11; len=fread(void*)(sendBuf+4),1,1496,m_file); /Sleep(10); send(sock_Client,sendBuf,len+4,0); if(len=0) fclose(m_file); m_file=0; *(int *)sendBuf)=8; strcpy(sendBuf+4,传送成功); send(sock_Client,sendBuf,strlen(sendBuf+4)+5,0); m_sendingFile=0; printf(send sucessn); break;case 22: if(!m_sendingFile)break; fwrite(void*)(buf+4),1,len-4,m_file); /Sleep(10); if(len=4) fclose(m_file); m_file=0; *(int *)sendBuf)=8; strcpy(sendBuf+4,传送成功); send(sock_Client,sendBuf,strlen(sendBuf+4)+5,0); m_sendingFile=0; printf(send sucessn); len=22; send(sock_Client,(char*)&len,10,0);break;void OnPwd()char sendBuf1000;int *type=(int *)sendBuf ; *type=8;/显示char *s=sendBuf+4;strcpy(s,m_currentPath);send(sock_Client,sendBuf,strlen(m_currentPath)+5,0); void OnDir()char sendBuf1500;char filename200;strcpy(filename,m_currentPath);strcat(filename,*);long hFile;_finddata_t fileinfo;if (hFile=_findfirst(filename, &fileinfo) != -1)int *flat=(int *)sendBuf; *flat=8;/显示 8char *filename2=sendBuf+4;filename20=0;filename21=0;doint foder=0; if (fileinfo.attrib & _A_SUBDIR) foder=1;if(strlen(&sendBuf4)+strlen()+strlen(文件夹)n)1495) send(sock_Client,sendBuf,4+strlen(&sendBuf4)+1,0); memset(sendBuf,0,1500); filename2=sendBuf+4; *flat=8; filename20=0; filename21=0; Sleep(5);strcat(filename2,);if(foder)strcat(filename2,(文件夹);strcat(filename2,n); filename2=&sendBuf4+strlen(&sendBuf4); while (_findnext(hFile,&fileinfo) = 0);send(sock_Client,sendBuf,4+strlen(&sendBuf4)+1,0);_findclose(hFile);void OnCd(char *buf)char sendBuf1000;char filename200;int *type=(int*)sendBuf; *type=8;char *s=sendBuf+4; if(buf4=.&buf5=.)/后退目录 for(int i=strlen(m_currentPath);i;i-) if(m_currentPathi=) m_currentPathi=0; OnPwd(); return; OnPwd(); return ;strcpy(filename,m_currentPath);strcat(filename,*.*);long hFile;_finddata_t fileinfo;if (hFile=_findfirst(filename, &fileinfo) != -1)do if (fileinfo.attrib & _A_SUBDIR) if(!strcmp(,buf+4) strcat(m_currentPath,); strcat(m_currentPath,buf+4); OnPwd(); _findclose(hFile); return; while (_findnext(hFile,&fileinfo) = 0); sprintf(s,%s 文件夹不存在,buf+4); send(sock_Client,sendBuf,strlen(s)+5,0); Sleep(500); return; _findclose(hFile); sprintf(s,%s 文件夹不存在,buf+4); *type=8; send(sock_Client,sendBuf,strlen(s)+5,0);/*DWORD WINAPI OnGet( LPVOID lpParameter / thread data)*/void OnGet(char *buf) /char *buf=(char*)lpParameter; m_sendingFile=1; char sendBuf1500; char filename100; strcpy(filename,m_currentPath); strcat(filename,); strcat(filename,buf+4); if(m_file=fopen(filename,rb)=0) *(int *)sendBuf)=8; strcpy(sendBuf+4,传送失败); send(sock_Client,sendBuf,strlen(sendBuf+4)+5,0); return ; *(int*)sendBuf)=1; strcpy(sendBuf+4,buf+4); send(sock_Client,sendBuf,5+strlen(sendBuf+4),0); m_sendingFile=1; return ;void OnPut(char *buf) m_sendingFile=1; char sendBuf1500; char filename100; strcpy(filename,m_currentPath); strcat(filename,); strcat(filename,buf+4); if(m_file=fopen(filename,wb)=0) *(int *)sendBuf)=8; strcpy(sendBuf+4,传送失败); send(sock_Client,sendBuf,strlen(sendBuf+4)+5,0); return ; *(int*)sendBuf)=2;/请求文件数据 strcpy(sendBuf+4,buf+4); send(sock_Client,sendBuf,5+strlen(sendBuf+4),0); m_sendingFile=1; return ;3.2客户端主函数: #include #include#include#includeusing namespace std;#pragma comment(lib, ws2_32.lib)int m_currentTask=0;int m_connected=0;SOCKET sock_Client;FILE *m_file=0;int m_sendingFile=0;void Analysis(char*,int);DWORD WINAPI RecvThread( LPVOID lpParameter / thread data)printf(已连接服务器n);SOCKET sock=(SOC

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论