ftp协议的分析与软件设计内容摘要:

ncSocket,它继承了父类中一些常用易懂的 Windows Sockets API 函数,并对 CAsyncSocket 中底层的较难控制的一些 API 函数或成员函数进行了处理,它通过 MFCCArchive 对象进行信息的接发操作,使得网络传输如同使用 MFC 的文档连载协议( Serialization protocol),简捷易用。 同时它支持模块化的后台信息处理,解决了 CAsyncSocket 中较难克服的多线程处理。 1) Socket 有三种类型 :流式 Socket, 数据报 Socket 及原始 Socket。 流式 Socket 定义了一种可靠的面向连接的服务 , 实现了无差错无重复的顺序数据传输 ; 数据报 Socket定义了一种无连接的服务 , 数据通过相互独立的报文进行传输 , 是无序的并且不保证可靠无差错 ; 原始 Socket 允许对低层协 议如 IP 或 ICMP 直接访问 , 主要用于新的网络协议实现的测试等。 无连接服务器一般都是面向事务处理的 , 一个请求一个应答就完成了客户程序与服务程序之间的相互作用。 面向连接服务器处理的请求往往比较复杂 , 不是一来一去的请求应答所能解决的 , 而且往往是并发服务器。 2) Socket 工作过程 :服务器端首先启动 , 通过调用 socket()建立一个 Socket, 相当于文件 I/O的申请文件句柄 ; 然后调用 bind()将该 Socket和本地网络地址联系在一起 ; 再调用 listen ()使 Socket做好侦听的准备 , 并规定它的请求队列的 长度 , 该调用仅用于面向连接的服务器。 一旦 Socket已建立 , 服务器需要等待一个连接 , 这通过调用 accept() 完成 ,该调用使服务器阻断直至到达一个连接请求 , 当一个请求到达时 , accept() 返回 , 服务器可用交互或并发形式处理请求。 客户端首先也要先建立 Socket, 然后就可调用 connect() 10 和服务器建立连接 ; 连接一旦建立 ,客户机和服务器之间就可以通过调用 read()和 write()来发送和接收数据 , 如同文件 I/O一样 ,最后待数据传送结束后 ,双方调用 close()关闭 Socket。 图 22 程序流程图 flow chart of programme 从以上讨论可以看出 , Socket 机制使复杂的网络通信变得如文件 I/O一样简单 , 大大简化了网络编程的复杂性。 当然 , 以上讨论并不是原则性的 ,如果抛开客户机 /服务器模型 ,上述 Socket调用是非常灵活的 , 唯一的原则是只要保证分组能正确地传到信宿端 ,并能正确接收传往自己的分组 , 任何调用方式都是允许的 ,上面的用法是较常用的合理模式。 多线程技术 在 windows的一个进程内 ,包含一个或多个线程。 线程是指进程的一条执行路径,它包含独立的堆栈和 CPU寄存器状态,每个线程共享所有的线程资源,包括打开的文件Socket()建立本地套接字 Bind()将本地端口与本地地址捆绑 Listen()服务器阻塞侦听来自客户端的请求 Socket()建立本地套接字 Accept()服务器接收客户端请求 GetData()SendData()执行数据传送 GetData()SendData()执行数据传送 Connect()向服务器发出连接请求 CloseSockets() CloseSockets() 服务器端 客户端 11 及动态分配的内存等等。 一个进程内的所有线程使用同一个地址空间,而这些线程的执行由系统调度程序控制,调度程序决定哪个线程可执行以及什么时候执行。 线程具有优先级别,优先权较低的线程要等到优先权较高的线程执行完后再执行。 如果用户的应用程序需要有多个任务同时进行相应的处理,只使用多线程是较理想的选择。 多线程的应用范围很广,尤其是在目前的桌面平台上,系统的许多功能如网络、打印、图形处理、和 文件管理都在一个系统中运行,更需要我们的应用程序能够同时处理多个事件,而这些正是多线程可以实现的。 VC++ windows应用程序的集成开发环境 Developer Studio。 在这个环境中,用户既可以编写 C风格的 Win32应用程序,也可以利用 MFC类库编写 C++风格的程序。 多线程在 Win32方式下和 MFC类库支持下的原理是一致的,进程的主线程在任何需要的时候都可以创建新的线程。 当线程执行完任务后,自动中止线程;当进程结束后,所有的线程都中止。 所有活动的线程共享进程的资源。 因此,在编程时需考虑当 多个线程访问同一资源时产生的冲突问题:当一个线程正在访问一个进程对象时,另一个线程要改变该对象,这时可能会产生错误的结果。 所以,编程时要注意解决这种冲突。 12 第三章 FTP 服务器设计与实现 客户机 /服务器方式的 FTP服务器方在 VC++。 其功能是实现服务通信功能,允许多个客户连接,响应客户请求,发送文本文件。 为连接、熟悉通信过程,依据通信过程设定菜单栏,即开始连接侦听等。 标准的 FTP协议,功能丰富,在这里着重与客户机 /服务器模型的实现,编程实现其最基本的功能。 总体设计 1) 需求概述 针对 FTP的服务器端来说, 主要为用户和管理员提供访问权限, 并通过侦听端口以随时响应合法的客户请求。 通过控制通道和 数据通道分别控制和响应对应的相关请求以及进行所需的数据文件传输。 响应的基本指令同标准的 FTP协议规范以做到兼容现行的FTP客户端软件,同时主要要保证同本组对应的 FTP客户端程序相兼容,确保其正确性和可扩展性。 基于服务器端的功能和特点,需要保证能够对端口进行实时侦听,及时响应客户端发送的命令,并由此打开控制通道,等待客户端用户的命令再做对应处理,开放数据通道进行信息和文件等数据的传输。 服务器需要 能够对用户进行认证并对命令做出及时准确的回应,满足传输等需求。 由此在设计实现服务器端时,要能够正确地解析来自客户端发出的请求命令,给予实时同时需准确无误地响应。 要在客户端完成登陆,退出,列目录,下载 /上传文件等操作的基础上针对每个操作的对应命令做出回复完成合法用户所需的功能。 2) 功能 设计 根据 FTP协议,完成服务器端的基本功能: ( 1) 设计直观的图形用户界面 ,管理用户的信息。 ( 2) 对客户端的命令做出回复完成所需功能。 3) 模块概述 ( 1)用户界面模块负责响应用户的键盘鼠标 及 输入设置服务器的各个参数,为 用户提供标准的 Windows 界面。 ( 2)连接监听与 FTP 命令处理模块负责监听客户端的连接。 此模块为 FTP 协议的核心,它具体负责 FTP 命令的解析与实现。 13 ( 3)客户数据传输模块负责具体的与客户端的数据传输,包括文件的上传,下 载 等。 软件结构 系统 结构图 图 31 系统结构图 The structure of system 14 用户界面 图 32 用户界面 The user interface 具体 设计与 实现 服务器的界面设计与系统 结构已经在前面作了介 绍 ,根据前面的分析 , 系统程序大致可以分为以下几个程序模块:用户管理 ,启动和侦听 ,命令控制和响应 ,数据传送。 1)主要类定义 ( 1) CmyFtpServerDlg: 主对话框类。 用于图形界面的处理, 提供的函数实现支持客户端的请求并做出响应 ; 用于 用户 管理 的对话框类,实际中应由管理员进行分配,使用户在持有用户名和密码的情况下访问 FTP服务器,同时也支持匿名登陆。 ( 2) CServer: FTP服务器的建立类。 该类主要负责实现功能需求的各种函数,几乎所有的响应指令都是通过该类完成。 15 2)主要类接口 ( 1) CmyFtpServerDlg类:  OnStartServer() : 用于侦听客户端的请求以开启服务器的相关服务,它调用ServerThread线程处理该操作。  OnInitDialog():对话框的定义与设置。  OnAddAccount(): 添加用户。  OnDelAccount():删除用户。  OnAccountInfor():用户信息管理。  OnRefreshPort():端口号设置。 ( 2) CServer类:  SendRes():负责发送响应消息到客户端。  RecvReq(): 接收数据。  WeleInfo( SOCKET s ):显示欢迎消息。  LoginIn( LPSOCKET_INF pSocketInfo ):登陆 验证。  GetFileList():文件信息列表。  ReadFileToBuffer():向 Buffer中写文件。  WriteToFile():写文件。  DataConn():数据连接。  DataSend():发送数据。  DataRecv():接收数据。  DealCommand():负责处理 FTP命令。 3)线程 设计 ServerThread和 ProcessTreadIO: 用于开启服务器响应服务时 , 为其开辟的线程 以防止服务器在忙于侦听和处理客户端请求时,无法响应其他的界面处理等操作。 ServerThread负责监听 sockets连接,一旦有客户机连接到本机, ServerThread会调用ProcessTreadIO线程进行数据对话。 4)程序模块 设计与实现 ( 1)总体流程 16 图 33 程序 流程图 The flow chart of programme 服务器会先与客户端进行连接 ,一旦验证和连接成功完成后, 服务器和客户端就会打开相关通道进行数据传送等操作。 ( 2)用户管理 通过增加用户以允许合法的客户能够通过客户端成功连接服务器以获取所需信息和数据。 主要为用户创建以下信息:用户名、登录密码及登录的初始根目录。 用户增加通过 CmyFtpServerDlg类中 OnAddAccount()函数实现。 用户的删除通过 CmyFtpServerDlg类中 OnDelAccount()函数实现。 用户的信息管理(账号、密码、根目录的更改)则通过CmyFtpServerDlg类中 OnAccountInfor()实现。 以下 用于 用户 管理 的用户结构体设计 主要代码: struct CAccount 请求数据 拒接访问 验证用户名、密码 判定 错误 进入服务器指定目录 上传和下载文件 正确 17 { CString account。 CString password。 CString directory。 }。 CArrayCAccount,CAccountamp。 m_AccountArray。 //全局结构数组, 区分 每个用户信息 ( 3) 启动 和侦听 图 34程序流程图 flow chart of programme 新建用户后,通过开启服务,服务 器端会对 21 端口进行不断侦听,当有相应客户端请求时,就会打开命令通道,当有数据传送时,再通过数据通道进行数据连接以传输文件等。 该功能如以上所说,通过在主对话框类 CmyFtpServerDlg 调用 OnStartServer(),并使用线程 ThreadStart 来实现侦听和连接。 以下为 OnStartServer()函数: CMyFtpServerDlg::OnStartServer() //开启服务 { // TODO: Add your control notification handler code here 服务器地址和端口 打开命令通道 登陆成功 接受欢迎信息 USER 命令 PASS 命令 发送空命令 回应信息正确 回应信息正确 Y N Y N 18 //开始服务 CString wele。 GetDlgItemText(IDC_WELCOME,wele)。 (LPCSTR(),LPCSTR(),LPCSTR(t。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。