网络应用综合设计文传.doc_第1页
网络应用综合设计文传.doc_第2页
网络应用综合设计文传.doc_第3页
网络应用综合设计文传.doc_第4页
网络应用综合设计文传.doc_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

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

文档简介

武汉工程大学 计算机科学与工程学院 综合设计报告 设计名称 设计名称 网络应用综合设计网络应用综合设计 设计题目 设计题目 文件传输协议的简单设计与实现文件传输协议的简单设计与实现 学生学号 学生学号 专业班级 专业班级 学生姓名 学生姓名 学生成绩 学生成绩 指导教师 职称 指导教师 职称 课题工作时间 课题工作时间 2013 10 7 至至 2013 11 12 ii 说明 1 报告中的第一 二 三项由指导教师在综合设计开始前填写并发给每 个学生 四 五两项 中英文摘要 由学生在完成综合设计后填写 2 学生成绩由指导教师根据学生的设计情况给出各项分值及总评成绩 3 指导教师评语一栏由指导教师就学生在整个设计期间的平时表现 设 计完成情况 报告的质量及答辩情况 给出客观 全面的评价 4 所有学生必须参加综合设计的答辩环节 凡不参加答辩者 其成绩一 律按不及格处理 答辩小组成员应由 2 人及以上教师组成 5 报告正文字数一般应不少于 5000 字 也可由指导教师根据本门综合设 计的情况另行规定 6 平时表现成绩低于 6 分的学生 其综合设计成绩按不及格处理 7 此表格式为武汉工程大学计算机科学与工程学院提供的基本格式 适 用于学院各类综合设计 各教研室可根据本门综合设计的特点及内容 做适当的调整 并上报学院批准 iii 成绩评定表 学生姓名 学号 班级 类别 合计 分值 各项 分值 评分标准 实际 得分 合计 得分 备注 平时 表现 1010 按时参加综合设计 无旷课 迟 到 早退 违反实验室纪律等情 况 20 按设计任务书的要求完成了全部 任务 能完整演示其设计内容 符合要求 完成 情况 30 10 能对其设计内容进行详细 完整 的介绍 并能就指导教师提出的 问题进行正确的回答 10 报告文字通顺 内容翔实 论述 充分 完整 立论正确 结构严 谨合理 报告字数符合相关要求 工整规范 整齐划一 5 课题背景介绍清楚 综述分析充 分 5 设计方案合理 可行 论证严谨 逻辑性强 具有说服力 5 符号统一 图表完备 符合规范 要求 5 能对整个设计过程进行全面的总 结 得出有价值的结论或结果 报告 质量 35 5 参考文献数量在 3 篇以上 格式 符合要求 在正文中正确引用 10 在规定时间内能就所设计的内容 进行阐述 言简意明 重点突出 论点正确 条理清晰 答辩 情况 25 15 在规定时间内能准确 完整 流 利地回答教师所提出的问题 总评成绩 分 补充说明 指导教师 签字 iv 日 期 年 月 日 答辩记录表 学生姓名 学号 班级 答辩地点 计算机学院 423 机房 答辩内容记录 合计 分值 各项 分值 评分标准 实际 得分 合计 得分 备注 答 辩 成 绩 2510 在规定时间内能就所设计的内容 进行阐述 言简意明 重点突出 v 论点正确 条理清晰 15 在规定时间内能准确 完整 流 利地回答教师所提出的问题 答辩小组成员 签字 年 月 日 指导教师评语 vi 指导教师 签字 日 期 年 月 日 vii 一 综合设计目的 条件 任务和内容要求 本次综合设计的目的是让学生单独完成一个小型网络应用软件的设计和开发过程 包括最初的方案和算法设计 功能和细节的详细设计 图形界面的设计和处理 程序 的开发和调试 以及最终设计报告的撰写 设计的编程语言建议为 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 类 指导教师签字 年 月 日 viii 二 进度安排 需求分析阶段 2 天 技术对比和选型 4 天 基本方案书书写论证阶段 2 天 模拟实施和测试 2 天 答辩时间2013 11 12 三 应收集资料及主要参考文献 1 谢希仁 计算机网络 第五版 北京 电子工业出版社 2008 2 C 语言程序设计 谭浩强著 清华大学出版社 3 VC 技术内幕 第五版 4 数据结构 第二版 清华大学出版社 5 TCP IP 详解卷一 第二版 机械工业出版社 ix 四 摘要 现在是一个信息时代 我们的生活都与互联网息息相关 能够让互联网如此顺畅 的其实是网络协议 我们能够在实践中实现网络协议是理论联系实际的很好的一个证 明 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 目录 目录目录 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 2 摘要 现在是一个信息时代 我们的生活都与互联网息息相关 能够让互联网如此顺畅 的其实是网络协议 我们能够在实践中实现网络协议是理论联系实际的很好的一个证 明 FTP 是 File Transfer Protocol 文件传输协议 的英文简称 用于 Internet 上的控 制文件的双向传输 在实现的层面上 FTP 又可理解为一个可用于文件传输的客户机 服务器系统 该系统包括客户机端程序和服务器端程序 客户端和服务器端通信规则 为 FTP 协议 用相关套接字来实现相关的进程服务 用户通过客户机程序向服务器程 序发出命令请求 服务器程序执行用户所发出的命令 并将执行的结果返回到客户机 关键字 互联网关键字 互联网 网络协议网络协议 文件传输文件传输 套接字套接字 AbstractAbstract 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 3 第一章 课题背景 本设计旨在利用 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 该模块的相关功能以动态链接库的形式被应用程序调用 操作 系统接受网卡驱动程序的注册 网卡驱动程序本质上是一套控制网卡硬件收发报文的 函数 也是以动态链接库的形式被调用 物理通信介质是指网卡驱动芯片及其外围电 路 完成链路层数据帧的封装 解封 发送 接收等功能 4 套接字可看作是不同主机间的进程进行双向通信的虚拟管道端点 网络中两台主 机各自在自己机器上建立通信的端点 套接字 然后使用套接字进行数据通信 一个套 接字包含五个基本元素 协议类型 本地 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 之后直接通过调用 5 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 来处理来自客户端的文件上传命令 6 第三章 详细设计 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 函数使套接字等待接受客户连接 如果已有连接请求到来 该函数会返回一个新的套接字描述符 它对应于已经接受的 那个客户端连接 对于该客户机后续的所有操作 都应使用这个新套接字 至于原来 那个监听套接字 它仍然用于接受其他客户机连接 继续处于监听模式 7 3 1 6 connect 函数 客户端利用 connect 函数和服务器建立一个端到端的连接 3 1 7 closesocket 函数 网络通信任务完成后 利用本函数释放套接字占用的所有资源 3 2 代码实现 文件名 server c 说明 简单的 ftp 服务器端程序文件 包含 main 函数及 get put 等命令处理函数 include include include 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 输入参数 用于传入监听端口号 8 int main int argc char argv struct sockaddr in SLocalAddr SOCKET h Socket4Lstn 欲用作监听的 socket int addr in len 地址长度 初始化 winsock if WSAStartup MAKEWORD 2 2 printf WSAStartup failed n memset 创建 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 while 1 主循环 listen h Socket4Lstn 3 启动监听 addr in len sizeof RemoteAddr 接受连接请求 h NewSocket accept h Socket4Lstn struct sockaddr 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 9 if bytes 0 bytes 0 break if RecvBuffer n RecvBuffer n 0 break if RecvBuffer n r n if bytes tmp txt system strObject system 函数执行 shell 命令 p FiLeTemp fopen tmp txt r 打开执行结果文件 准备发送到客户端 sprintf SendBuffer 125 Transfering r n bytes send h NewSocket SendBuffer strlen SendBuffer 0 while fgets temp buffer 80 p FiLeTemp NULL 每次读取 80 字节发送 sprintf SendBuffer s temp buffer send h NewSocket SendBuffer strlen SendBuffer 0 fclose p FiLeTemp 发送完毕 关闭结果临时文件 sprintf SendBuffer 226 Transfer completed r n bytes send h NewSocket SendBuffer strlen SendBuffer 0 system del tmp txt 删除结果临时文件 sprintf SendBuffer 226 Close the data socket r n bytes send h NewSocket SendBuffer strlen SendBuffer 0 printf dir command has been done n iSynError 0 return 0 函数名 sgetfun 说明 用于处理来自客户端的文件下载命令 输入参数 SOCKET h NewSocket 命令通过此 socket 接收到 可通过它响应命令 11 int sgetfun SOCKET h NewSocket int i 4 k 0 char FileName 20 temp buffer 80 char p FileName strObject FILE fp printf required file is 打印文件名到屏幕 while 1 提取文件名 bytes recv h NewSocket printf c RecvBuffer i if bytes 0 trcat strObject strcat strObject FileName 打开客户端欲下载的文件 if fp fopen p FileName r NULL 未成功打开文件 sprintf SendBuffer Sorry cannot open s Please try again r n FileName bytes send h NewSocket SendBuffer strlen SendBuffer 0 sprintf SendBuffer 226 Transfer completed r n 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 r n 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 r n 12 bytes send h NewSocket SendBuffer strlen SendBuffer 0 iSynError 0 printf get command has been done n return 0 函数名 sputfun 说明 用于处理来自客户端的文件上传命令 int sputfun SOCKET h NewSocket Printf 篇幅所限 请读者完成 n iSynError 0 return 0 函数名 spwdfun 说明 用于处理来自客户端的当前路径查询命令 int spwdfun SOCKET h NewSocket Printf 篇幅所限 请读者完成 n iSynError 0 return 0 函数名 scdfun 说明 用于处理来自客户端的当前路径设置命令 int scdfun SOCKET h NewSocket Printf 篇幅所限 请读者完成 n iSynError 0 return 0 函数名 smdfun 说明 用于处理来自客户端的当前文件夹新建命令 int smdfun SOCKET h NewSocket Printf 篇幅所限 请读者完成 n 13 iSynError 0 return 0 函数名 sdelfun 说明 用于处理来自客户端的文件删除命令 int sdelfun SOCKET h NewSocket Printf 篇幅所限 请读者完成 n iSynError 0 return 0 客户端程序文件 文件名 client c 说明 简单的 ftp 客户端程序文件 包含 main 函数及 get put 等命令发送函数 include include include pragma comment lib ws2 32 lib define DEFAULT SERV PORT 2416 服务器的监听端口 define DEFAULT BUFFER SIZE 2048 缓冲区长度 char sz ServIp 128 服务器的 IP 地址 char sz Msg2Snd 1024 发给服务器端的字符串 int iPort DEFAULT SERV PORT 服务器的监听端口 BOOL b IsSendOnly FALSE 只发消息 不收消息 int dirfun SOCKET dir 命令处理函数 int getfun SOCKET h Socket4Cmd char FileName 40 get 命令处理函数 int putfun SOCKET h Socket4Cmd char FileName 40 put 命令处理函数 int pwdfun SOCKET pwd 命令处理函数 int cdfun SOCKET h Socket4Cmd char pathname 40 cd 命令处理函数 int mdfun SOCKET h Socket4Cmd char DocName 20 md 命令处理函数 int delfun SOCKET h Socket4Cmd char name 20 del 命令处理函数 int helpfun help 命令处理函数 函数名 main 说明 主函数 输入参数 int argc 输入参数长度 char argv 输入参数字符型数组 int main int argc char argv WSADATA wsd 14 SOCKET h Socket4Cmd char szBuffer DEFAULT BUFFER SIZE int ret struct sockaddr in server struct hostent host NULL char CmdWords 5 CmdWords2 40 argv 1 s 127 0 0 1 strcpy sz ServIp if WSAStartup MAKEWORD 2 2 return 1 h Socket4Cmd socket AF INET SOCK STREAM IPPROTO TCP if h Socket4Cmd INVALID SOCKET printf creating socket failed error code d n 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 s n sz ServIp return 1 CopyMemory if connect h Socket4Cmd struct sockaddr return 1 接收服务器欢迎消息并打印到屏幕 ret recv h Socket4Cmd szBuffer DEFAULT BUFFER SIZE 0 if ret 0 return 0 else if ret SOCKET ERROR 15 printf recv function failed error num d n WSAGetLastError return 0 szBuffer ret 0 printf s n szBuffer if ret scanf s CmdWords 输入命令扫描 输入命令识别 if strncmp CmdWords dir 3 0 strncmp CmdWords DIR 3 0 dirfun h Socket4Cmd continue else if strncmp CmdWords pwd 3 0 strncmp CmdWords PWD 3 0 pwdfun h Socket4Cmd continue else 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 if strncmp CmdWords cd 2 0 strncmp CmdWords CD 2 0 16 cdfun h Socket4Cmd CmdWords2 continue else if strncmp CmdWords md 2 0 strncmp CmdWords MD 2 0 mdfun h Socket4Cmd CmdWords2 continue else if strncmp CmdWords del 3 0 strncmp CmdWords DEL 3 0 delfun h Socket4Cmd CmdWords2 continue else puts 输入错误 按 号获取帮助 或重新输入 fflush stdin printf n closesocket h Socket4Cmd WSACleanup return 0 17 第四章 设计结果及分析 4 1 设计结果 本次课程完成了文件传输协议的简单实现 下面我将从几个板块分别论述其功能 及实现 4 1 1 构建目录查询 构建函数 dirfum 按照协议规则构建目录查询命令并发送到服务器 输入参数 SOCKET h Socket4Cmd 通过此 socket 发送命令到服务器 int dirfun SOCKET h Socket4Cmd int ret char MSG dir char szBuffer 80 strcpy sz Msg2Snd MSG ret send h Socket4Cmd sz Msg2Snd strlen sz Msg2Snd 0 if ret 0 return 1 else if ret SOCKET ERROR printf send funtion failed error num d n WSAGetLastError return 1 while b IsSendOnly 读取流并显示 ret recv h Socket4Cmd szBuffer 80 0 if ret 0 return 1 else if ret SOCKET ERROR printf recv function failed error num d n WSAGetLastError return 1 szBuffer ret 0 if strncmp szBuffer 226 Close strlen 226 Close 0 break printf s szBuffer if strncmp szBuffer 500 Syntax error strlen 500 Syntax error 0 break 18 return 0 4 1 2 构建文件下载命令 构建函数 getfun 来按照协议构建文件下载命令并发送到服务器 及输入参数 SOCKET h Socket4Cmd 通过此 socket 发送命令到服务器 char FileName 40 欲下载 文件的文件名 int getfun SOCKET h Socket4Cmd char FileName 40 int ret FILE fpre char szBuffer 80 sz Msg2Snd 0 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 d n WSAGetLastError return 1 printf Send d bytes successfully n ret ret recv h Socket4Cmd szBuffer 80 0 szBuffer ret 0 printf s n 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 d n WSAGetLastError 19 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 将读取的数据写入到文件 printf error of writing into the file fclose fpre printf transfer is completed n return 0 4 1 3 构建文件上传命令 构建函数 putfun 来按照协议规则构建文件上传命令并发送到服务器 输入参数 SOCKET h Socket4Cmd 通过此 socket 发送命令到服务器 char FileName 40 欲上 传文件的文件名 int putfun SOCKET h Socket4Cmd char FileName 40 Printf 篇幅所限 请读者完成 n iSynError 0 return 0 函数名 pwdfun 说明 按协

温馨提示

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

评论

0/150

提交评论