




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验一:文件传输协议的设计与实现目录1. 实验设计目的和要求2. 背景知识3. 课程设计分析4. 程序清单5. 运行结果6. 总结1 .课程设计目的和要求文件传输是各种计算机的网络的基本功能,文件传送协议是一种最基本的应用层协议。它是按照客户或服务器模式进行的工作,提供 交式的访问。是INTERNR使用最广泛的协议之一。以及深入了解计 算机网络是建立在TCP/IP网络体系结构上。用socket编程接口编写俩个程序,分别为客户程序和服务器程 序1 .掌握TCP/IP网络应用程序基本的设计方法;2 .用socket编程接口编写两个程序,分别为客户程序(client.c)和服务器程 序(server
2、.。;3 .撰写课程设计说明书。装订后的课程设计说明书不少于10面(含封面、任务书、目录、正文、参考文献、成绩评定表、封底)。2 .背景知识第一个FTP的RFCk A.K.Bhushan在1971年提出,同时由 MIT 与Harvard实验实现,RFC 17羽供了主机间文件传输的一个用户级 协议。长期发展过程由于底层协议从 NCPt变为TCP RFC765t义了 采用TCP的FCP.FTP协议在今天已经发展成熟,应用也越来越广很多开发的比较成熟的FTP客户端软件已经得到了广泛的应用.3 .课程设计分析Server 端Client 端创建ServerSocket对象,在某端口提供监听服务 Cli
3、ent端II等待来自Client端的服务请求I接受Client端的请求,用返回的创建Socket对象,向ServerSocket建立连接的监听端口请求I通过向Socket中读写数据来 通过向新的Socket中读写数与Client端通信据来与Server端通信关闭Socket,结束与 Server端的通信. 除 关闭Socket,结束与当前Client的通信,等待其他请求关闭ServerSocket对象,结束监听服务4 .程序清单:1 .服务器源代码:#include <Winsock2.h>#include <stdio.h>#include <iostream&
4、gt; using namespace std;#pragma comment(lib, "wsock32.lib")#define PORT 4523char buf_send1024;char buf_rec1024;SOCKET sockSrv;/socket 初始化DWORD CreateSocket() WSADATA WSAData;/WSADA琳勾被用来保存函数 WSAStartup返回的 Windows Sockets初始化信息 if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0)/WSAStartup 完成 winso
5、ck 的初始化 printf("socket initialize failed!n");return (-1);sockSrv=socket(AF_INET,SOCK_STREAM,0);/ 定义为面向连接的,返回值送给 sockSrv if(sockSrv=SOCKET_ERROR)printf("socket create failed ! n");WSACleanup();/ 中止 Windows Sockets DLL 的使用 return(-1);SOCKADDR_IN addrSrv;/TCP/IP 使用 SOCKADDR_I定义地址add
6、rSrv.sin_addr.S_un.S_addr=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 datat
7、cps,WIN32_FIND_DATA *pfd)/ 用于回复给客户端 char filerecordMAX_PATH+32;FILETIME ft;FileTimeToLocalFileTime(&pfd->ftLastWriteTime,&ft);将一个 FILETIME 结构转换成本地时间SYSTEMTIME lastwtime;/ 系统时间 FileTimeToSystemTime(&ft,&lastwtime);/ 根据一个FILETIME 结构的内容,装载一个SYSTEMTIME结构 char *dir=pfd->dwFileAttrib
8、utes&FILE_ATTRIBUTE_DIRECTORY?"<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,filere
9、cord,strlen(filerecord),0)=SOCKET_ERROR)/发送回复失败 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
10、 char *errstr="can't list files!n" cout<<"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的整
11、数时为TRUE返回值为0时候,为FALSE 返回彳!为-1时为ERRORwhile(fMoreFiles)/ 发送此项文件信息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."
12、;);for(;)/ 从文件中循环读取数据并发送客户端int r=fread(buf_send,1,1024,file);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(liste
13、n(sockSrv,5)<0)/ 监听信号 cout<<"Listen error!"<<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);/ 接受
14、请求,产生新的套 接字if(sockconn=INVALID_SOCKET) continue;else cout<<"connecting 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
15、<<endl;if(strncmp(buf_rec,"dir",3)!=0&&strncmp(buf_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(soc
16、kconn);/ 发送当前所有文件名/dirif (strncmp(buf_rec,"get",3)=0)strcpy(filename,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/
17、创建额外数据连接传送数据if(!SendFile(sockconn,file)return 0;fclose(file);/fileelse/ 打开文件失败strcpy(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&
18、quot;);if(fd=NULL)printf("open file %s for weite failed!n",filename); continue;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);continu
19、e;/put 处理客户端的上传请求int main()CreateSocket();ProcessCmd();return(1);2 . 客户端程序源代码:#include <Winsock2.h>#include <stdio.h>#include <iostream>using namespace std;/ 使用名称空间std#pragma comment(lib, "wsock32.lib")/ 将 WinLib.lib 库加入到工程中进行编译#define PORT 4523/ 定义端口号为4523char send_str10
20、24;char rec_str1024;char IP20;char filename20;SOCKET sockClient;SOCKADDR_IN addrServer;/ 定义表示地址的结构体addrServer ,用来表示本地地址/ 创建套接字 DWORD CreateSock() / 本地信息addrServer.sin_family=AF_INET;/ 地址所属协议簇 /AF 表示 ADDRESS FAMIL饱址族 / htons 的功能:将一个无符号短整型数值转换为网络字节序addrServer.sin_port=htons(PORT);/ 协议端口号WSADATA WSADat
21、a;/WSADA琳勾被用来保存函数 WSAStartup返回的 Windows Sockets初始化信息 WORD wVersionRequsdted;int err;wVersionRequsdted=MAKEWORD(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",&
22、;IP);addrServer.sin_addr.s_addr=inet_addr(IP);/计算机 IP 地址return(1); DWORD ConnectServer() / 连接服务器 sockClient=socket(AF_INET,SOCK_STREAM,0);/创建套接字,SOCK_STREAM面向连接型if(sockClient=SOCKET_ERROR) printf("sock create fail! n");WSACleanup();/ 中止 Windows Sockets DLL 的使用 . return(-1); if(connect(sock
23、Client,(structsockaddr*)&addrServer,sizeof(addrServer)=SOCKET_ERROR)/ 如果请求建立连接错误 printf("Connect fail n"); memset(IP,0,20); return(-1); return(1); void help()cout<<"help List : "<<endl;cout<<"dir directory list "<<endl;cout<<"get d
24、ownload files"<<endl;cout<<"put upload files "<<endl;cout<<"quit exit !"<<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!&qu
25、ot;<<endl;exit(1);if(nRead=0)/数据读取结束break;/显示数据rec_strnRead='0'printf("%s",rec_str);定义变量数据连接套接字int SendFile(SOCKET datatcps,FILE* file)/SOCKET datatcps(cout<<"sending file data."<<endl;for(;)(int r=fread(send_str,1,1024,file);/从一个流中读数据if(send(datatcps,se
26、nd_str,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);int Cprocess()int count;char order10;char param20;char command30;FILE *fd;FILE *fd2;command0='0
27、'CreateSock();ConnectServer();cout<<"please input order :"<<endl;memset(order,0,10);/初始化为0memset(param,0,20);/初始化为0memset(command,0,30);/ 初始化为0memset(rec_str,0,1024);/ 初始化为0memset(send_str,0,1024);/ 初始化为0cin>>order;strcat(command,order);if(strncmp(order,"get"
28、;,3)=0|strncmp(order,"put",3)=0)/输入请求,有一个输入要求正确,输入目标文件名cin>>param;strcat(command," ");strcat(command,param);cout<<command<<endl;strcpy(send_str,command);if(send(sockClient,send_str,sizeof(send_str),0)<0) cout<<"send data error!"<<endl;cl
29、osesocket(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 0;/quitif(strncmp(rec_str,"dir",3)=0)list(sockClient);/dirif(strncmp(rec_str,"get",3)=0) fd=fopen(param,"wb");/ 使用二进制方式创建并打开名为param 的文件if(fd=NULL) / 打开失败 printf("open file %s for weite failed!n",param);return 0;while(count=recv(sockClient,rec_str,1024,0)>0)/接收文件,放入rec_strfwrite(rec_str,sizeof(char),count,fd);fclo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 湖南省郴州市2024-2025学年八年级下学期5月期中英语试题(含笔试答案无听力答案、原文及音频)
- 建筑施工特种作业-建筑起重机械安装拆卸工(施工升降机)真题库-3
- 日食月食地理题目及答案
- 国家标准关于《机械制图》的基本规定(二)
- 2023-2024学年山东省滨州市高二下学期7月期末数学试题(解析版)
- 2023-2024学年湖南省株洲市炎陵县高二下学期6月期末考试数学试题(解析版)
- 2023-2024学年河南省安阳市林州市高二下学期期末考试数学试卷(解析版)
- 2025届河南省新乡市高三二模语文试题(解析版)
- 2024-2025学年浙江省杭州市联谊学校高二3月月考语文试题(解析版)
- 江苏阿尔法生物制药有限公司新建制剂、生物发酵及机械加工建设项目环评资料环境影响
- 基建项目建设综合管理信息系统建设方案
- 汽车吊塔吊防碰撞安全技术交底
- 一年级下册音乐教案 (简谱) (演唱)同坐小竹排(7) 湘艺版
- 砂石料加工厂劳务外包服务采购项目
- 列车网络控制技术-复习打印版
- 福建高考名著《红楼梦》填空题+答案
- 商标法期末复习
- 材料力学计算试题(库)完整
- 投资控股集团有限公司安全生产责任制暂行办法
- NGW型行星齿轮传动系统的优化设计
- 三年级上册数学教案-第七单元 分数的初步认识 苏教版
评论
0/150
提交评论