实验一-文件传输协议设计_第1页
实验一-文件传输协议设计_第2页
实验一-文件传输协议设计_第3页
实验一-文件传输协议设计_第4页
实验一-文件传输协议设计_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

1、实验一:文件传输协议的设计与实现 目录1.实验设计目的和要求2.背景知识3.课程设计分析4.程序清单5.运行结果6.总结1. 课程设计目的和要求文件传输是各种计算机的网络的基本功能,文件传送协议是一种最基本的应用层协议。它是按照客户或服务器模式进行的工作,提供交式的访问。是INTERNRT使用最广泛的协议之一。以及深入了解计算机网络是建立在TCP/IP网络体系结构上。用 socket 编程接口编写俩个程序,分别为客户程序和服务器程序1 掌握TCP/IP 网络应用程序基本的设计方法;2 用socket 编程接口编写两个程序,分别为客户程序(client.c)和服务器程序(server.c);3

2、撰写课程设计说明书。装订后的课程设计说明书不少于10面(含封面、任务书、目录、正文、参考文献、成绩评定表、封底)。2. 背景知识第一个FTP的RFC由A.K.Bhushan 在1971年提出,同时由MIT与Harvard实验实现,RFC 172提供了主机间文件传输的一个用户级协议。长期发展过程由于底层协议从NCP改变为TCP,RFC765定义了采用TCP的FCP. FTP协议在今天已经发展成熟,应用也越来越广很多开发的比较成熟的FTP客户端软件已经得到了广泛的应用.3. 课程设计分析 Server端 Client端创建ServerSocket对象,在某端口提供监听服务Client端 等待来自C

3、lient端的服务请求 接受Client端的请求,用返回的 创建Socket对象,向Server Socket建立连接 的监听端口请求 通过向Socket中读写数据来 通过向新的Socket中读写数与Client端通信 据来与Server端通信关闭Socket,结束与Server端的通信 关闭Socket,结束与当前 Client的通信,等待其他请求关闭ServerSocket对象,结束监听服务4.程序清单:1. 服务器源代码:#include <Winsock2.h>#include <stdio.h>#include <iostream>using na

4、mespace std;#pragma comment(lib, "wsock32.lib")#define PORT 4523char buf_send1024;char buf_rec1024;SOCKET sockSrv;/socket初始化DWORD CreateSocket()WSADATA WSAData;/WSADATA结构被用来保存函数WSAStartup返回的Windows Sockets初始化信息if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0)/WSAStartup完成winsock的初始化printf(&quo

5、t;socket initialize failed!n");return (-1);sockSrv=socket(AF_INET,SOCK_STREAM,0);/定义为面向连接的,返回值送给sockSrvif(sockSrv=SOCKET_ERROR)printf("socket create failed ! n");WSACleanup();/中止Windows Sockets DLL的使用return(-1);SOCKADDR_IN addrSrv;/TCP/IP使用SOCKADDR_IN 定义地址addrSrv.sin_addr.S_un.S_addr=

6、htonl(INADDR_ANY);/计算机IP地址addrSrv.sin_port=htons(PORT);/协议端口号addrSrv.sin_family=AF_INET;/地址所属协议簇/绑定端口if(bind(sockSrv,(struct sockaddr FAR *)&addrSrv,sizeof(addrSrv)=SOCKET_ERROR)printf("Bind Error");return(-1);return (1);int SendFileRecord(SOCKET datatcps,WIN32_FIND_DATA *pfd)/用于回复给客户端

7、char filerecordMAX_PATH+32;FILETIME ft;FileTimeToLocalFileTime(&pfd->ftLastWriteTime,&ft);/将一个FILETIME结构转换成本地时间 SYSTEMTIME lastwtime;/系统时间FileTimeToSystemTime(&ft,&lastwtime);/根据一个FILETIME结构的内容,装载一个SYSTEMTIME结构 char *dir=pfd->dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY?"

8、<DIR>":" "sprintf(filerecord,"%04d-%02d-%02d %02d:%02d %5s %10d %-20sn", lastwtime.wYear,lastwtime.wMonth,lastwtime.wDay,lastwtime.wHour,lastwtime.wMinute,dir,pfd->nFileSizeLow,pfd->cFileName);if(send(datatcps,filerecord,strlen(filerecord),0)=SOCKET_ERROR)/发送回复失败

9、printf("Error occurs when sending file list!n");return 0;return 1;/发送主机文件目录int SendFileList(SOCKET datatcps)HANDLE hff;WIN32_FIND_DATA fd; /获取和更改文件属性hff=FindFirstFile("*",&fd);/搜索文件if(hff=INVALID_HANDLE_VALUE)/搜索无效返回值const char *errstr="can't list files!n"cout&l

10、t;<"list file error!"<<endl;if(send(datatcps,errstr,strlen(errstr),0)=SOCKET_ERROR)cout<<"error occurs when sending file list!"<<endl;closesocket(datatcps);return 0;BOOL fMoreFiles=TRUE;/BOOL型,返回值为大于0的整数时为TRUE,返回值为0时候,为FALSE,返回值为-1时为ERROR。while(fMoreFiles)/发送

11、此项文件信息if(!SendFileRecord(datatcps,&fd)/发送失败closesocket(datatcps);return 0;/搜索下一个文件fMoreFiles=FindNextFile(hff,&fd);closesocket(datatcps);return 1;/发送数据int SendFile(SOCKET datatcps,FILE* file)/发送文件printf("sending file data.");for(;)/从文件中循环读取数据并发送客户端int r=fread(buf_send,1,1024,file);

12、if(send(datatcps,buf_send,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 ProcessCmd()if(listen(sockSrv,5)<0)/监听信号cout<<"Listen error!"<

13、<endl;return(-1);cout<<"Listening for the request"<<endl;SOCKADDR_IN addrclient;/定义用于返回客户机端地址的结构int len=(sizeof(SOCKADDR_IN);while(1)SOCKET sockconn=accept(sockSrv,(SOCKADDR*)&addrclient,&len);/接受请求,产生新的套接字if(sockconn=INVALID_SOCKET)continue;else cout<<"co

14、nnecting from client"<<endl;while(true)char filename20;memset(buf_rec,0,1024);memset(buf_send,0,1024);if(recv(sockconn,buf_rec,1024,0)<=0)break; cout<<endl<<"the command is:"<<buf_rec<<endl;if(strncmp(buf_rec,"dir",3)!=0&&strncmp(buf_

15、rec,"get",3)!=0&&strncmp(buf_rec,"put",3)!=0)continue;/有一个请求正确执行下面语句if(strncmp(buf_rec,"dir",3)=0)strcpy(buf_send,"dir-ingn");send(sockconn,buf_send,1024,0);SendFileList(sockconn);/发送当前所有文件名/dirif (strncmp(buf_rec,"get",3)=0) strcpy(filename,

16、buf_rec+4);cout<<filename;FILE *file; /处理下载文件请求file=fopen(filename,"rb");/打开下载的文件if(file) sprintf(buf_send,"get file %sn",filename);if(!send(sockconn,buf_send,1024,0)fclose(file);return 0;else/创建额外数据连接传送数据if(!SendFile(sockconn,file)return 0;fclose(file);/fileelse/打开文件失败strc

17、py(buf_send,"can't open file!n");if(send(sockconn,buf_send,1024,0)return 0;/get 处理客户端的下载请求if(strncmp(buf_rec,"put",3)=0)FILE *fd;int count;strcpy(filename,buf_rec+4); fd=fopen(filename,"wb");if(fd=NULL)printf("open file %s for weite failed!n",filename);con

18、tinue;sprintf(buf_send,"put file %s",filename);if(!send(sockconn,buf_send,1024,0)fclose(fd);return 0;while(count=recv(sockconn,buf_rec,1024,0)>0)fwrite(buf_rec,sizeof(char),count,fd);fclose(fd);continue;/put 处理客户端的上传请求int main()CreateSocket();ProcessCmd();return(1);2. 客户端程序源代码:#include

19、<Winsock2.h>#include <stdio.h>#include <iostream>using namespace std;/使用名称空间std#pragma comment(lib, "wsock32.lib")/将WinLib.lib库加入到工程中进行编译#define PORT 4523/定义端口号为4523char send_str1024;char rec_str1024;char IP20;char filename20;SOCKET sockClient;SOCKADDR_IN addrServer;/定义表示

20、地址的结构体addrServer,用来表示本地地址/创建套接字DWORD CreateSock()/本地信息addrServer.sin_family=AF_INET;/地址所属协议簇/AF表示ADDRESS FAMILY 地址族/ htons的功能:将一个无符号短整型数值转换为网络字节序addrServer.sin_port=htons(PORT);/协议端口号WSADATA WSAData;/WSADATA结构被用来保存函数WSAStartup返回的Windows Sockets初始化信息WORD wVersionRequsdted;int err;wVersionRequsdted=MA

21、KEWORD(2,2);err=WSAStartup(wVersionRequsdted,&WSAData);if(err!=0)printf("sock init fail!n");return(-1);cout<<"please input the IP of host:"scanf("%s",&IP);addrServer.sin_addr.s_addr=inet_addr(IP);/计算机IP地址return(1);DWORD ConnectServer() /连接服务器sockClient=soc

22、ket(AF_INET,SOCK_STREAM,0);/创建套接字,SOCK_STREAM为面向连接型if(sockClient=SOCKET_ERROR)printf("sock create fail! n");WSACleanup();/中止Windows Sockets DLL的使用.return(-1);if(connect(sockClient,(struct sockaddr *)&addrServer,sizeof(addrServer)=SOCKET_ERROR)/如果请求建立连接错误printf("Connect fail n"

23、;);memset(IP,0,20);return(-1);return(1);void help()cout<<"help List:"<<endl;cout<<"dirdirectory list "<<endl;cout<<"getdownload files"<<endl;cout<<"putupload files "<<endl;cout<<"quitexit !"<&l

24、t;endl; /list读取服务器列表void list(SOCKET sock)int nRead;while(true)nRead=recv(sock,rec_str,1024,0);/从一个套接口接收数据if(nRead=SOCKET_ERROR)cout<<"read response error!"<<endl;exit(1);if(nRead=0)/数据读取结束break;/显示数据rec_strnRead='0'printf("%s",rec_str);int SendFile(SOCKET dat

25、atcps,FILE* file)/SOCKET datatcps定义变量数据连接套接字 cout<<"sending file data."<<endl;for(;)int r=fread(send_str,1,1024,file);/从一个流中读数据 if(send(datatcps,send_str,r,0)=SOCKET_ERROR)printf("lost the connection to client!n");closesocket(datatcps);return 0;if(r<1024)/文件传送结束bre

26、ak;closesocket(datatcps);/关闭接口printf("donen");return(1);int Cprocess()int count;char order10;char param20;char command30;FILE *fd;FILE *fd2;command0='0'CreateSock();ConnectServer();cout<<"please input order :"<<endl;memset(order,0,10);/初始化为0memset(param,0,20);

27、/初始化为0memset(command,0,30);/初始化为0memset(rec_str,0,1024);/初始化为0memset(send_str,0,1024);/初始化为0cin>>order;strcat(command,order);if(strncmp(order,"get",3)=0|strncmp(order,"put",3)=0)/输入请求,有一个输入要求正确,输入目标文件名cin>>param;strcat(command," ");strcat(command,param);cout

28、<<command<<endl;strcpy(send_str,command);if(send(sockClient,send_str,sizeof(send_str),0)<0)cout<<"send data error!"<<endl;closesocket(sockClient);WSACleanup();return 0;recv(sockClient,rec_str,1024,0);/接受链接数据,放入rec_strcout<<rec_str<<endl;if(strncmp(command,"quit",4)=0)closesocket(sockClient);WSACleanup();return

温馨提示

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

评论

0/150

提交评论