计算机网络 课程设计.doc_第1页
计算机网络 课程设计.doc_第2页
计算机网络 课程设计.doc_第3页
计算机网络 课程设计.doc_第4页
计算机网络 课程设计.doc_第5页
免费预览已结束,剩余11页可下载查看

下载本文档

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

文档简介

计算机网络课程设计 FTP模拟实现一、任务描述实现一个Windows平台上的简化版FTP应用,包括FTP客户端和FTP服务器程序,两个程序基于 Socket接口相互合作,至少实现任意文件的上传和下载功能。限定C语言。二、程序设计1.协议描述用户接口用户协议数据传输终端文件系统服务器协议接口服务器数据传输控制连接数据连接文件系统FTP 是File Transfer Protocol(文件传输协议)的英文简称,用于Internet上的控制文件的双向传输。在实现的层面上,FTP又可理解为一个可用于文件传输的客户机/服务器系统,该系统包括客户机端程序和服务器端程序,客户端和服务器端通信规则为FTP协议。用户通过客户机程序向服务器程序发出命令请求,服务器程序执行用户所发出的命令,并将执行的结果返回到客户机。比如说,用户发出一条命令,要求服务器向用户传送某一个文件的一份拷贝,服务器会响应这条命令,将指定文件送至用户的机器上。客户机程序接收到这个文件,将其存放在用户目录中。在通信协议的分层模型中,文件传输协议是在TCP(Transmission control Protocol,传输控制协议)之上的一个应用层协议,应用程序之间的通信需要用到传输层提供的字节流透明无误传输服务。Windows操作系统具有TCP/IP协议栈,应用程序可通过Winsock API函数的调用实现端到端透明数据链接的建立。2. 程序流程图 服务器端 客户端三、程序实现1.主要函数服务端:函数名:sdirfun说明: 用于处理来自客户端的目录查询命令输入参数: SOCKET h_NewSocket,命令通过此socket接收到,可通过它响应命令。函数名:sgetfun说明: 用于处理来自客户端的文件下载命令输入参数: SOCKET h_NewSocket,命令通过此socket接收到,可通过它响应命令。函数名:sputfun说明: 用于处理来自客户端的文件上传命令函数名:spwdfun说明: 用于处理来自客户端的当前路径查询命令函数名:scdfun说明: 用于处理来自客户端的当前路径设置命令函数名:smdfun说明: 用于处理来自客户端的当前文件夹新建命令函数名:sdelfun说明: 用于处理来自客户端的文件删除命令客户端函数名:dirfun说明: 按协议规则构建目录查询命令并发送到服务器输入参数: SOCKET h_Socket4Cmd,通过此socket发送命令到服务器。函数名:getfun说明: 按协议规则构建文件下载命令并发送到服务器输入参数: SOCKET h_Socket4Cmd,通过此socket发送命令到服务器。函数名:putfun说明: 按协议规则构建文件上传命令并发送到服务器输入参数: SOCKET h_Socket4Cmd,通过此socket发送命令到服务器。函数名:pwdfun说明: 按协议规则构建文件当前路径查询命令并发送到服务器函数名:cdfun说明: 按协议规则构建文件当前路径设置命令并发送到服务器输入参数: SOCKET h_Socket4Cmd,通过此socket发送命令到服务器。说明: 按协议规则构建文件夹新建命令并发送到服务器输入参数: SOCKET h_Socket4Cmd,通过此socket发送命令到服务器。函数名:delfun说明: 按协议规则构建文件删除命令并发送到服务器输入参数: SOCKET h_Socket4Cmd,通过此socket发送命令到服务器。函数名:delfun说明: 帮助函数,按?号回车,则列出命令列表2. 编码中遇到的问题及其解决(1)对socket编程不了解,通过上网百度,找些类似源代码,学习socket编程(2)c语言用的少遗忘很多,翻看以往的笔记,复习c语言。四、总结通过本次计算机网络课程设计,我更加充分的理解了课本上的知识,并能够加以扩展,从而应用于实践当中,这几天的课程设计令我受益匪浅,很多平时模棱两可的知识点都认真复习并实践了。本次课程设计是运用VisualC+6.0作为开发平台以及进行编写程序,在此设计过程中主要经过了审题、需求分析与可行性研究,然后形成设计思路,设计所要实现的功能,最后进行程序的编写与调试,这个过程是不断出现问题并不断的进行修改,深深的感受到亲自动手实践的重要性。在实验的过程中发现学好基础理论知识的重要性,在设计过程中,不断遇到问题,通过老师和同学的帮助,解决了过程中出现的各种问题。通过本次课程设计,我发现了自己的不足,希望在以后的学习中能够加强学习,提高实际应用能力,和解决问题的能力。五、程序清单服务端:#include #include #include #pragma comment(lib,ws2_32.lib)WSADATA wsd;char SendBuffer80,RecvBuffer80;/发送缓冲区及接收缓冲区#define DEFAULT_LSTN_PORT 2416 /本地默认监听端口int n,bytes;SOCKET h_NewSocket; /accept函数产生的新socketstruct sockaddr_in RemoteAddr; char path80=;char strObject100=;int iSynError=1; int sgetfun(SOCKET h_NewSocket);int sputfun(SOCKET h_NewSocket);int main(int argc, char *argv) struct sockaddr_in SLocalAddr; SOCKET h_Socket4Lstn; /欲用作监听的socket int addr_in_len;/地址长度 /初始化winsock if (WSAStartup(MAKEWORD(2,2), &wsd) != 0) WSACleanup(); printf(WSAStartup failedn); memset(&SLocalAddr,0,sizeof(SLocalAddr); /创建socket h_Socket4Lstn = socket(PF_INET, SOCK_STREAM, 0); if (h_Socket4Lstn 0) printf(creating socket failedn); SLocalAddr.sin_family = AF_INET; if(argc = 2) SLocalAddr.sin_port = htons(u_short)atoi(argv1); else SLocalAddr.sin_port = htons(DEFAULT_LSTN_PORT); SLocalAddr.sin_addr.s_addr = INADDR_ANY; /绑定socket if (bind(h_Socket4Lstn,(struct sockaddr *)(&SLocalAddr),sizeof(SLocalAddr) 0) printf(Bind failed!n); while (1) /主循环 listen(h_Socket4Lstn,3); /启动监听 addr_in_len = sizeof(RemoteAddr); /接受连接请求 h_NewSocket = accept( h_Socket4Lstn, (struct sockaddr *) (&RemoteAddr) , &addr_in_len); if (h_NewSocket = INVALID_SOCKET) break;/出错退出 printf(%s is connected at port %d n,inet_ntoa(RemoteAddr.sin_addr), ntohs(SLocalAddr.sin_port); sprintf(SendBuffer,200 Welcome rn); /向客户端发送欢迎消息 bytes = send(h_NewSocket, SendBuffer, strlen(SendBuffer), 0); sprintf(SendBuffer,530 Log in rn); bytes = send(h_NewSocket, SendBuffer, strlen(SendBuffer), 0); while (1) /接收客户端的命令并调用命令处理函数 n = 0; iSynError=1; while (1) bytes = recv(h_NewSocket, &RecvBuffern, 1, 0); if (bytes 0) | (bytes = 0) break; if (RecvBuffern = $) RecvBuffern = 0; break; if (RecvBuffern != r) n+; if (bytes 0) | (bytes = 0) break; printf(The Server received: %s cmd from client n, RecvBuffer); /命令识别 /文件下载 if (strncmp(RecvBuffer,get,3)=0) sgetfun(h_NewSocket); /文件上传 if (strncmp(RecvBuffer,put,3)=0) sputfun(h_NewSocket); if (strncmp(RecvBuffer,quit,4)=0) /退出命令 printf(quit n); sprintf(SendBuffer, 221 Bye bye . rn); bytes = send(h_NewSocket, SendBuffer, strlen(SendBuffer), 0); iSynError=0; break; if (iSynError=1) /Syntax error printf(command unrecognized, non-implemented!n); sprintf(SendBuffer, 500 Syntax error. n); bytes = send(h_NewSocket, SendBuffer, strlen(SendBuffer), 0); closesocket(h_NewSocket); printf(%s disconnected from port %d, control socket is closed.n, inet_ntoa(RemoteAddr.sin_addr),ntohs(SLocalAddr.sin_port); closesocket(h_Socket4Lstn); /释放监听的socket return 0;int sgetfun(SOCKET h_NewSocket) int i=4,k=0; char FileName20,temp_buffer80;char *p_FileName=strObject; FILE *fp;printf(required file is: ); /打印文件名到屏幕while (1) /提取文件名 bytes = recv(h_NewSocket, &RecvBufferi, 1, 0); printf(%c,RecvBufferi); if (bytes 0) strcat(strObject,); strcat(strObject,FileName); /打开客户端欲下载的文件 if( (fp=fopen(p_FileName,r) = NULL ) /未成功打开文件 sprintf(SendBuffer, Sorry, cannot open %s. Please try again.rn, FileName); bytes = send(h_NewSocket, SendBuffer, strlen(SendBuffer), 0); sprintf(SendBuffer, 226 Transfer completed. rn); bytes = send(h_NewSocket, SendBuffer, strlen(SendBuffer), 0); return 1; else printf(The file %s is found,ready to transfer.n,FileName); sprintf(SendBuffer, 125 Transfering. rn); bytes = send(h_NewSocket, SendBuffer, strlen(SendBuffer), 0); while (fgets(temp_buffer,80,fp)!=NULL) /循环读取文件并通过h_NewSocket发送到客户端 sprintf(SendBuffer,%s,temp_buffer); send(h_NewSocket, SendBuffer, 80, 0); printf(.); /文件发送中,每发80个字节在屏幕打一个点号 fclose(fp); sprintf(SendBuffer, 226 Transfer completed. rn); bytes = send(h_NewSocket, SendBuffer, strlen(SendBuffer), 0); iSynError=0; printf(get command has been done! n); return 0;int sputfun(SOCKET newsocket)printf(Equivalent to put. n); int i=4,k=0;char filename20;/ identify the filename from rbuffer after the word RETR while (1)bytes = recv(newsocket, &RecvBufferi, 1, 0);if (bytes 0)strcat(strObject,);strcat(strObject,filename);printf(filename=%s,strObject);char *p_filename=strObject; FILE *fpse;if( (fpse=fopen(strObject,w) = NULL )printf(open errer);return 1;elseprintf(The file %s found,ready to transfer.n,filename); while(1)/读取流并显示int ret;ret = recv(newsocket, RecvBuffer, 80, 0);if (ret = 0) / Graceful closereturn 0;else if (ret = SOCKET_ERROR)printf(recv() failed: %dn, WSAGetLastError();return 0;if(strncmp(RecvBuffer,226 Transfer,strlen(226 Transfer)=0)break;fprintf(fpse,%s,RecvBuffer);printf(RBUFFER=%s,RecvBuffer);fclose(fpse);iSynError=0; return 0;客户端:#include #include #include #pragma comment(lib,ws2_32.lib)#define DEFAULT_SERV_PORT 2416 /服务器的监听端口#define DEFAULT_BUFFER_SIZE 2048 /缓冲区长度char sz_ServIp128; / 服务器的IP地址char sz_Msg2Snd1024; / 发给服务器端的字符串int iPort = DEFAULT_SERV_PORT; / 服务器的监听端口BOOL b_IsSendOnly = FALSE; / 只发消息,不收消息int getfun(SOCKET h_Socket4Cmd,char FileName40); /get命令处理函数int putfun(SOCKET h_Socket4Cmd,char FileName40); /put命令处理函数int helpfun(); /help命令处理函数int iSynError=1; int main(int argc, char *argv) WSADATA wsd; SOCKET h_Socket4Cmd; char szBufferDEFAULT_BUFFER_SIZE; int ret; struct sockaddr_in server; struct hostent *host = NULL; char CmdWords5,CmdWords240; argv1=-s:; strcpy(sz_ServIp, &argv13);if (WSAStartup(MAKEWORD(2,2), &wsd) != 0) /winsock初始化 printf(Failed to load Winsock library!n); return 1; h_Socket4Cmd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (h_Socket4Cmd = INVALID_SOCKET) printf(creating socket failed, error_code : %dn, WSAGetLastError(); return 1; server.sin_family = AF_INET; server.sin_port = htons(iPort); server.sin_addr.s_addr = inet_addr(sz_ServIp); if (server.sin_addr.s_addr = INADDR_NONE) host = gethostbyname(sz_ServIp); if (host = NULL) printf(Unable to resolve server: %sn, sz_ServIp); return 1; CopyMemory(&server.sin_addr, host-h_addr_list0, host-h_length); if (connect(h_Socket4Cmd, (struct sockaddr *)&server, sizeof(server) = SOCKET_ERROR) /链接到服务器端 printf(connecting to server failed,error_num: %dn, WSAGetLastError(); return 1; /接收服务器欢迎消息并打印到屏幕ret = recv(h_Socket4Cmd, szBuffer, DEFAULT_BUFFER_SIZE, 0);if (ret = 0) return 0;else if (ret = SOCKET_ERROR) printf(recv function failed,error_num: %dn, WSAGetLastError(); return 0; szBufferret = 0; printf(%sn,szBuffer); if(ret ); scanf(%s, CmdWords); /输入命令扫描 /输入命令识别 if(strncmp(CmdWords,?,1)=0) helpfun(); continue; else if(strncmp(CmdWords,quit,4)=0|strncmp(CmdWords,QUIT,2)=0) break; scanf(%s, CmdWords2); if(strncmp(CmdWords,get,3)=0|strncmp(CmdWords,GET,3)=0) getfun(h_Socket4Cmd,CmdWords2); continue; else if(strncmp(CmdWords,put,3)=0|strncmp(CmdWords,PUT,3)=0) putfun(h_Socket4Cmd,CmdWords2); continue; else puts(输入错误,按?号获取帮助,或重新输入!); fflush(stdin); printf(n); closesocket(h_Socket4Cmd); WSACleanup( ); return 0;int getfun(SOCKET h_Socket4Cmd,char FileName40) int ret; FILE *fpre; char szBuffer80; sz_Msg2Snd0=0; strcat(sz_Msg2Snd, get$); strcat(sz_Msg2Snd,FileName); /向服务器发送get命令 ret = send(h_Socket4Cmd, sz_Msg2Snd, strlen(sz_Msg2Snd)+1, 0); if (ret = 0) return 1; else if (ret = SOCKET_ERROR) printf(send function failed,error_num: %dn, WSAGetLastError(); return 1; printf(Send %d bytes successfully!n, ret); ret = recv(h_Socket4Cmd, szBuffer, 80, 0); szBufferret = 0; printf(%sn,szBuffer); /判断服务器是否在发送文件,若在发送则读取并保存到本地文件。 if(strncmp( szBuffer,125 Transfering.,strlen(125 Transfering.) )=0) if( (fpre=fopen(FileName,w) = NULL )/打开文件准备写入 printf(error of opening file !); return 1; while(!b_IsSendOnly) /读取流,每次80个字节 ret = recv(h_Socket4Cmd, szBuffer, 80, 0); if (ret = 0) return 1; else if (ret = SOCKET_ERROR) printf(receive function failed,error_num: %dn, WSAGetLastError(); return 1; /读取流中是有传输结束标志,停止接收 if(strncmp(szBuffer,226 Transfer,strlen(226 Transfer)=0) break; if(strncmp(szBuffer,500 Syntax error,strlen(500 Syntax error)=0) /判断读取流中是否有通信错误提示 break; if(-1 = fprintf(fpre,%s,szBuffer) /将读

温馨提示

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

评论

0/150

提交评论