实验二.docx

上传人:b****6 文档编号:6165540 上传时间:2023-01-04 格式:DOCX 页数:11 大小:272.63KB
下载 相关 举报
实验二.docx_第1页
第1页 / 共11页
实验二.docx_第2页
第2页 / 共11页
实验二.docx_第3页
第3页 / 共11页
实验二.docx_第4页
第4页 / 共11页
实验二.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

实验二.docx

《实验二.docx》由会员分享,可在线阅读,更多相关《实验二.docx(11页珍藏版)》请在冰豆网上搜索。

实验二.docx

实验二

 

本科实验报告

 

课程名称:

计算机网络基础

姓名:

学院:

计算机学院

系:

专业:

软件工程

学号:

指导教师:

 

浙江大学实验报告

课程名称:

计算机网络基础实验类型:

普通实验

实验项目名称:

用SOCKET编程实现miniFTPclient/Server

一、实验目的和要求:

熟悉掌握windows下的Socket编程,并应用SocketAPI实现mini FTP client/ Server。

二、实验内容和原理

使用Win32Socket函数实现,不能使用MFC的Csocket类库(MFC的Csocket类库不能在LINUX、UNIX等环境下使用,跨平台性差),不能用C++builder开发(编程量太少,C++builder已完成了很多SOCKET代码的编写)。

1.miniFTPclient/Server要求:

在客户端至少实现GETfile,PUTfile,CD(changeDirectory),PWD(displaycurrentdirectoryinserver)功能。

独立完成miniFTPclient端及Server端程序。

miniFTPclient/Server不一定要使用标准FTP协议,不一定要与现有的标准FTPserver互通,也不一定要与现有的标准FTPClient(例如LEAPFTP)互通。

miniFTPclient/Server可使用自定义的FTP协议、应用层PDU格式及握手方式。

2.补充:

有能力的同学在完成任务后,可以进一步开发client端软件,尝试与现有的标准FTPserver互通,实现GETfile,PUTfile,CD(changeDirectory),PWD(displaycurrentdirectoryinserver)等功能。

有能力的同学在完成任务后,可以进一步在自己机器上的linux/unix平台下实现miniFTPclient/Server或聊天程序。

三、主要仪器设备

联网的PC机。

四、操作方法与实验步骤

4.1需求分析

1、MiniFTP需要支持以下命令:

GET、PUT、PWD、CD、LS、QUIT。

2、PWD(显示当前目录)、CD(更改当前目录)、LS(列目录)可理解为Request-Reply类服务。

3、GET、PUT命令涉及文件内容传输(可能很大),需要保证可靠性。

需要检查文件是否已经存在、是否有读出或写入权限。

4、正常情况下客户端应在断开连接前发送QUIT消息。

否则,服务器认为客户端为非正常断开。

5、客户端能够选择目标服务器。

6、服务器能与多个客户端相连。

4.2MiniFTP协议定义

1、使用TCP作为下层传输协议。

2、MiniFTP协议定义发送和接受的基本单位为Block。

(1)每个Block由type(4bytes)、length(4bytes)、data(lengthbytes)三部分组成。

发送块时按顺序写进这三个字段。

(2)data是Block的数据部分;length是data的长度。

如果length为0,则Block不包含data部分。

(3)接收块时,首先读取块头(type&length),再读满lengthbytes的data。

3、type分为三类。

(1)请求命令块,包括CommandLS、CommandPWD、CommandCD、CommandGET、CommandPUT、CommandQUIT。

(2)响应块,包括CommandOK,CommandERR,CommandINFO。

(3)附加块:

Command0。

(列目录/文件传输需要多于一块。

4、客户端的一次完整请求以请求命令块开始。

(1)PWD、LS、CD、QUIT命令均只包含一个请求命令块;CD命令的目标目录放在CommandCD块data部分中。

(2)GET命令以CommandGET块发送待下载的文件名。

如果服务器回应CommandERR,则GET失败。

否则,开始循环接收Command0块(文件数据),直到收到CommandOK块为止。

(3)PUT命令以CommandPUT块发送待下载的文件名。

如果服务器回应CommandERR,则PUT失败。

否则服务器回复了Command0,客户开始循环发送Command0块(文件数据),直到读完文件。

最后写入一个无data部分的Command0块表示发送结束,等待服务器回复CommandOK。

(4)其它命令无data部分。

5、服务器端的一次完整回应以回应命令块结束。

(1)CommandOK表示操作成功,CommandERR表示操作失败。

(2)PWD、CD响应均只包含一个响应块,当前或更改后的目标目录放在块的data部分。

(3)GET命令处理时,如不允许GET文件,则发送CommandERR块。

否则,开始循环发送Command0块(文件数据),直到读完文件。

最后写入CommandOK块。

(4)PUT命令处理时,如不允许PUT文件,则发送CommandERR块。

否则,回复Command0块指示客户端可以发送。

开始循环接Command0块(文件数据),直到收到一个无data部分的Command0块。

回复CommandOK。

(5)QUIT不响应,而是断开连接。

8、连接建立时,服务器发送欢迎信息(以CommandINFO块形式)。

客户收到此欢迎信息才可发送命令。

4.3概要设计

1、服务器。

采用纯OO设计。

(1)主模块ServerMain,初始化和清理WinsockSupport。

(2)服务器类Server,创建监听端口并启动监听任务。

(3)监听任务ServerListenTask,创建监听线程,接受连接并启动工作任务。

(4)工作任务ServiceWorkTask,与单个Client通信。

其中包括启动新线程,发送欢迎消息、主命令循环和断开客户三部分工作。

2、客户。

采用模块化设计。

(1)主模块ServerClient,初始化网络并启动命令循环。

(2)命令分发模块processCommand。

(3)命令处理模块get、put、ls、cd、pwd。

3、公共部分。

(1)配置:

服务器监听端口、块的最大数据长度。

(2)结构定义:

块、块类型。

(3)公共功能:

网络初始化函数、块接收函数、块写入函数。

4.4编码

1、源代码见本报告所在文件夹下的source文件夹。

(1)Client文件夹:

客户代码。

编译后产生MiniFTPClient.exe。

(2)Server文件夹:

客户代码。

编译后产生MiniFTPServer.exe。

2、编译客户

4.5测试

(为使报告易于阅读,已经一并写入报告第5节。

五、实验数据记录和处理

1、服务器启动。

图表1:

服务器启动

服务器启动成功,未发生网络错误。

2、连接建立。

(1)不带命令行参数运行MiniFTPClient.exe。

图表2:

MiniFTPClient不带参运行

客户程序提示用户指定一个服务器。

可输入服务器名称/IP进行连接。

在这里输入localhost。

(2)连接建立:

图表3:

连接建立(Client)

图表4:

连接建立(Server)

可见客户端连接成功,收到服务器的欢迎消息;服务器显示客户端信息。

(3)也可带参运行MiniFTPClient,提供服务器名称/IP作为命令行参数。

图表5:

MiniFTPClient带参运行

可见带参运行时不会再提示输入服务器名/IP了。

2、多连接并发。

图表6:

多连接并发支持

刚才我们已经启用了两个Client实例,服务器能同时处理它们。

3、PWD。

图表7:

PWD

查看当前目录成功。

4、LS。

图表8:

LS

列出当前目录成功。

5、CD。

(1)CDabc

图表9:

CDabc

无法进入不存在的目录。

(2)CD\

图表10:

CD\

更改当前目录成功。

6、GET。

F盘下存在图片test.jpg。

图表11:

F:

\test.jpg(onserver)

GET:

图表12:

GETtest.jpg

传输成功。

图片下载到客户端运行路径下并可查看。

图表13:

test.jpg(Client)

7、PUT。

Client端存在文件:

abc.jpg。

现在让服务器进入Work目录(已存在),并PUT:

图表14:

CDwork+PUTabc.jpg

传输成功。

图片上传到服务器工作路径并可查看。

图表15:

F:

\计算机网络\bin\Server\test.jpg(Server)

7、QUIT。

图表16:

QUIT(Client)

图表17:

QUIT(Server)

退出成功。

服务器显示提示。

六、实验结果与分析

(为使报告易于阅读,已经一并写入报告第5节并用粗体标示。

七、讨论、心得

1、本次实验中我尝试自己定义了一个基于块的传输协议。

2、块的头部包含type和length字段。

length字段用来保证接收方确切了解发送方发来的数据长度,避免了许多由于网络、TCP协议和Socket特性而导致的数据截断问题。

3、块的type值有请求(CommandGET/PUT/LS/CD/PWD/QUIT)、响应(CommandOK/ERR)和继续(Command0)三大类,支持Request-Reply风格的FTP通信。

4、继续块(Command0块)被用来传输大量数据(LS/GET/PUT),这样避免了专门建立数据连接的额外工作,有利性能提升。

而标准FTP协议使用数据连接,便于即时控制的好处。

两者各有优缺点。

5、服务器较为复杂,设计是完全的OO-style,有服务器控制、监听任务、工作任务三个主要对象,其中工作任务对象(与客户端通信的逻辑)按需创建多个实例。

(详见概要设计部分)。

6、客户端规模较小,故采用一般的结构化、模块划分方式实现。

7、本次实验用到了多线程编程。

其中线程功能被封装在一个类中(Thread类)。

这个类模拟Java的Thread类,接受一个IRunnable接口作为将在线程上运行的对象,大大简化了编码并将多线程支持与主要逻辑分离。

8、由于服务器与客户有许多公共部分(协议数据定义、网络代码)。

这些内容在MiniFTP.h定义,由服务器和客户共用,体系了代码重用的思想。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 理化生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1