《FTP文件传输 .docx》由会员分享,可在线阅读,更多相关《FTP文件传输 .docx(23页珍藏版)》请在三一办公上搜索。
1、FTP文件传输 目 录 1 课程设计的目的和意义. 1 1.1设计目的 . 1 1.2设计意义 . 1 2 课程设计的内容和要求. 1 2.1设计的内容 . 1 2.2设计要求 . 1 3 课程设计的相关技术. 2 3.1实现软件 . 2 3.2 TCP/IP协议技术 . 2 3.3 TCP/IP协议与Winsock网络编程接口 . 2 3.4 Winsock API的使用 . 2 4 课程设计过程 . 3 4.1设计思路 . 3 4.2设计方案 . 3 4.3系统的基本功能. 3 4.4客户端的主要工作流程 . 4 4.5主要功能模块如下: . 5 4.4程序实现部分如下: . 10 4.5
2、 程序运行结果截图 . 15 5 课程设计小结 . 18 参考书目 . 18 沈阳理工大学课程设计专用纸 1 课程设计的目的和意义 1.1设计目的 1 文件传送是各种计算机网络都实现的基本功能,文件传送协议是一种最基本的应用层协议按照客户/服务器的模式进行工作,提供交互式的访问,是INTERNET使用最广泛的协议之一。本程序设计主要学会学会利用已有网络环境设计并实现简单应用层协议,掌握TCP/IP 网络应用程序基本的设计方法和实现技巧,理解处于相同网络环境下的两个不相同的程序如何实现数据上传和下载,进一步理解服务器和客户端的工作原理及通信方法,在数据交互中掌握TCP/IP的体系结构,体会TCP
3、的运输连接管理的三个阶段:建立连接、数据传送、释放连接。 1.2设计意义 文件传输协议是基于TCPIP协议的一种标准机制下的应用层协议,负责将文件从一台计算机传输到另一台计算机上,并保证其传输的可靠性。要实现与两台计算机所处的位置,联系的方式以使用的操作系统无关,FTP的实现需要解决一下的问题:两个系统可能使用不同的文件名字约定,二个系统可能用不同的方表示文本和数据,二个系统可能有不同的目录结构。解决以上问题从而可以在各种不同网络之间进行文件传输。 2 课程设计的内容和要求 2.1设计的内容 利用计算机具备Windows环境中套接字socket 的编程接口功能,可为用户提供全网范围的进程通信功
4、能。学会利用已有网络环境设计并实现简单应用层协议,掌握TCP/IP 网络应用程序基本的设计方法和实现技巧。用C+语言实现一个在相同网络环境下的两个不相同的程序如何实现数据上传和下载。 2.2设计要求 将本地计算机上的一个或多个文件传送到远程计算机上,或从远程计算机上获取一个或多个文件。传送文件实质上是将文件进行复制,然后上传到远程计 算机上,或 1 沈阳理工大学课程设计专用纸 者是下载到本地计算机上,对源文件不产生影响。 2 能够传送多种类型,多种结构,多种格式的文件。此外,还可以选择文件的格式控制以及文件传送的模式等。用户可以根据通信双方所用的系统及要传送的文件确定在文件传输时选择哪一种文件
5、结构。 提供对本地计算机和远程计算机的目录操作功能。 3 课程设计的相关技术 3.1实现软件 操作系统:windows7 编程环境:VC+6.0 编程语言:C+ 测试环境:MS-DOS 3.2 TCP/IP协议技术 在T C P / I P协议族中,有两个互不相同的传输协议: T C P和U D P。T C P为两台主机提供高可靠性的数据通信。它所做的工作包括把应用程序交给它的数据分成合适的小块交给下面的网络层,确认接收到的分组,设置发送最后确认分组的超时时钟等。由于运输层提供了高可靠性的端到端的通信,因此应用层可以忽略所有这些细节。而另一方面, U D P则为应用层提供一种非常简单的服务。它
6、只是把称作数据报的分组从一台主机发送到另一台主机,但并不保证该数据报能到达另一端。任何必需的可靠性必须由应用层来提供。 3.3 TCP/IP协议与Winsock网络编程接口 Winsock规范不是一种网络协议,而是一套开放的、支持多种协议的Windows写的网络编程接口。Winsock可以访问很多种网络协议,可以把它当作一种协议的封装。现在的Winsock已经基本上实现了与协议无关,可以使用Winsock来调用协议的功能 3.4 Winsock API的使用 下面给出了使用Winsock进行编程时涉及的主要函数: 2 沈阳理工大学课程设计专用纸 3 WSAStartup函数、WSACleanu
7、p函数、socket函数、closesocket函数、send函数、recv函数、bind函数、listen函数、accept函数、connect函数 4 课程设计过程 4.1设计思路 使用Socket进行Client/Server程序设计的一般连接过程是这样的:Server端Listen某个端口是否有连接请求,Client端向Server端发出Coonnect请求,Server端向Client端发回Accept信息,一个连接就建立起来了。Server端和Client端都可以通过send,put,dir等方法与对方通信. 1. 客户端指定要索取服务器端的哪个文件夹的内容,即在客户端将服务器端某
8、个文件夹的路径发送给服务器端。 2.服务器端解析这个字符串,遍历整个文件夹,将文件夹中的文件逐个传回到客户端。 3.客户端逐个接收服务器端传来的文件,安放到指定的目录下。 4.2设计方案 1.服务器端调用socket的accept方法,等待客户端联接。 2.客户端发送需要从服务端获得的文件夹路径给服务器端。 3.服务器端根据客户端发来的路径遍历整个路径下的文件及文件夹,并将需要传送到文件记录全路径记录到一个String类型的数组中,并将文件的个数发送给客户端。 4.客户端接收服务器端发来的文件个数,并向服务器端发送关闭联接请求,并关闭客户端连接。 5.服务器端收取关闭连接请求,将socket关
9、闭,进入传输文件循环中。 6.服务器端调用socket的accept方法,等待客户端联接。 7.客户端根据刚才取得的要传输的文件数,进行循环获取文件,记得每次取完文件要关闭socket连接,这样就不会将多个文件写入到同一个文件中。 4.3系统的基本功能 1.get:取远方的一个文件 2.put:传给远方一个文件 3.pwd:显示远主当前目录 4.dir:列出远方当前目录 5.cd :改变远方当前目录 6.? :显示你提供的命令 7.quit :退出返回 3 沈阳理工大学课程设计专用纸 4.4客户端的主要工作流程 4 开始 输入连接的主机号 选择 ? dir pwd cd get put qui
10、t 显示总菜单 列出远方当前目录 显示远方当前目录 改变远方当前目录 取远方的一个文件 传给远方一个文件 是 显示结果 继续 否 结束 图4-1客户端的主要工作流程 4 沈阳理工大学课程设计专用纸 4.5主要功能模块如下: 帮助显示客户端主操作菜单 5 void help cout 欢迎进入迷你FTP帮助菜单 endl * * * * * * * * * * * * * * * * * * * * * endl *1.get.下载(接受)文件* endl *get的用法: get 文件名 * endl *2.put.上传(发送)文件* endl *put的用法:put 文件名 * endl *
11、3.pwd.显示当前文件夹的绝对路径* endl *4.dir.显示远方当前目录的文件* endl *5.cd.改变远方当前目录和路径* endl *cd的用法(进入下级目录): cd 路径名 * endl *cd的用法(进入上级目录): cd . * endl *6.?或者help.进入帮助菜单* endl *7.quit.退出FTP* endl * * * * * * * * * * * * * * * * * * * * * endl; 各种处理命令代码 void list(SOCKET sockfd) int nRead; while(true) nRead=recv(sockclie
12、nt,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命令 5 沈阳理工大学课程设计专用纸 6 printf( sending file data.); for(;)
13、/从文件中循环读取数据并发送客户端 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(r1024)/文件传送结束 break; closesocket(datatcps); printf(donen); return 1; DWORD StartSock
14、/启动winsock WSADATA 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=i
15、net_addr(InputIP);/指定服务器IP ServerAddr.sin_port=htons(RECV_PORT);/设置端口号 return(1); /创建套接字 DWORD CreateSocket sockclient=socket(AF_INET,SOCK_STREAM,0);/当socket函数成功调用时返回一个新的SOCKET(Socket Descriptor) if(sockclient=SOCKET_ERROR) 6 沈阳理工大学课程设计专用纸 7 printf(sockclient create fail! n); WSACleanup; return(-1);
16、 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,
17、strlen(data),0);/send函数通过sockclient接口发送data里面的/数据,发送成功返回发送的字节数 if(length0) fwrite(rbuff,sizeof(rbuff),count,fd);/把count个数据长度为size0f的数据从/rbuff输入到fd指向的目标文件 fclose(fd);/关闭文件 /get if(strncmp(rbuff,put,3)=0) strcpy(filename,rbuff+9); fd2=fopen(filename,rb);/rb读写打开一个二进制文件,只允许读写数据。 if(fd2) if(!SendFile(soc
18、kclient,fd2) printf(send failed!); return 0; fclose(fd2);/关闭文件 else/打开文件失败 strcpy(sbuff,cant open file!n); if(send(sockclient,sbuff,1024,0) return 0; /put if(strncmp(rbuff,dir,3)=0) printf(n); list(sockclient);/列出接受到的列表内容 /dir if(strncmp(rbuff,pwd,3)=0) list(sockclient);/列出接受到的内容-绝对路径 if(strncmp(rbu
19、ff,cd,2)=0) /cd closesocket(sockclient);/关闭连接 WSACleanup;/释放Winsock return main; /main 9 沈阳理工大学课程设计专用纸 4.4程序实现部分如下: 10 客户端: #include Winsock.h #include windows.h #include stdio.h #include time.h #include #define RECV_PORT 3312 #define SEND_PORT 4302 #pragma comment(lib, wsock32.lib) SOCKET sockclien
20、t; 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 文件名
21、* 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(
22、sockclient,rbuff,1024,0);/recv函数通过sockclient套接口接受数据存入rbuff缓/冲区, 10 沈阳理工大学课程设计专用纸 11 返回接受到的字节数 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
23、.); 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(r1024)/文件传送结束 break; closesocket(datatcps); printf(donen); return 1; DWOR
24、D StartSock/启动winsock WSADATA WSAData; char a20; memset(a,0,20); if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0)/加载winsock版本 printf(sock init fail!n); return (-1); 11 沈阳理工大学课程设计专用纸 12 if(strncmp(InputIP,a,20)=0) printf(请输入连接的主机IP:); scanf(%s,&InputIP); /设置地址结构 ServerAddr.sin_family=AF_INET;/AF_INET表示使用IP地
25、址族 ServerAddr.sin_addr.s_addr=inet_addr(InputIP);/指定服务器IP ServerAddr.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
26、; 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(soc
27、kclient,data,strlen(data),0);/send函数通过sockclient接口发送data里面的/数据,发送成功返回发送的字节数 if(length=0) printf(send data error ! n); 12 沈阳理工大学课程设计专用纸 closesocket(sockclient); WSACleanup; return(-1); return(1); int main char messge110;/定义输入要处理的文件名 char messge220;/定义输入要处理的文件名 char order30;/输入的命令 order0=0; char buff80;/用以存储经过字串格式化的order FILE *fd;/File协议主要用于访问本地计算机中的文件,fd指针指向要访问的目标文件 FILE *fd2; int count; int sin_size=sizeof(ServerAddr); StartSock; if(CallServer=-1) return main;/发送连接请求失败,返回主函数 printf(n请输入命令:n); memset(buff,0,80);/清空数组 memset(messge2,0,20); memset(order,0,30