实验二.docx
《实验二.docx》由会员分享,可在线阅读,更多相关《实验二.docx(11页珍藏版)》请在冰豆网上搜索。
实验二
本科实验报告
课程名称:
计算机网络基础
姓名:
学院:
计算机学院
系:
专业:
软件工程
学号:
指导教师:
浙江大学实验报告
课程名称:
计算机网络基础实验类型:
普通实验
实验项目名称:
用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定义,由服务器和客户共用,体系了代码重用的思想。