收藏 分销(赏)

网络应用综合设计文传.doc

上传人:仙人****88 文档编号:11854264 上传时间:2025-08-15 格式:DOC 页数:32 大小:218KB 下载积分:10 金币
下载 相关 举报
网络应用综合设计文传.doc_第1页
第1页 / 共32页
网络应用综合设计文传.doc_第2页
第2页 / 共32页


点击查看更多>>
资源描述
武汉工程大学 计算机科学与工程学院 综合设计报告 设计名称: 网络应用综合设计 设计题目: 文件传输协议的简单设计与实现 学生学号: 专业班级: 学生姓名: 学生成绩: 指导教师(职称): 课题工作时间: 2013-10-7 至 2013-11-12 说明: 1、报告中的第一、二、三项由指导教师在综合设计开始前填写并发给每个学生;四、五两项(中英文摘要)由学生在完成综合设计后填写。 2、学生成绩由指导教师根据学生的设计情况给出各项分值及总评成绩。 3、指导教师评语一栏由指导教师就学生在整个设计期间的平时表现、设计完成情况、报告的质量及答辩情况,给出客观、全面的评价。 4、所有学生必须参加综合设计的答辩环节,凡不参加答辩者,其成绩一律按不及格处理。答辩小组成员应由2人及以上教师组成。 5、报告正文字数一般应不少于5000字,也可由指导教师根据本门综合设计的情况另行规定。 6、平时表现成绩低于6分的学生,其综合设计成绩按不及格处理。 7、此表格式为武汉工程大学计算机科学与工程学院提供的基本格式(适用于学院各类综合设计),各教研室可根据本门综合设计的特点及内容做适当的调整,并上报学院批准。 成绩评定表 学生姓名: 学号: 班级: 类别 合计 分值 各项分值 评分标准 实际得分 合计得分 备注 平时表现 10 10 按时参加综合设计,无旷课、迟到、早退、违反实验室纪律等情况。 完成情况 30 20 按设计任务书的要求完成了全部任务,能完整演示其设计内容,符合要求。 10 能对其设计内容进行详细、完整的介绍,并能就指导教师提出的问题进行正确的回答。 报告质量 35 10 报告文字通顺,内容翔实,论述充分、完整,立论正确,结构严谨合理;报告字数符合相关要求,工整规范,整齐划一。 5 课题背景介绍清楚,综述分析充分。 5 设计方案合理、可行,论证严谨,逻辑性强,具有说服力。 5 符号统一;图表完备、符合规范要求。 5 能对整个设计过程进行全面的总结,得出有价值的结论或结果。 5 参考文献数量在3篇以上,格式符合要求,在正文中正确引用。 答辩情况 25 10 在规定时间内能就所设计的内容进行阐述,言简意明,重点突出,论点正确,条理清晰。 15 在规定时间内能准确、完整、流利地回答教师所提出的问题。 总评成绩: 分 补充说明: 指导教师: (签字) 日 期: 年 月 日 答辩记录表 学生姓名: 学号: 班级: 答辩地点: 计算机学院423机房 答辩内容记录: 答辩成绩 合计 分值 各项分值 评分标准 实际得分 合计得分 备注 25 10 在规定时间内能就所设计的内容进行阐述,言简意明,重点突出,论点正确,条理清晰。 15 在规定时间内能准确、完整、流利地回答教师所提出的问题。 答辩小组成员(签字): 年 月 日 指导教师评语 指导教师: (签字) 日 期: 年 月 日 一、综合设计目的、条件、任务和内容要求: 本次综合设计的目的是让学生单独完成一个小型网络应用软件的设计和开发过程,包括最初的方案和算法设计、功能和细节的详细设计、图形界面的设计和处理、程序的开发和调试,以及最终设计报告的撰写。 设计的编程语言建议为C/C++,环境可用Visual C++ 6.0或其他C/C++编译器。 设计的主要任务是要求使用Socket编程技术实现一个Client/Server结构的程序(一个客户端程序,一个服务器程序),实现文件通过网络在两个程序之间的传送和接收,并保存。要求程序使用MFC中的对话框编程来设计GUI,界面友好易用。所涉及的编程知识主要包括Socket、文件读写、对话框控件使用三方面。 学有余力的同学可以考虑以下两方面的优化和改进: 1. 使用多线程编程技术优化文件的传送效率。当来客户端和服务器之间传送一个较大的文件(如几百MB)时,若以单线程来传送,则必然耗时较长。可以考虑将文件分成多个数据块,并使用多个线程并发传送这些数据块,相应的,服务器端也可以考虑多线程接收。这会使得文件传送以较高效率使用带宽。 2. 考虑服务器同时接收来自多个客户端软件的不同文件。多客户的需求很普遍,这涉及服务器端处理并发请求的设计思路,需要使用套接字的I/O模型来处理多个并发请求。 注:若采用过程编程,仅需使用socket1.1版本,若使用面向对象编程,可以使用MFC中的CAsyncSocket与CSocket两个类进行封装,设计自己的socket类。 指导教师签字: 年 月 日 二、进度安排: 需求分析阶段 (2天) 技术对比和选型 (4天) 基本方案书书写论证阶段 (2天) 模拟实施和测试 (2天) 答辩时间 2013-11-12 三、应收集资料及主要参考文献: [1] 谢希仁.计算机网络(第五版).北京:电子工业出版社,2008 [2]《C语言程序设计》谭浩强著,清华大学出版社 [3]《VC技术内幕》(第五版) [4]《数据结构》(第二版) ,清华大学出版社 [5]《TCP/IP详解卷一》(第二版) ,机械工业出版社 四、摘要: 现在是一个信息时代,我们的生活都与互联网息息相关,能够让互联网如此顺畅的其实是网络协议,我们能够在实践中实现网络协议是理论联系实际的很好的一个证明。FTP 是File Transfer Protocol(文件传输协议)的英文简称,用于Internet上的控制文件的双向传输。在实现的层面上,FTP又可理解为一个可用于文件传输的客户机/服务器系统,该系统包括客户机端程序和服务器端程序,客户端和服务器端通信规则为FTP协议。用相关套接字来实现相关的进程服务。用户通过客户机程序向服务器程序发出命令请求,服务器程序执行用户所发出的命令,并将执行的结果返回到客户机。 关键字:互联网;网络协议;文件传输;套接字 五、Abstract: It is an information age, our lives are closely linked with the Internet, allowing the Internet is actually so smooth network protocol, network protocol we can achieve in practice the theory and practice of a very good proof. FTP is File Transfer Protocol (File Transfer Protocol) the title, two-way transmission control files used on the Internet. On the implementation level, FTP client can be understood as one can be used for file transfer / server system that includes client-side and server-side program, the client and server-side communication rules for the FTP protocol. Sockets to achieve with the relevant processes associated services. Issued by the user to the server through a client program requests the program command, the server will execute the command issued by the user, and returns the execution result to the client. Keywords: Internet;network protocol;file transfer;socket 24 目录 目录 1 摘要 2 ABSTRACT 2 第一章 课题背景 3 1.1 FTP文件传输协议 3 1.2 WINSOCK API介绍 3 第二章 设计简介及设计方案论述 5 2.1 软件设计 5 2.2 方案论述 5 第三章 详细设计 6 3.1 函数分解 6 3.1.1 WSAStartup()函数和WSACleanup()函数 6 3.1.2 socket()函数 6 3.1.3 bind( ) 函数 6 3.1.4 listen( )函数 6 3.1.5 accept( )函数 6 3.1.6 connect( )函数 7 3.1.7 closesocket( )函数 7 3.2 代码实现 7 第四章 设计结果及分析 17 4.1 设计结果 17 4.1.1 构建目录查询 17 4.1.2 构建文件下载命令 18 4.1.3 构建文件上传命令 19 4.2 结果分析 21 总结 22 致谢 23 参考文献 24 摘要 现在是一个信息时代,我们的生活都与互联网息息相关,能够让互联网如此顺畅的其实是网络协议,我们能够在实践中实现网络协议是理论联系实际的很好的一个证明。FTP 是File Transfer Protocol(文件传输协议)的英文简称,用于Internet上的控制文件的双向传输。在实现的层面上,FTP又可理解为一个可用于文件传输的客户机/服务器系统,该系统包括客户机端程序和服务器端程序,客户端和服务器端通信规则为FTP协议。用相关套接字来实现相关的进程服务。用户通过客户机程序向服务器程序发出命令请求,服务器程序执行用户所发出的命令,并将执行的结果返回到客户机。 关键字:互联网 网络协议 文件传输 套接字 Abstract It is an information age, our lives are closely linked with the Internet, allowing the Internet is actually so smooth network protocol, network protocol we can achieve in practice the theory and practice of a very good proof. FTP is File Transfer Protocol (File Transfer Protocol) the title, two-way transmission control files used on the Internet. On the implementation level, FTP client can be understood as one can be used for file transfer / server system that includes client-side and server-side program, the client and server-side communication rules for the FTP protocol. Sockets to achieve with the relevant processes associated services. Issued by the user to the server through a client program requests the program command, the server will execute the command issued by the user, and returns the execution result to the client. Keywords: Internet Network protocol file Transfer Socket 第一章 课题背景 本设计旨在利用Winsock 2.0简单实现FTP(File Transfer Protocol,文件传输协议)的客户端和服务器端程序。通过完成此设计,了解Winsock API函数调用方法和一般网络应用程序的编程方法,理解FTP协议,掌握C语言设计FTP协议软件的基本技术,为将来开发其他通信协议软件打下坚实基础。 1.1 FTP文件传输协议 文件传输协议(FTP:File Transfer Protocol)使得主机间可以共享文件。 FTP 使用 TCP 生成一个虚拟连接用于控制信息,然后再生成一个单独的 TCP 连接用于数据传输。控制连接使用类似 TELNET 协议在主机间交换命令和消息。文件传输协议是TCP/IP网络上两台计算机传送文件的协议,FTP是在TCP/IP网络和INTERNET上最早使用的协议之一,它属于网络协议组的应用层。FTP客户机可以给服务器发出命令来下载文件,上传文件,创建或改变服务器上的目录。 1.2 Winsock API介绍 因特网(Internet)最初是基于Unix的,而Sockets(套接字)是Unix第一个支持TCP/IP协议栈的网络API,最早于1982年8月随4.2 BSD版Unix推出,常被称为Berkeley sockets(伯克利套接字)。Winsock(Windows Sockets API)是从Sockets移植过来的TCP/IP编程的低级Windows API。Winsock分1.1版和2.x版,从Windows 98开始使用2.x版。 Winsock与windows操作系统的关系如图ChpNum-1所示。操作系统实现了TCP/IP协议栈,(包括传输层协议TCP及UDP;网络层协议IP、ICMP及IGMP;链路层协议ARP和RAR),该模块的相关功能以动态链接库的形式被应用程序调用。操作系统接受网卡驱动程序的注册,网卡驱动程序本质上是一套控制网卡硬件收发报文的函数,也是以动态链接库的形式被调用。物理通信介质是指网卡驱动芯片及其外围电路,完成链路层数据帧的封装/解封、发送/接收等功能。 套接字可看作是不同主机间的进程进行双向通信的虚拟管道端点:网络中两台主机各自在自己机器上建立通信的端点--套接字,然后使用套接字进行数据通信。一个套接字包含五个基本元素:协议类型、本地IP地址、本地端口、远端IP地址和远端端口。在操作系统中,套接字是一种系统资源,应用程序使用时应向操作系统申请或注册,使用结束后应用程序应释放该该套接字。和其他系统资源一样,操作系统为套接字分配一个唯一的ID(在Windows中被称作句柄)。 根据网络通信的特征,套接字分为三类:流套接字(SOCK_STREAM)、数据报套接字(SOCK_DGRAM)和原始套接字(SOCK_RAW)。流套接字是面向连接的,它提供双向的、有序的、无差错、无重复并且无记录边界的数据流服务,适用于处理大量数据,提供可靠的服务。数据报套接字是无连接的,它支持双向的数据传输,具有开销小、数据传输效率高的特点,但不保证数据传输的可靠性、有序性和无重复性,适合少量数据传输、以及时间敏感的音/视频等多媒体数据传输。原始套接字(SOCK_RAW)可以用作对底层协议(如IP或ICM)的直接访问。 Winsock网络应用程序利用API 函数(如accept、send、recv等函数)进行I/O操作时有阻塞和非阻塞两种模式。若要获取的资源还没有到达(如:接收缓冲区中没有数据提供给recv函数),在阻塞模式下,执行I/O操作的Winsock函数在I/O操作完成前会一直等待下去,不会立即返回;而在非阻塞模式下,该函数不管I/O操作有没有完成都会立即返回,若未完成一般会返回错误码WSAWOULDBLOCK,意味着必须重新进行尝试。阻塞模式与非阻塞模式比较,从编程角度来说,前者更便于使用,但从程序运行的效率来说,由于阻塞调用后会使得所在的线程(如果是主线程那么就是整个程序)等待在该I/O操作上,因此后者效率更高。默认情况下,这些I/O操作工作于阻塞模式。 在阻塞模式下使用Winsock 2的API库函数进行数据报套接字编程的过程如图ChpNum-2所示。在服务器端,先调用WSASartup函数进行初始化,初始化完成后调用Socket函数创建一个Socket s,再调用bind函数将该套接字绑定到某个特定端口,接下来调用Listen函数启动监听并调用Accept函数接收客户连接,若客户连接请求未及时到达,则Accept函数处于阻塞状态。Accept函数为客户端的连接请求创建一个新的套接字S1,在以后的通信中,服务器利用套接字s1与客户端进行数据双向传输。通信结束时,服务器可以采用Closesocket函数释放套接字,并可调用WSAClearup释放Winsock DLL。客户机是连接的请求的发起者,在创建Socket之后直接通过调用Connect发起连接请求,成功后即可以利用该Socket进行双向通信了。 第二章 设计简介及设计方案论述 2.1 软件设计 本设计客户端及服务器端均采用单线程实现,命令和数据的传输在同一个Socket链接上进行。客户端支持DIR(远端文件夹查询)、GET(文件下载)、PUT(文件上传)、PWD(远端当前路径查询)、CD(远端当前路径设置)、MD(远端文件夹创建)、DEL(远端文件删除)等7个常用FTP命令。 用户命令格式为“命令字 路径名/文件名”,如下载当前目录下的test.txt文件,则用户在控制台界面输入的命令格式为“GET test.txt”。客户机和服务器的命令格式约定为“命令字$路径名/文件名”,即test.txt文件下载命令格式为“命令字$路径名/文件名”。 2.2 方案论述 总的来说就是灵活用套接字,在不同的套接字下实现不同的功能,这样我们就能一环套一环的实现文件传输协议的简单实现,具体来说就是用简单的ftp服务器端程序文件,包含main函数及get、put等命令处理函数。用函数sgetfun来处理来自客户端的文件下载命令,输入参数: SOCKET h_NewSocket,命令通过此socket接收到,可通过它响应命令。用函数sputfun来处理来自客户端的文件上传命令。 第三章 详细设计 3.1 函数分解 3.1.1 WSAStartup()函数和WSACleanup()函数 由于Winsock 2提供的API服务是以动态链接库ws2_32.dll实现的,所以必须先调用WSAStartup() 函数对ws2_32.dll进行加载初始化,协商Winsock的版本支持,并分配必要的资源。在应用程序关闭套接字后,还应调用WSACleanup( )函数来终止和卸载动态链接库ws2_32.dll,释放资源。 3.1.2 socket()函数 服务进程和客户进程在通信前必须创建各自的套接字,然后才能用相应的套接字进行发送、接收操作,实现数据的传输。服务进程总是先于客户进程启动,服务进程和客户进程调用socket() 函数创建套接字。 3.1.3 bind( ) 函数 当用socket( )创建套接字后,它便存在于一个名字空间(地址族)中,但并未赋名。bind ( )函数通过给一个未命名套接字分配一个本地名字(主机地址/端口号)来为套接字建立本地捆绑。客户端一般隐式地向操作系统请求一个随机的未使用过的临时端口号,跟自己的IP地址一起,与所创建的套接字建立联系,由于该临时端口号客户端程序事先是不确定的,因此不显式地使用绑定函数。 3.1.4 listen( )函数 调用listen( )函数对服务器上套接字启动监听,即允许客户连接请求开始排队。 3.1.5 accept( )函数 服务器设置监听工作方式后,通过调用 accept( ) 函数使套接字等待接受客户连接。如果已有连接请求到来,该函数会返回一个新的套接字描述符,它对应于已经接受的那个客户端连接。对于该客户机后续的所有操作,都应使用这个新套接字。至于原来那个监听套接字,它仍然用于接受其他客户机连接,继续处于监听模式。 3.1.6 connect( )函数 客户端利用 connect( ) 函数和服务器建立一个端到端的连接。 3.1.7 closesocket( )函数 网络通信任务完成后,利用本函数释放套接字占用的所有资源。 3.2 代码实现 /********************************************************************* 文件名: server.c 说明: 简单的ftp服务器端程序文件,包含main函数及get、put等命令处理函数。 **********************************************************************/ #include <stdio.h> #include <winsock2.h> #include <stdlib.h> #pragma comment(lib,"ws2_32.lib") WSADATA wsd; char SendBuffer[80],RecvBuffer[80];//发送缓冲区及接收缓冲区 #define DEFAULT_LSTN_PORT 2416 //本地默认监听端口 int n,bytes; SOCKET h_NewSocket; //accept函数产生的新socket struct sockaddr_in RemoteAddr; char path[80]=""; char strObject[100]=""; int iSynError=1; int sdirfun(SOCKET h_NewSocket); int sgetfun(SOCKET h_NewSocket); int sputfun(SOCKET h_NewSocket); int spwdfun(SOCKET h_NewSocket); int scdfun(SOCKET h_NewSocket); int smdfun(SOCKET h_NewSocket); int sdelfun(SOCKET h_NewSocket); /*********************************************************************** 函数名:main 说明: 主函数 输入参数: int argc 输入参数长度 char *argv[]输入参数,用于传入监听端口号 ***********************************************************************/ 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 failed\n"); } memset(&SLocalAddr,0,sizeof(SLocalAddr)); //创建socket h_Socket4Lstn = socket(PF_INET, SOCK_STREAM, 0); if (h_Socket4Lstn <0) printf("creating socket failed\n"); SLocalAddr.sin_family = AF_INET; if(argc == 2) SLocalAddr.sin_port = htons((u_short)atoi(argv[1])); 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 \r\n"); //向客户端发送欢迎消息 bytes = send(h_NewSocket, SendBuffer, strlen(SendBuffer), 0); sprintf(SendBuffer,"530 Log in \r\n"); bytes = send(h_NewSocket, SendBuffer, strlen(SendBuffer), 0); while (1) { //接收客户端的命令并调用命令处理函数 n = 0; iSynError=1; while (1) { bytes = recv(h_NewSocket, &RecvBuffer[n], 1, 0); if ((bytes < 0) || (bytes == 0)) break; if (RecvBuffer[n] == '$') { RecvBuffer[n] = '\0'; break; } if (RecvBuffer[n] != '\r') n++; } if ((bytes < 0) || (bytes == 0)) break; printf("The Server received: '%s' cmd from client \n", RecvBuffer); //命令识别 //查看当前目录 if(strncmp(RecvBuffer,"dir",3)==0) sdirfun(h_NewSocket); //查询当前目录路径 if(strncmp(RecvBuffer,"pwd",3)==0) spwdfun(h_NewSocket); //改变当前目录 if (strncmp(RecvBuffer,"cd",2)==0) scdfun(h_NewSocket); //文件下载 if (strncmp(RecvBuffer,"get",3)==0) sgetfun(h_NewSocket); //文件上传 if (strncmp(RecvBuffer,"put",3)==0) sputfun(h_NewSocket); //新建文件夹 if (strncmp(RecvBuffer,"md",2)==0) smdfun(h_NewSocket); //删除文件 if (strncmp(RecvBuffer,"del",3)==0) sdelfun(h_NewSocket); if (strncmp(RecvBuffer,"quit",4)==0) //退出命令 { printf("quit \n"); sprintf(SendBuffer, "221 Bye bye ... \r\n"); 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; } /*********************************************************************** 函数名:sdirfun 说明: 用于处理来自客户端的目录查询命令 输入参数: SOCKET h_NewSocket,命令通过此socket接收到,可通过它响应命令。 **********************************************************************/ int sdirfun(SOCKET h_NewSocket) { char temp_buffer[80]; FILE *p_FiLeTemp; //整理本地dir命令 strObject[0]='\0'; strcat(strObject,"dir "); strcat(strObject,
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服