文件传输协议的设计与实现

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

课程设计任务书学生姓名:专业班级:指导教师:工作单位:信息工程学院题目:文件传输协议的设计与实现初始条件:WindowsXPC++,SOCKET要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1.掌握TCP/IP网络应用程序基本的设计方法;2.用socket编程接口编写两个程序,分别为客户程序(client.c)和服务器程序(server.c);3.撰写课程设计说明书。装订后的课程设计说明书不少于10面(含封面、任务书、目录、正文、参考文献、成绩评定表、封底)。时间安排:6月18日查阅资料、方案论证6月19日方案设计、调试6月20日撰写课程设计说明书6月21日答辩指导教师签名:年月日系主任(或责任教师)签名:年月日运行正确的程序::1.服务器源代码:#includeWinsock2.h#includestdio.h#includeiostreamusingnamespacestd;#pragmacomment(lib,wsock32.lib)#definePORT4523charbuf_send[1024];charbuf_rec[1024];SOCKETsockSrv;//socket初始化DWORDCreateSocket(){WSADATAWSAData;//WSADATA结构被用来保存函数WSAStartup返回的WindowsSockets初始化信息if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0)//WSAStartup完成winsock的初始化{printf(socketinitializefailed!\n);return(-1);}sockSrv=socket(AF_INET,SOCK_STREAM,0);//定义为面向连接的,返回值送给sockSrvif(sockSrv==SOCKET_ERROR){printf(socketcreatefailed!\n);WSACleanup();//中止WindowsSocketsDLL的使用return(-1);}SOCKADDR_INaddrSrv;//TCP/IP使用SOCKADDR_IN定义地址addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//计算机IP地址addrSrv.sin_port=htons(PORT);//协议端口号addrSrv.sin_family=AF_INET;//地址所属协议簇//绑定端口if(bind(sockSrv,(structsockaddrFAR*)&addrSrv,sizeof(addrSrv))==SOCKET_ERROR){printf(BindError);return(-1);}return(1);}intSendFileRecord(SOCKETdatatcps,WIN32_FIND_DATA*pfd)//用于回复给客户端{charfilerecord[MAX_PATH+32];FILETIMEft;FileTimeToLocalFileTime(&pfd-ftLastWriteTime,&ft);//将一个FILETIME结构转换成本地时间SYSTEMTIMElastwtime;//系统时间FileTimeToSystemTime(&ft,&lastwtime);//根据一个FILETIME结构的内容,装载一个SYSTEMTIME结构char*dir=pfd-dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY?DIR:;sprintf(filerecord,%04d-%02d-%02d%02d:%02d%5s%10d%-20s\n,lastwtime.wYear,lastwtime.wMonth,lastwtime.wDay,lastwtime.wHour,lastwtime.wMinute,dir,pfd-nFileSizeLow,pfd-cFileName);if(send(datatcps,filerecord,strlen(filerecord),0)==SOCKET_ERROR)//发送回复失败{printf(Erroroccurswhensendingfilelist!\n);return0;}return1;}//发送主机文件目录intSendFileList(SOCKETdatatcps){HANDLEhff;WIN32_FIND_DATAfd;//获取和更改文件属性hff=FindFirstFile(*,&fd);//搜索文件if(hff==INVALID_HANDLE_VALUE)//搜索无效返回值{constchar*errstr=can'tlistfiles!\n;coutlistfileerror!endl;if(send(datatcps,errstr,strlen(errstr),0)==SOCKET_ERROR){couterroroccurswhensendingfilelist!endl;}closesocket(datatcps);return0;}BOOLfMoreFiles=TRUE;//BOOL型,返回值为大于0的整数时为TRUE,返回值为0时候,为FALSE,返回值为-1时为ERROR。while(fMoreFiles){//发送此项文件信息if(!SendFileRecord(datatcps,&fd))//发送失败{closesocket(datatcps);return0;}//搜索下一个文件fMoreFiles=FindNextFile(hff,&fd);}closesocket(datatcps);return1;}//发送数据intSendFile(SOCKETdatatcps,FILE*file)//发送文件{printf(sendingfiledata..);for(;;)//从文件中循环读取数据并发送客户端{intr=fread(buf_send,1,1024,file);if(send(datatcps,buf_send,r,0)==SOCKET_ERROR){printf(losttheconnectiontoclient!\n);closesocket(datatcps);return0;}if(r1024)//文件传送结束break;}closesocket(datatcps);printf(done\n);return1;}DWORDProcessCmd(){if(listen(sockSrv,5)0)//监听信号{coutListenerror!endl;return(-1);}coutListeningfortherequest……endl;SOCKADDR_INaddrclient;//定义用于返回客户机端地址的结构intlen=(sizeof(SOCKADDR_IN));while(1){SOCKETsockconn=accept(sockSrv,(SOCKADDR*)&addrclient,&len);//接受请求,产生新的套接字if(sockconn==INVALID_SOCKET)continue;elsecoutconnectingfromclientendl;while(true){charfilename[20];memset(buf_rec,0,1024);memset(buf_send,0,1024);if(recv(sockconn,buf_rec,1024,0)=0){break;}coutendlthecommandis:buf_recendl;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-ing\n);send(sockconn,buf_send,1024,0);SendFileList(sockconn);//发送当前所有文件名}//dirif(strncmp(buf_rec,get,3)==0){strcpy(filename,buf_rec+4);coutfilename;FILE*file;//处理下载文件请求file=fopen(filename,rb);//打开下载的文件if(file){sprintf(buf_send,getfile%s\n,filename);if(!send(sockconn,buf_send,1024,0)){fclose(file);return0;}else{//创建额外数据连接传送数据if(!SendFile(sockconn,file))return0;fclose(file);}}//fileelse//打开文件失败{strcpy(buf_send,can'topenfile!\n);if(send(sockconn,buf_send,1024,0))return0;}}//get处理客户端的下载请求if(strncmp(buf_rec,put,3)==0){FILE*fd;intcount;strcpy(filename,buf_rec+4);fd=fopen(filename,wb);if(fd==NULL){printf(openfile%sforweitefailed!\n,filename);continue;}sprintf(buf_send,putfile%s,filename);if(!send(sockconn,buf_send,1024,0)){fclose(fd);return0;}while((count=recv(sockconn,buf_rec,1024,0))0)fwrite(buf_rec,sizeof(char),count,fd);fclose(fd);continue;}//put处理客户端的上传请求}}}intmain(){CreateSocket();ProcessCmd();return(1);}2.客户端程序源代码:#includeWinsock2.h#includestdio.h#includeiostreamusingnamespacestd;//使用名称空间std#pragmacomment(lib,wsock32.lib)//将WinLib.lib库加入到工程中进行编译#definePORT4523//定义端口号为4523charsend_str[1024];charrec_str[1024];charIP[20];charfilename[20];SOCKETsockClient;SOCKADDR_INaddrServer;//定义表示地址的结构体addrServer,用来表示本地地址//创建套接字DWORDCreateSock(){//本地信息addrServer.sin_family=AF_INET;//地址所属协议簇//AF表示ADDRESSFAMILY地址族//htons的功能:将一个无符号短整型数值转换为网络字节序addrServer.sin_port=htons(PORT);//协议端口号WSADATAWSAData;//WSADATA结构被用来保存函数WSAStartup返回的WindowsSockets初始化信息WORDwVersionRequsdted;interr;wVersionRequsdted=MAKEWORD(2,2);err=WSAStartup(wVersionRequsdted,&WSAData);if(err!=0){printf(sockinitf

1 / 19
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功