局域网文件传输系统.docx
《局域网文件传输系统.docx》由会员分享,可在线阅读,更多相关《局域网文件传输系统.docx(24页珍藏版)》请在冰豆网上搜索。
局域网文件传输系统
学号
2013-2014学年第二学期
1008210112
《局域网文件上下传系统》
课程设计报告
题目:
局域网文件上下传系统
专业:
计算机科学与技术
班级:
10级计科
(2)班
姓名:
黄云霞
指导教师:
彭飞
成绩:
计算机与信息工程系
2014年5月22日
局域网文件传输系统
摘要
随着国内外各公司企业的发展壮大和这些企业和公司在办公中更加频繁的使用网络作为公司信息交流的渠道,局域网络在人们的工作和生活中得到了充足的发展。
本课题旨在培养学生利用现有技术进行实际动手的能力,并使得学生能够深入了解局域网在文件传输方面的应用。
局域网小到网内只有两台PC机,大到一个企业的内部网络,它们最主要的功能在于交流和传输文件,并且安全性高、速度快、准确性高。
鉴于局域网有如上优点,开发一个方便快捷的局域网文件传输系统是很有意义的,它在文件传输方面的高效准确将会提高企业的办事效率,为企业节省开支,为家庭用户提供方便。
关键词TCP/IP协议;C/S结构;WindowsSockets编程;VC++
目录
摘要2
Abstract3
第1章绪论6
1.1选题背景6
1.2国内外研究现状6
1.3课题研究的意义6
1.4论文研究内容6
第2章理论知识8
2.1TCP/IP协议8
2.1.1网络接口层8
2.1.2网络层8
2.1.3传输层8
2.1.4应用层9
2.2C/S架构9
2.2.1C/S架构的概念9
2.2.2C/S架构的具体操作步骤10
2.3VC可视化编程环境10
2.4WindowsSocket编程知识11
2.4.1WindowsSocket的发展11
2.4.2WindowsSockets的分类11
2.4.3WindowsSocketsAPI11
2.5本章小结12
第3章软件设计13
3.1局域网文件传输系统程序设计13
3.2局域网文件传输系统设计步骤14
3.3设计客户端所用到的函数24
3.4设计服务器所用到的函数24
3.5消息与消息函数24
3.6功能按钮与函数的对应关系25
第4章软件测试26
4.1程序的安装与运行26
4.2在局域网内传输文件测试26
4.2.1设置服务器26
4.2.2设置客户机并传输文件27
4.3本章小结30
第5章结论31
参考文献32
第1章绪论
1.1选题背景
随着国内外各公司企业的发展壮大和这些企业和公司在办公中更加频繁的使用网络作为公司信息交流的渠道,局域网络在人们的工作和生活中得到了广泛的发展。
本课题旨在培养学生利用现有技术进行实际动手的能力,并使得学生能够深入了解局域网在文件传输方面的应用。
局域网小到网内只有两台PC机,大到一个企业的内部网络,它们最主要的功能在于交流和传输文件,并且安全性高、速度快、准确性高。
鉴于局域网有如上有点,开发一个方便快捷的局域网文件传输系统是很有意义的,它在文件传输方面的高效准确将会提高企业的办事效率,为企业节省开支,为家庭提供方便。
本论文所设计的局域网文件传输系统通过局域网内用户的主机名、IP地址和工作组的名称确定了需要传输文件的双方,进而以C/S模式通过TCP/IP协议实现双方文件的传输功能。
1.2国内外研究现状
大型局域网广泛存在于国内外大型企业中,而大部分企业还是通过Internet等等外网或者U盘等硬件来传输文件,只有少数企业针对该企业的特点设计了自己的文件传输系统,总的来说在企业内部发展局域网文件传输系统还有很大的发展空间。
从1969年美国国防部高级研究计划管理局(ARPA--AdvancedResearchProjectsAgency)建立了一个命名为ARPAnet的网络开始到今日,网络发展已走过足足50年的时间,在这漫长的时间里,局域网文件传输系统也得到了相应的发展,现在正处于高速发展阶段,这从现今市面上流行的腾讯QQ、飞鸽传书等可见一斑。
可以想象,在不久的将来,以内部网络为中心的资源共享系统将在全世界的信息流动中占有到举足轻重的地位。
1.3课题研究的意义
本课题使学生了解局域网在实际工作和生活中的应用,通过让学生自己动手开发比较简单局域网文件传输系统来强化学生的理论知识,培养学生的实际动手能力。
另外,本课题也使得学生对软件开发有了一个感性的认识,为我们在日后的工作中进一步设计更复杂的系统打下了基础。
1.4论文研究内容
用MicrosoftvisualC++6.0软件开发一个以C/S模式通过TCP/IP协议实现点到点文件传输的简单的局域网文件传输系统软件。
该软件传输的文件格式包括文本文档(txt)、图片(JPG)和压缩包(.rar)等等。
该传输系统运行的操作系统平台为WindowsXP或者Windows7,在传输文件之前,需要将多台(>=2台)电脑通过路由器或者交换机用网线连接在一起,为各台PC机设置好IP并建立一个工作组。
在这些电脑上分别安装局域网文件传输系统并运行,实现文件传输的具体步骤如下:
1、在工作组内的所有PC机上运行该软件,并将其中一台PC机设置为服务器。
2、在设置为服务器的PC机上打开要发送的文件。
3、输入要接受文件的PC机的IP地址号、端口号,并连接服务器。
4、发送文件。
第2章理论知识
这一章介绍开发局域网文件传输系统所涉及到的理论知识,包括TCP/IP协议,C/S架构,VC可视化编程环境,WindowsSocket编程。
2.1TCP/IP协议
TCP/IP是TransmissionControlProtocol/InternetProtocol的简写,中文译名为传输控制协议/因特网互联协议,又叫网络通讯协议,这个协议是Internet最基本的协议、Internet国际互联网络的基础,简单地说,就是由网络层的IP协议和传输层的TCP协议组成的。
TCP/IP定义了电子设备(比如计算机)如何连入因特网,以及数据如何在它们之间传输的标准。
TCP/IP是一个四层的分层体系结构。
高层为传输控制协议,它负责聚集信息或把文件拆分成更小的包。
低层是网际协议,它处理每个包的地址部分,使这些包正确的到达目的地。
从协议分层模型方面来讲,TCP/IP由四个层次组成:
网络接口层、网络层、传输层、应用层。
具体介绍如下
2.1.1网络接口层
物理层定义物理介质的各种特性:
1、机械特性;2、电子特性;3、功能特性;4、规程特性。
数据链路层是负责接收IP数据报并通过网络发送之,或者从网络上接收物理帧,抽出IP数据报,交给IP层。
常见的接口层协议有:
Ethernet802.3、TokenRing802.5、X.25、Framerelay、HDLC、PPPATM等。
2.1.2网络层
网络层负责相邻计算机之间的通信。
其功能包括三方面。
(1)、处理来自传输层的分组发送请求,收到请求后,将分组装入IP数据报,填充报头,选择去往信宿机的路径,然后将数据报发往适当的网络接口。
(2)、处理输入数据报:
首先检查其合法性,然后进行寻径--假如该数据报已到达信宿机,则去掉报头,将剩下部分交给适当的传输协议;假如该数据报尚未到达信宿,则转发该数据报。
(3)、处理路径、流控、拥塞等问题。
2.1.3传输层
传输层负责提供应用程序间的通信。
其功能包括:
一、格式化信息流;二、提供可靠传输。
为实现后者,传输层协议规定接收端必须发回确认,并且假如分组丢失,必须重新发送。
传输层协议主要是:
传输控制协议TCP(TransmissionControlProtocol)和用户数据报协议UDP(UserDatagramprotocol)。
2.1.4应用层
应用层负责向用户提供一组常用的应用程序,比如电子邮件、文件传输访问、远程登录等。
远程登录TELNET使用TELNET协议提供在网络其它主机上注册的接口。
TELNET会话提供了基于字符的虚拟终端。
文件传输访问FTP使用FTP协议来提供网络内机器间的文件拷贝功能。
应用层一般是面向用户的服务。
如FTP、TELNET、DNS、SMTP、POP3。
2.2C/S架构
2.2.1C/S架构的概念
C/S即Client/Server结构,是大家熟知的客户机和服务器结构。
它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。
目前大多数应用软件系统都是Client/Server形式的两层结构,由于现在的软件应用系统正在向分布式的Web应用发展,Web和Client/Server应用都可以进行同样的业务处理,应用不同的模块共享逻辑组件;因此,内部的和外部的用户都可以访问新的和现有的应用系统,通过现有应用系统中的逻辑可以扩展出新的应用系统。
这也就是目前应用系统的发展方向。
传统的C/S体系结构虽然采用的是开放模式,但这只是系统开发一级的开放性,在特定的应用中无论是Client端还是Server端都还需要特定的软件支持。
由于没能提供用户真正期望的开放环境,C/S结构的软件需要针对不同的操作系统系统开发不同版本的软件,加之产品的更新换代十分快,已经很难适应百台电脑以上局域网用户同时使用。
而且代价高,效率低。
C/S的优点是能充分发挥客户端PC的处理能力,很多工作可以在客户端处理后再提交给服务器。
对应的优点就是客户端响应速度快。
缺点主要有以下几个:
1、只适用于局域网。
而随着互联网的飞速发展,移动办公和分布式办公越来越普及,这需要我们的系统具有扩展性。
这种方式远程访问需要专门的技术,同时要对系统进行专门的设计来处理分布式的数据。
2、客户端需要安装专用的客户端软件。
首先涉及到安装的工作量,其次任何一台电脑出问题,如病毒、硬件损坏,都需要进行安装或维护。
特别是有很多分部或专卖店的情况,不是工作量的问题,而是路程的问题。
还有,系统软件升级时,每一台客户机需要重新安装,其维护和升级成本非常高。
3、对客户端的操作系统一般也会有限制。
2.2.2C/S架构的具体操作步骤
客户/服务器模式在操作过程中采取的是主动请求方式。
1、服务器方的具体操作步骤如下:
(1)、首先服务器方要先启动,并根据请求提供相应服务。
(2)、打开一个通信通道并告知本地主机,它愿意在某一端口上接收客户请求。
(3)、等待客户请求到达该端口。
(4)、接收到重复请求,处理该请求并发送应答信号。
接收到并发服务请求,要激活一新进程来处理这个客户请求。
新进程处理此客户请求,并不需要对其他请求做出应答。
服务完成后,关闭此进程与客户的通信链接,并终止该进程。
(5)、返回第二步,等待另一客户请求。
(6)、关闭服务器。
2、.客户方的主要操作步骤如下:
(1)、打开一通信通道,并链接到服务器所在主机指定端口。
(2)、向服务器发服务请求报文,等待并接收应答;继续提出请求。
(3)、请求结束后关闭通信通道并终止。
2.3VC可视化编程环境
在MicrosoftVisualC++6.0开发环境DeveloperStudio是在Windows98/2000/XP/7环境下运行的一套集成工具,由文本编辑、资源编辑器、项目建立工具、优化编辑器、增量连接器、源代码浏览器、集成调试器等组成。
VisualC++6.0的软、硬件配置需求如下:
1、操作系统:
Windows98、Windows2000、WindowsXP或者Windows7及更高版本。
2、内存:
根据不同操作系统设定,最好在128M以上。
3、硬盘:
最小需要300MB以上空间。
4、CD-ROM驱动器(用于联机信息)。
2.4WindowsSocket编程知识
2.4.1WindowsSocket的发展
在Intel、Microsoft、Sun、SDI、Informix、Novell等公司的大力支持下,WindowsSocket(以下简称WinSock)从1991年的1.0版发展到1996年的2.2版。
如今WinSock已经成为Windows网络编程的标准。
2.4.2WindowsSockets的分类
WinSock编程分为同步(Sync)和异步(Async)。
同步方式指的是发送方不等接收方响应,便接着发下一个数据包得通信方式。
同步方式逻辑清晰,编程专注于应用,在抢先式的多任务操作系统中(WinNT、Win2000),采用多线程方式效率基本达到异步方式的水平。
而异步指发送方发出数据以后,等收到接收方发回的响应,才发出下一个数据包的通信方式。
阻塞套接字是指执行此套接字的网络调用时,直到成功才返回,否则一直阻塞在此网路调用上,比如调用recv()函数读取网路缓冲区中的数据,如果没有数据到达,将一直用recv()这个函数调用上,知道读到一些数据,此函数才返回;而非阻塞套接字是指此套接字的网络调用时,不管是否执行成功,都立即返回。
比如调用recv()函数读取网络缓冲区中的数据,不管是否读到数据都立即返回,而不会一直挂在此函数调用上。
在实际Windows网络通信软件中,异步非阻塞套接字是用的最多的。
平常所用的C/S结构软件用到的就是异步非阻塞模式的。
2.4.3WindowsSocketsAPI
Windows提供了一系列的API来支持Sockets,主要包括两类,一类是berkeley类型的函数,另一类是已经认可的作为WindowsSockets2的一部分的Windows特殊的扩展函数。
下面对一些常用的WindowsSocketsAPI函数进行简单说明:
1、socket():
创建一个Socket。
所有的通信在建立连接之前都要创建一个Socket,该函数的功能与文件操作中的fopen类似。
2、bind():
为创建的Socket指定通讯对象。
成功建立Socket之后,就应该选定通信的对象。
首先是自己的程序需要与网络上的哪台计算机通话;其次,在多任务的系统下,该台计算机可能会有几个程序在工作,必须指出与那个程序通信。
前者可以通过Intenet的网络IP地址来确定,而后者就需要指出端口号,用端口号来表示同一台计算机上不同的应用程序,可以从0-65536之间任选,不同功能的应用程序使用不同的端口号,这样一台计算机上可以有几个程序同时使用一个IP地址而互不干扰。
3、listen():
设置等待连接状态。
对于服务器的程序,当申请到Socket,并制定通信对象为INADDR-ANY之后,就应该等待一个客户机的程序来要求连接。
而listen()就是把一个Socket设置这种状态的函数。
4、accept():
接收请求连接。
当没有连接请求时,对于阻塞方式,就进入等待状态,直至有一个请求到达为止。
5、connect():
主动提出请求连接。
以上的bind()、listen()、和accept()函数一般都用于服务程序,属于被动等待的函数;对于客户端,要主动提出连接请求,应使用connect()函数。
6、sent()/recv():
发送、接受数据。
7、connect():
直接通信。
8、closesocket(SOCKETs):
通信结束,关闭指定的Socket。
2.5本章小结
这一章所介绍的TCP/IP协议、编程的相关知识是下一章所展示的软件的编写基础,只有在这一章的理论指导下,软件的编写才能合乎实际,才能最终实现在局域网内传输文件。
第3章软件设计
在第三章中展示了用局域网文件传输系统,并成功传输了一个文件,这一章将对程序内部的细节予以介绍。
该局域网文件传输系统使用VC++为编程语言,编程软件为MicrosoftVisualC++,使用对话框为该软件的编程框架,其中用到了C++标准库函数和MFC类库,在并将其转化为自己所需要的功能函数。
客户机和服务器的信息流如图4-1所示:
图3-1
3.1局域网文件传输系统程序设计
局域网文件传输系统的主要功能是建立与服务器的连接,向服务器发送数据,并且能够接收由服务器传送而来的数据。
局域网文件传输系统如图3-2所示:
图3-2
3.2局域网文件传输系统设计步骤
(1)创建一个基于对话框的应用程序,在对话框中添加IP地址、EditBox、ProgressBar等控件,如图3-3所示:
图3-3
(2)按组合键,打开“MFCclasswizard”对话框,利用“MFCclasswiard”对话框为对话框中的控件命名或关联数据。
如图3-4所示:
图3-4
(3)在对话框类的头文件中引用winsock2.h头文件,并导入ws2_32.lib库文件。
#include”winsock2.h”
#pragmacomment(lib,”ws2_32.lib”)
(4)在应用程序的InitInstance方法中初始化逃接字。
WSADATAwsd;
WSAStartup(MAKEWORD(2,2),&wsd);
(5)在对话框的OnitDialog方法中创建套接字。
M_Client=socket(AF_INET,SOCK_STREAM,0);
(6)在对话框类中添加成员函数
CStringm_FileName;//传送的文件名称
BOOLm_IsReveived;//是否接收数据
CStringm_ReceiveFile;//接收的文件名称
DWORDm_FileSize;//接收的文件大小
DWORDm_FileLen;//接收的文件长度
CServerSocket*m_pServerSock;//接收文件套接字
CServerSocket*m_ServerSock;
CClientSocket*m_pSendSock;//发送文件套接字
CFilem_File;//保存接收的文件
BOOLm_Send;//是否开始发送数据
BOOLm_SendNext;//是否继续发送数据
DWORDm_SendNum;//记录当前发送的次数
CFilem_SendFile;//发送的文件
DWORDm_SendLen;//记录已经发送的文件长度
DWORDm_SendFileLen;//发送文件的长度
CStringm_IP;//本机IP
BOOLm_Received;//判断是否接收到对方的回应信息
BOOLm_SendFinished;//发送是否完成
intm_Count;
(7)向对话框类中添加AcceptConnection方法,用于接受客户端套接字的连接。
VoidLANFileTransfer:
:
AcceptConnect()
{
M_serverSock->Close();
M_pServerSock->Accept(*m_ServerSock);
}
(8)处理”设置成服务器”按钮的单击事件,创建服务器,并设置设置套接字接收数据时触发的消息。
VoidCLanFileTransfer:
:
OnSetServer()
{
Sockaddr_inserveraddr;
UpdateData(TRUE);
Serveraddr.sin_family=AF_INET;
Serveraddr.sin_port=htons(m_port);
Serveraddr.sin_addr.S_un.S_addr=inet_addr(m_IP);
If(connect(m_client,(Sockaddr*)&serveraddr,sinzeof()serveraddr))!
=0)
{
MeesageBox(“connectFail!
!
!
”)
Return;
}
Else
MessageBox(“Connected!
!
!
”);
WSSAAsyncSelect(m_client,m_hWnd,1000,FD_READ);
CStringstr,Info;
m_path.GetWindowText(str);
info.Format(“%s-----%s”,str,”It’sallowedtoTransferfileInLanFile!
!
!
”);
inti=send(m_Client,Info.GetBuffer(0),info.GetLength(),0);
}
(9)处理“发送”按钮的单击事件,向服务器发送数据。
VoidCLanFileTransfer:
:
voidCTransFileDlg:
:
SendFileData()
{
m_Send=TRUE;
m_SendNext=TRUE;
m_Received=TRUE;
chardata[100];
memset(data,0,100);
m_SendNum+=1;
m_pSendSock->Receive(data,100);//获得对方的应答信息
CStringrdata=data;
if(m_SendLen>=m_SendFileLen)//发送文件完成
{
m_Send=FALSE;
m_SendNext=FALSE;
m_SendFile.Close();
m_pSendSock->Close();
m_pSendSock->Create(CLIENTPORT);
MessageBox("发送完成");
return;
}
if((m_SendLen==0)&&(rdata=="取消"))
{
m_Send=FALSE;
m_SendNext=FALSE;
m_SendFile.Close();
m_pSendSock->Close();
m_pSendSock->Create(CLIENTPORT);
MessageBox("对方取消了文件接收");
return;
}
char*membuf=(char*)LocalAlloc(LMEM_FIXED,MAXSENDNUM);
memset(membuf,0,MAXSENDNUM);
intresult;
if((m_SendLenm_SendFileLen))
{
m_SendFile.ReadHuge(membuf,m_SendFileLen-m_SendLen);
result=m_pSendSock->Send(membuf,m_SendFileLen-m_SendLen);
if(result==SOCKET_ERROR)
{
m_Send=FALSE;
m_SendNext=FALSE;
m_SendFile.Close();
m_pSendSock->Close();
m_pSendSock->Create(CLIENTPORT);
LocalFree(membuf);
KillTimer
(1);
MessageBox("发送失败");
return;
}
m_SendLen=m_SendFileLen;
}
else
{
m_SendFile.ReadHuge(membuf,M