欢迎来到装配图网! | 帮助中心 装配图网zhuangpeitu.com!
装配图网
ImageVerifierCode 换一换
首页 装配图网 > 资源分类 > DOC文档下载
 

计算机网络课程设计_FTP文件传输

  • 资源ID:108458427       资源大小:302KB        全文页数:19页
  • 资源格式: DOC        下载积分:16积分
快捷下载 游客一键下载
会员登录下载
微信登录下载
三方登录下载: 微信开放平台登录 支付宝登录   QQ登录   微博登录  
二维码
微信扫一扫登录
下载资源需要16积分
邮箱/手机:
温馨提示:
用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
支付方式: 支付宝    微信支付   
验证码:   换一换

 
账号:
密码:
验证码:   换一换
  忘记密码?
    
友情提示
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

计算机网络课程设计_FTP文件传输

目 录1 课程设计的目的和意义1设计目的1设计意义12 课程设计的内容和要求1设计的内容1设计要求13 课程设计的相关技术2实现软件23.2 TCP/IP协议技术23.3 TCP/IP协议与Winsock网络编程接口23.4 Winsock API的使用24 课程设计过程3设计思路3设计方案3系统的根本功能3客户端的主要工作流程4主要功能模块如下:5程序实现局部如下:104.5 程序运行结果截图155 课程设计小结18参考书目181 课程设计的目的和意义文件传送是各种计算机网络都实现的根本功能,文件传送协议是一种最根本的应用层协议按照客户/效劳器的模式进行工作,提供交互式的访问,是INTERNET使用最广泛的协议之一。本程序设计主要学会学会利用已有网络环境设计并实现简单应用层协议,掌握TCP/IP 网络应用程序根本的设计方法和实现技巧,理解处于相同网络环境下的两个不相同的程序如何实现数据上传和下载,进一步理解效劳器和客户端的工作原理及通信方法,在数据交互中掌握TCP/IP的体系结构,体会TCP的运输连接管理的三个阶段:建立连接、数据传送、释放连接。文件传输协议是基于TCPIP协议的一种标准机制下的应用层协议,负责将文件从一台计算机传输到另一台计算机上,并保证其传输的可靠性。要实现与两台计算机所处的位置,联系的方式以使用的操作系统无关,FTP的实现需要解决一下的问题:两个系统可能使用不同的文件名字约定,二个系统可能用不同的方表示文本和数据,二个系统可能有不同的目录结构。解决以上问题从而可以在各种不同网络之间进行文件传输。2 课程设计的内容和要求利用计算机具备Windows环境中套接字socket 的编程接口功能,可为用户提供全网范围的进程通信功能。学会利用已有网络环境设计并实现简单应用层协议,掌握TCP/IP 网络应用程序根本的设计方法和实现技巧。用C+语言实现一个在相同网络环境下的两个不相同的程序如何实现数据上传和下载实现不同计算机之间的文件传送。1将本地计算机上的一个或多个文件传送到远程计算机上上传,或从远程计算机上获取一个或多个文件下载。传送文件实质上是将文件进行复制,然后上传到远程计 算机上,或者是下载到本地计算机上,对源文件不产生影响。2能够传送多种类型,多种结构,多种格式的文件。文本文件,二进制文件,图像文件,声音文件,数据压缩文件。此外,还可以选择文件的格式控制以及文件传送的模式等。用户可以根据通信双方所用的系统及要传送的文件确定在文件传输时选择哪一种文件结构。3提供对本地计算机和远程计算机的目录操作功能。3 课程设计的相关技术实现软件操作系统:windows7windows NT 以上版本皆可编程语言:C+测试环境:MS-DOS3.2 TCP/IP协议技术在T C P / I P协议族中,有两个互不相同的传输协议: T C P传输控制协议和U D P用户数据报协议。T C P为两台主机提供高可靠性的数据通信。它所做的工作包括把应用程序交给它的数据分成适宜的小块交给下面的网络层,确认接收到的分组,设置发送最后确认分组的超时时钟等。由于运输层提供了高可靠性的端到端的通信,因此应用层可以忽略所有这些细节。而另一方面, U D P那么为应用层提供一种非常简单的效劳。它只是把称作数据报的分组从一台主机发送到另一台主机,但并不保证该数据报能到达另一端。任何必需的可靠性必须由应用层来提供。 TCP/IP协议与Winsock网络编程接口Winsock标准不是一种网络协议,而是一套开放的、支持多种协议的Windows写的网络编程接口。Winsock可以访问很多种网络协议,可以把它当作一种协议的封装。现在的Winsock已经根本上实现了与协议无关,可以使用Winsock来调用协议的功能 Winsock API的使用下面给出了使用Winsock进行编程时涉及的主要函数:WSAStartup函数、WSACleanup函数、socket函数、closesocket函数、send函数、recv函数、bind函数、listen函数、accept函数、connect函数 4 课程设计过程使用Socket进行Client/Server程序设计的一般连接过程是这样的:Server端Listen监听某个端口是否有连接请求,Client端向Server端发出Coonnect连接请求,Server端向Client端发回Accept接受信息,一个连接就建立起来了。Server端和Client端都可以通过send,put,dir等方法与对方通信.1. 客户端指定要索取效劳器端的哪个文件夹的内容,即在客户端将效劳器端某个文件夹的路径发送给效劳器端。2.效劳器端解析这个字符串,遍历整个文件夹,将文件夹中的文件逐个传回到客户端。3.客户端逐个接收效劳器端传来的文件,安放到指定的目录下。1.效劳器端调用socket的accept方法,等待客户端联接。2.客户端发送需要从效劳端获得的文件夹路径给效劳器端。3.效劳器端根据客户端发来的路径遍历整个路径下的文件及文件夹,并将需要传送到文件记录全路径记录到一个String类型的数组中,并将文件的个数发送给客户端。4.客户端接收效劳器端发来的文件个数,并向效劳器端发送关闭联接请求,并关闭客户端连接。5.效劳器端收取关闭连接请求,将socket关闭,进入传输文件循环中。6.效劳器端调用socket的accept方法,等待客户端联接。7.客户端根据刚刚取得的要传输的文件数,进行循环获取文件,记得每次取完文件要关闭socket连接,这样就不会将多个文件写入到同一个文件中。4.3系统的根本功能1.get:取远方的一个文件2.put:传给远方一个文件3.pwd:显示远主当前目录4.dir:列出远方当前目录5.cd :改变远方当前目录6.? :显示你提供的命令7.quit :退出返回的主要工作流程否开始输入连接的主机号dircd?pwdgetputquit选择显示总菜单列出远方当前目录显示远方当前目录改变远方当前目录取远方的一个文件传给远方一个文件显示结果继续是结束图4-1客户端的主要工作流程4.5主要功能模块如下:1帮助显示客户端主操作菜单void help() cout<<" 欢送进入迷你FTP帮助菜单 "<<endl <<" * * * * * * * * * * * * * * * * * * * * * "<<endl <<" *1.get.下载(接受)文件* "<<endl <<" *get的用法: get 文件名 * "<<endl <<" *2.put.上传(发送)文件* "<<endl <<" *put的用法:put 文件名 * "<<endl <<" *3.pwd.显示当前文件夹的绝对路径* "<<endl <<" *4.dir.显示远方当前目录的文件* "<<endl <<" *5.cd.改变远方当前目录和路径* "<<endl <<" *cd的用法(进入下级目录): cd 路径名 * "<<endl <<" *cd的用法(进入上级目录): cd . * "<<endl <<" *6.?或者help.进入帮助菜单* "<<endl <<" *7.quit.退出FTP* "<<endl <<" * * * * * * * * * * * * * * * * * * * * * "<<endl;2各种处理命令代码void list(SOCKET sockfd) int nRead; while(true) nRead=recv(sockclient,rbuff,1024,0);/recv函数通过sockclient套接口接受数据存入rbuff缓/冲区,返回接受到的字节数 if(nRead=SOCKET_ERROR) printf("read response error!n"); exit(1); if(nRead=0)/数据读取结束 break; /显示数据 rbuffnRead='0' printf("%s",rbuff); int SendFile(SOCKET datatcps,FILE* file)/发送文件,处理put命令 printf(" sending file data."); for(;) /从文件中循环读取数据并发送客户端 int r=fread(sbuff,1,1024,file);/fread函数从file文件读取1个1024长度的数据到sbuff,返/回成功读取的元素个数 if(send(datatcps,sbuff,r,0)=SOCKET_ERROR) printf("lost the connection to client!n"); closesocket(datatcps); return 0; if(r<1024)/文件传送结束 break; closesocket(datatcps); printf("donen"); return 1;DWORD StartSock()/启动winsockWSADATA WSAData;char a20;memset(a,0,20);if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0)/加载winsock版本printf("sock init fail!n");return (-1);if(strncmp(InputIP,a,20)=0)printf("请输入连接的主机IP:");scanf("%s",&InputIP);/设置地址结构ServerAddr.sin_family=AF_INET;/AF_INET表示使用IP地址族ServerAddr.sin_addr.s_addr=inet_addr(InputIP);/指定效劳器IPServerAddr.sin_port=htons(RECV_PORT);/设置端口号return(1);/创立套接字DWORD CreateSocket()sockclient=socket(AF_INET,SOCK_STREAM,0);/当socket函数成功调用时返回一个新的SOCKET(Socket Descriptor)if(sockclient=SOCKET_ERROR)printf("sockclient create fail! n");WSACleanup();return(-1);return(1);DWORD CallServer() /发送连接请求CreateSocket();if (connect(sockclient,(struct sockaddr *)&ServerAddr,sizeof(ServerAddr)=SOCKET_ERROR)/connect函数创立与指定外部端口的/连接printf("Connect fail n");memset(InputIP,0,20);return(-1);return(1);DWORD TCPSend(char data)/发送命令int length;length=send(sockclient,data,strlen(data),0);/send函数通过sockclient接口发送data里面的/数据,发送成功返回发送的字节数if(length<=0)printf("send data error ! n");closesocket(sockclient);WSACleanup();return(-1);return(1);3主函数代码int main()char messge110;/定义输入要处理的文件名 char messge220;/定义输入要处理的文件名 char order30;/输入的命令 order0='0' char buff80;/用以存储经过字串格式化的orderFILE *fd;/File协议主要用于访问本地计算机中的文件,fd指针指向要访问的目标文件FILE *fd2;int count;int sin_size=sizeof(ServerAddr);StartSock();if(CallServer()=-1)return main();/发送连接请求失败,返回主函数printf("n请输入命令输入?或help进入帮助菜单:n");memset(buff,0,80);/清空数组memset(messge2,0,20);memset(order,0,30);memset(messge1,0,10);memset(rbuff,0,1024);memset(sbuff,0,1024);scanf("%s",&messge1);if(strncmp(messge1,"get",3)=0)scanf("%s",&messge2);if(strncmp(messge1,"put",3)=0)scanf("%s",&messge2);if(strncmp(messge1,"cd",2)=0) scanf("%s",&messge2); strcat(order,messge1);/把messge1加在order的末尾strcat(order," ");/命令中间的空格strcat(order,messge2);/把messge2加在order的末尾sprintf(buff,order);/把调整格式的order存入buff/help和?if(strncmp(messge1,"help",4)=0)help();if(strncmp(messge1,"?",1)=0)help();if(strncmp(messge1,"quit",4)=0)printf(" 欢送再次进入迷你FTP,谢谢使用!n");closesocket(sockclient); WSACleanup();return 0;TCPSend(buff);/发送buff里面的数据 recv(sockclient,rbuff,1024,0); printf(rbuff);if(strncmp(rbuff,"get",3)=0) fd=fopen(messge2,"wb");/使用二进制方式,翻开文件,wb只写翻开或新建一/个二进制文件;只允许写数据。 if(fd=NULL) printf("open file %s for weite failed!n",messge2); return 0; while(count=recv(sockclient,rbuff,1024,0)>0) fwrite(rbuff,sizeof(rbuff),count,fd);/把count个数据长度为size0f的数据从/rbuff输入到fd指向的目标文件 fclose(fd);/关闭文件/getif(strncmp(rbuff,"put",3)=0)strcpy(filename,rbuff+9); fd2=fopen(filename,"rb");/rb读写翻开一个二进制文件,只允许读写数据。if(fd2)if(!SendFile(sockclient,fd2) printf("send failed!");return 0; fclose(fd2);/关闭文件else/翻开文件失败 strcpy(sbuff,"can't open file!n"); if(send(sockclient,sbuff,1024,0) return 0;/putif(strncmp(rbuff,"dir",3)=0)printf("n");list(sockclient);/列出接受到的列表内容/dirif(strncmp(rbuff,"pwd",3)=0)list(sockclient);/列出接受到的内容-绝对路径if(strncmp(rbuff,"cd",2)=0)/cdclosesocket(sockclient);/关闭连接WSACleanup();/释放Winsockreturn main();/main4.4程序实现局部如下:客户端:#include "Winsock.h"#include "windows.h"#include "stdio.h"#include "time.h"#include <iostream.h>#define RECV_PORT 3312#define SEND_PORT 4302#pragma comment(lib, "wsock32.lib")SOCKET sockclient;char filename20;/文件名sockaddr_in ServerAddr;/效劳器地址char rbuff1024;/接收缓冲区char sbuff1024;/发送缓冲区char InputIP20;/存储输入的效劳器IP/处理help命令void help() cout<<" 欢送进入迷你FTP帮助菜单 "<<endl <<" * * * * * * * * * * * * * * * * * * * * * "<<endl <<" *1.get.下载(接受)文件* "<<endl <<" *get的用法: get 文件名 * "<<endl <<" *2.put.上传(发送)文件* "<<endl <<" *put的用法:put 文件名 * "<<endl <<" *3.pwd.显示当前文件夹的绝对路径* "<<endl <<" *4.dir.显示远方当前目录的文件* "<<endl <<" *5.cd.改变远方当前目录和路径* "<<endl <<" *cd的用法(进入下级目录): cd 路径名 * "<<endl <<" *cd的用法(进入上级目录): cd . * "<<endl <<" *6.?或者help.进入帮助菜单* "<<endl <<" *7.quit.退出FTP* "<<endl <<" * * * * * * * * * * * * * * * * * * * * * "<<endl;/处理dir命令void list(SOCKET sockfd) int nRead; while(true) nRead=recv(sockclient,rbuff,1024,0);/recv函数通过sockclient套接口接受数据存入rbuff缓/冲区,返回接受到的字节数 if(nRead=SOCKET_ERROR) printf("read response error!n"); exit(1); if(nRead=0)/数据读取结束 break; /显示数据 rbuffnRead='0' printf("%s",rbuff); int SendFile(SOCKET datatcps,FILE* file)/发送文件,处理put命令 printf(" sending file data."); for(;) /从文件中循环读取数据并发送客户端 int r=fread(sbuff,1,1024,file);/fread函数从file文件读取1个1024长度的数据到sbuff,返/回成功读取的元素个数 if(send(datatcps,sbuff,r,0)=SOCKET_ERROR) printf("lost the connection to client!n"); closesocket(datatcps); return 0; if(r<1024)/文件传送结束 break; closesocket(datatcps); printf("donen"); return 1;DWORD StartSock()/启动winsockWSADATA WSAData;char a20;memset(a,0,20);if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0)/加载winsock版本printf("sock init fail!n");return (-1);if(strncmp(InputIP,a,20)=0)printf("请输入连接的主机IP:");scanf("%s",&InputIP);/设置地址结构ServerAddr.sin_family=AF_INET;/AF_INET表示使用IP地址族ServerAddr.sin_addr.s_addr=inet_addr(InputIP);/指定效劳器IPServerAddr.sin_port=htons(RECV_PORT);/设置端口号return(1);/创立套接字DWORD CreateSocket()sockclient=socket(AF_INET,SOCK_STREAM,0);/当socket函数成功调用时返回一个新的SOCKET(Socket Descriptor)if(sockclient=SOCKET_ERROR)printf("sockclient create fail! n");WSACleanup();return(-1);return(1);DWORD CallServer() /发送连接请求CreateSocket();if (connect(sockclient,(struct sockaddr *)&ServerAddr,sizeof(ServerAddr)=SOCKET_ERROR)/connect函数创立与指定外部端口的/连接printf("Connect fail n");memset(InputIP,0,20);return(-1);return(1);DWORD TCPSend(char data)/发送命令int length;length=send(sockclient,data,strlen(data),0);/send函数通过sockclient接口发送data里面的/数据,发送成功返回发送的字节数if(length<=0)printf("send data error ! n");closesocket(sockclient);WSACleanup();return(-1);return(1);int main()char messge110;/定义输入要处理的文件名 char messge220;/定义输入要处理的文件名 char order30;/输入的命令 order0='0' char buff80;/用以存储经过字串格式化的orderFILE *fd;/File协议主要用于访问本地计算机中的文件,fd指针指向要访问的目标文件FILE *fd2;int count;int sin_size=sizeof(ServerAddr);StartSock();if(CallServer()=-1)return main();/发送连接请求失败,返回主函数printf("n请输入命令输入?或help进入帮助菜单:n");memset(buff,0,80);/清空数组memset(messge2,0,20);memset(order,0,30);memset(messge1,0,10);memset(rbuff,0,1024);memset(sbuff,0,1024);scanf("%s",&messge1);if(strncmp(messge1,"get",3)=0)scanf("%s",&messge2);if(strncmp(messge1,"put",3)=0)scanf("%s",&messge2);if(strncmp(messge1,"cd",2)=0) scanf("%s",&messge2); strcat(order,messge1);/把messge1加在order的末尾strcat(order," ");/命令中间的空格strcat(order,messge2);/把messge2加在order的末尾sprintf(buff,order);/把调整格式的order存入buff/help和?if(strncmp(messge1,"help",4)=0)help();if(strncmp(messge1,"?",1)=0)help();if(strncmp(messge1,"quit",4)=0)printf(" 欢送再次进入迷你FTP,谢谢使用!n");closesocket(sockclient); WSACleanup();return 0;TCPSend(buff);/发送buff里面的数据 recv(sockclient,rbuff,1024,0); printf(rbuff);if(strncmp(rbuff,"get",3)=0) fd=fopen(messge2,"wb");/使用二进制方式,翻开文件,wb只写翻开或新建一/个二进制文件;只允许写数据。 if(fd=NULL) printf("open file %s for weite failed!n",messge2); return 0; while(count=recv(sockclient,rbuff,1024,0)>0) fwrite(rbuff,sizeof(rbuff),count,fd);/把count个数据长度为size0f的数据从/rbuff输入到fd指向的目标文件 fclose(fd);/关闭文件/getif(strncmp(rbuff,"put",3)=0)strcpy(filename,rbuff+9); fd2=fopen(filename,"rb");/rb读写翻开一个二进制文件,只允许读写数据。if(fd2)if(!SendFile(sockclient,fd2) printf("send failed!");return 0; fclose(fd2);/关闭文件else/翻开文件失败 strcpy(sbuff,"can't open file!n"); if(send(sockclient,sbuff,1024,0) return 0;/putif(strncmp(rbuff,"dir",3)=0)printf("n");list(sockclient);/列出接受到的列表内容/dirif(strncmp(rbuff,"pwd",3)=0)list(sockclient);/列出接受到的内容-绝对路径if(strncmp(rbuff,"cd",2)=0)/cdclosesocket(sockclient);/关闭连接WSACleanup();/释放Winsockreturn main();/main4.5 程序运行结果截图(1) 输入IP 与效劳器连接进入主界面图4-2 与效劳器连接进入主界面显示图2dir命令操作显示图图4-3 dir命令操作显示图3pwd命令操作显示图图4-4 pwd命令操作显示图4cd命令操作显示图图4-5 cd命令操作显示图5get命令操作显示图图4-6 get命令操作显示图 6 put命令操作图 图4-7 put命令操作图5 课程设计小结通过这次设计,我不但加深了对SOCKET的原始套接字RAW编程的理解,同时也对文件传输有了进一步的认识。本次课程设计较好地实现了要求做到的功能,但同时也遇到了不少的困难和挑战。这次设计的主要难点,在于数据包的发送接收,TTL的计算,以及超时的判断。通过这次的课程设计让我明白了很多,要多读程序,掌握根本的函数,编程要用的话,可以得心应手。通过这次课程设计,我了解到自己网络通讯技术方面还有很多缺乏,在完成实验的过程中同学给了我很大的帮助和鼓励,使我能够很好的完成这次实验。参考书目1吴功宜胡晓英张仁何云王宁.计算机网络课程设计.机械工业出版社,2007年12月2张尧学郭国强王晓春赵艳标.计算机网络与Internet教材第二版.清华大学出版社,2006年11月

注意事项

本文(计算机网络课程设计_FTP文件传输)为本站会员(e****s)主动上传,装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知装配图网(点击联系客服),我们立即给予删除!

温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!