网络编程实验指导书.doc_第1页
网络编程实验指导书.doc_第2页
网络编程实验指导书.doc_第3页
网络编程实验指导书.doc_第4页
网络编程实验指导书.doc_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

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

文档简介

网 络 编 程 实 验 指 导 书梁 峰微机综合实验室随着计算机和Internet网络的发展,原先在测量、控制、消费等领域不同设备/仪器之间,大多采用RS232/485或现场总线组建网络等进行数据传输的情况正在改变,特别在要求数据传输速度和可靠性方面的应用产品,转向基于Internet网络的远程传输和应用。网络编程大多基于TCP/IP协议,实现方法有多种,复杂但编程适应性广的方法是调用底层的Winsock API函数或MFC基本类等;简单方便的方法可以采用如Winsock控件。在网络编程中最常用的方案便是客户机/服务器模型,客户应用程序向服务器程序请求服务;另外一种模式是点对点通信,通信双方对等,既有客户机功能又有服务器的功能,编程简单,适合传输数据流少的场合,而且采用简单的UDP协议,易于用微控制器等嵌入式系统实现,在测量控制方面有许多应用。本实验指导书将介绍一些网络编程和Winsock控件知识,用VC+实现网络间的通信。本实验共有16学时,分为8次实验进行。实验一 网络编程相关知识的介绍及学习一实验目的:了解TCP/IP体系结构,Winsock编程套接字原理,Windows Sockets网络程序设计核心原理二实验任务:学习网络编程的原理,熟悉VC+6.0,MFC类的生成向导等工具的使用三实验内容1 了解TCP/IP体系结构TCP/IP协议的核心部分是传输层协议(TCP、UDP),网络层协议(IP)和物理接口层,这三层通常是在操作系统内核中实现。因此用户一般不涉及。编程时,编程界面有两种形式:(1)是由内核心直接提供的系统调用;(2)使用以库函数方式提供的各种函数。前者为核内实现,后者为核外实现。用户服务要通过核外的应用程序才能实现,所以要使用套接字(socket)来实现。下图是TCP/IP协议核心与应用程序关系图。2 套接字Sockets及Winsock编程原理Windows Sockets接口是TCP/IP网络最为通用API(应用程序接口),已成为Windows网络编程的事实上的标准。它以Unix中流行的Socket接口为范例定义了一套Microsoft Windows下网络编程接口函数库。它不仅包含了人们所熟悉的Berkeley Socket风格的库函数;也包含了一组针对Windows的扩展库函数,以使程序员能充分地利用Windows消息驱动机制进行编程。SOCKET实际在计算机中提供了一个通信端口,可以通过这个端口与任何一个具有SOCKET接口的计算机通信。应用程序在网络上传输,接收的信息都通过这个SOCKET接口来实现。在应用开发中就像使用文件句柄一样,可以对SOCKET句柄进行读,写操作。VC+对原来的WindowsSockets库函数进行了一系列封装,继而产生了CAsynSocket、CSocket、CSocketFile等类,它们封装着有关Socket的各种功能。在VC中进行WINSOCK的API编程开发,需要使用到下面三个文件:WINSOCK.H:这是WINSOCK API的头文件。WSOCK32.LIB: WINSOCK API连接库文件。在使用中,一点要把它作为项目的非缺省的连接库包含到项目文件中去。WINSOCK.DLL:WINSOCK的动态连接库。总的来说,使用SOCKET接口(面向连接或无连接)进行网络通信时,必须按下面简单的四步进行处理:(1) 程序必须建立一个 SOCKET。(2) 程序必须按要求配置此SOCKET。也就是说,程序要么将此SOCKET连接到远方的主机上,要么给此SOCKET指定一个本地协议端口。(3) 程序必须按要求通过此SOCKET发送和接收数据。(4) 程序必须关闭此SOCKET。3WINSOCK API主要函数简介(1)WSAStartup():连结应用程序与 Windows Sockets DLL 的第一个函数。说明: 此函数是应用程序调用 Windows Sockets DLL函数中的第一个,也唯有此函数呼叫成功後,才可以再调用其他 Windows Sockets DLL 的函数。(2)WSACleanup():结束 Windows Sockets DLL 的使用。说明: 当应用程序不再需要使用 Windows Sockets DLL时,须调用此函数来注销使用,以便释放其占用的资源。(3)socket():建立Socket。说明: 此函数用来建立一 Socket 描述字,并为此 Socket 建立其所使用的资源。(4)closesocket():关闭某一Socket。说明: 此一函数是用来关闭某一 Socket。(5) bind():将一本地地址与一个SOCKET描述字连接在一起。说明:此函数在服务程序上使用,是调用监听函数listen()必须要调用的函数。(6)listen():设定 Socket 为监听状态,准备被连接。说明: 此函数在服务程序上使用,来设定 Socket 进入监听状态,并设定最多可有多少个在未真正完成连接前的客户端的连接要求。(目前最大值限制为 5, 最小值为1)(7)accept():接受某一Socket的连接要求,以完成面向连接的客户端 Socket 的连接请求。说明: 服务端应用程序调用此函数来接受客户端Socket 连接请求,accept() 函数的返回值为一新的 Socket,新 Socket 就可用来在服务端和客户端之间的信息传递接收,而原来 Socket 仍然可以接收其他客户端的连接要求。(8)connect():要求连接某一Socket到指定的网络上服务端。说明: 此函数用在客户端,用来向服务端要求建立连接。当连接建立完成後,客户端即可利用此 Socket 来与服务端进行信息传递。(9)recv():从面向连接的 Socket 接收信息。说明: 此函数用来从面向连接的 Socket 接收信息。(10)send():使用面向连接的 Socket 发送信息。说明: 此函数用来从面向连接的 Socket 发送信息。(11)WSAAsyncSelect():要求某一 Socket 有事件 (event) 发生时通知使用者。说明: 此函数用来请求Windows Sockets DLL 为窗口句柄发一条消息无论它何时检测到由lEvent参数指明的网络事件。要发送的消息由wMsg参数标明.被通知的套接口由s标识。本函数自动将套接口设置为非阻塞模式。lEvent参数由下表中列出的值组成。值 意义FD_READ 欲接收读准备好的通知。FD_WRITE 欲接收写准备好的通知。FD_OOB 欲接收带边数据到达的通知。FD_ACCEPT 欲接收将要连接的通知。FD_CONNECT 欲接收已连接好的通知。FD_CLOSE 欲接收套接口关闭的通知。实验二 UDP通信程序的编制一实验目的:了解UDP协议基础,学习使用WinSock进行无连接的通信的方法二实验任务:编程实现基于UDP的通信程序 三实验内容1 UDP协议基础UDP协议是英文UserDatagramProtocol的缩写,即用户数据报协议,主要用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。 与我们所熟知的TCP(传输控制协议)协议一样,UDP协议直接位于IP(网际协议)协议的顶层。根据OSI(开放系统互连)参考模型,UDP和TCP都属于传输层协议。UDP协议的主要作用是将网络数据流量压缩成数据报的形式。一个典型的数据报就是一个二进制数据的传输单位。每一个数据报的前8个字节用来包含报头信息,剩余字节则用来包含具体的传输数据。UDP协议使用端口号为不同的应用保留其各自的数据传输通道。UDP和TCP协议正是采用这一机制实现对同一时刻内多项应用同时发送和接收数据的支持。数据发送一方(可以是客户端或服务器端)将UDP数据报通过源端口发送出去,而数据接收一方则通过目标端口接收数据。有的网络应用只能使用预先为其预留或注册的静态端口;而另外一些网络应用则可以使用未被注册的动态端口。因为UDP报头使用两个字节存放端口号,所以端口号的有效范围是从0到65535。一般来说,大于49151的端口号都代表动态端口。数据报的长度是指包括报头和数据部分在内的总的字节数。因为报头的长度是固定的,所以该域主要被用来计算可变长度的数据部分(又称为数据负载)。数据报的最大长度根据操作环境的不同而各异。从理论上说,包含报头在内的数据报的最大长度为65535字节。不过,一些实际应用往往会限制数据报的大小,有时会降低到8192字节。UDP协议使用报头中的校验值来保证数据的安全。校验值首先在数据发送方通过特殊的算法计算得出,在传递到接收方之后,还需要再重新计算。如果某个数据报在传输过程中被第三方篡改或者由于线路噪音等原因受到损坏,发送和接收方的校验计算值将不会相符,由此UDP协议可以检测是否出错。这与TCP协议是不同的,后者要求必须具有校验值。2 UDP编程基础由于UDP协议并不需要建立一个明确的连接,因此建立UDP应用要比建立TCP应用简单得多。WinSock提供了对UDP(用户数据报协议)的支持,通过UDP协议可以向指定IP地址的主机发送数据,同时也可以从指定IP地址的主机接收数据,发送和接收方处于相同的地位没有主次之分。利用CSocket操纵无连接的数据发送,首先生成一个本地套接口(需要指明SOCK_DGRAM标记),然后利用 int CAsyncSocket:SendTo( const void* lpBuf, int nBufLen, UINT nHostPort, LPCTSTR lpszHostAddress = NULL, int nFlags = 0 )发送数据, int CAsyncSocket:ReceiveFrom( void* lpBuf, int nBufLen, CString& rSocketAddress, UINT& rSocketPort, int nFlags = 0 )接收数据。函数调用顺序如图。利用UDP协议发送和接收都可以是双向的,就是说任何一个主机都可以发送和接收数据。但是UDP协议是无连接的,所以发送的数据不一定能被接收,此外接收的顺序也有可能与发送顺序不一致。下面是相关代码: /*发送方在端口6800上向接收方端口6801发送数据*/发送方代码:BOOL CMy62_s1_clientDlg:OnInitDialog()CDialog:OnInitDialog();m_sockSend.Create(6800,SOCK_DGRAM,NULL); /创建本地套接口m_sockSend.Bind(6800,); /绑定本地套接口SetTimer(1,3000,NULL); /创建一个定时器定时发送.void CMy62_s1_clientDlg:OnTimer(UINT nIDEvent) static iIndex=0;char szSend20;sprintf(szSend,%010d,iIndex+);int iSend= m_sockSend.SendTo(szSend,10,6801,,0); /发送UDP数据TRACE(sent %d byten,iSend);./接收方代码BOOL CMy62_s1_serverDlg:OnInitDialog()CDialog:OnInitDialog();m_sockRecv.Create(6801,SOCK_DGRAM,);/创建本地套接口m_sockRecv.Bind(6801,); /绑定本地套接口SetTimer(1,3000,NULL); /创建一个定时器定时读取.void CMy62_s1_serverDlg:OnTimer(UINT nIDEvent) char szRecv20;CString szIP();UINT uPort=6800;int iRecv =m_sockRecv.ReceiveFrom(szRecv,10,szIP,uPort,0); /接收UDP数据TRACE(received %d byten,iRecv);./*接收方采用同步读取数据的方式,所以没有读到数据函数调用将不会返回*/3.使用UDP协议实现发送、接收数据的程序(1)建立UDP客户端程序,由小到大显示数字,如下图所示(2)建立UDP服务器端程序,如下图所示 (3) 客户端程序通过UDP协议向服务器程序发送数据,服务器程序接收数据并显示,如图所示:实验三 TCP通信程序的编制一实验目的:了解TCP协议基础,学习使用WinSock进行有连接的通信的方法二实验任务:编程实现基于TCP的通信程序 三实验内容1 TCP协议基础TCP(Transfer Control Protocol)是传输控制协议的简称,是基于连接的协议,在数据传输之前必须先建立连接,通信双方是基于客户/服务器模型,必须分别建立客户应用程序和服务器应用程序。TCP协议主要为了在主机间实现高可靠性的包交换传输协议。TCP是面向连接的端到端的可靠协议。它支持多种网络应用程序。TCP对下层服务没有多少要求,它假定下层只能提供不可靠的数据报服务,它可以在多种硬件构成的网络上运行。下面的图是TCP在层次式结构中的位置,它的下层是IP协议,TCP可以根据IP协议提供的服务传送大小不定的数据,IP协议负责对数据进行分段,重组,在多种网络中传送。TCP的上面就是应用程序,下面是IP协议,上层接口包括一系列类似于操作系统中断的调用。对于上层应用程序来说,TCP应该能够异步传送数据。下层接口假定为IP协议接口。为了在并不可靠的网络上实现面向连接的可靠的传送数据,TCP必须解决可靠性,流量控制的问题,必须能够为上层应用程序提供多个接口,同时为多个应用程序提供数据,同时TCP必须解决连接问题,这样TCP才能称得上是面向连接的,最后,TCP也必须能够解决通信安全性的问题。进程为了传送数据会调用TCP,将数据和相应的参数传送给TCP,于是TCP会将数据传送到目的TCP那里,当然这是通过将TCP包打包在IP包内在网络上传送达到的。接收方TCP在接收到数据后会通信上层应用程序,TCP会保证接收数据顺序的正确性。在实现TCP的主机上,TCP可以被看成是一个模块,和文件系统区别不大,TCP也可以调用一些操作系统的功能,TCP不直接和网络打交道,控制网络的任务由专门的设备驱动模块完成。TCP只是调用IP接口,IP向TCP提供所有TCP需要的服务。通过下图可以更清楚地看到TCP协议的结构。2 TCP编程基础WinSock提供了对TCP(传输控制协议)的支持,通过TCP协议可以与指定IP地址的主机建立,同时利用建立的连接可以双向的交换数据。利用CSocket操纵有连接数据交换很简单,但是在有连接的通信中必需有一方扮演服务器的角色等待另一方(客户方)的连接请求,所以服务器方需要建立一个监听套接口,然后在此套接口上等待连接。当连接建立后会产生一个新的套接口用于通信。而客户方在创建套接口后只需要简单的调用连接函数就可以创建连接。对于有连接的通信不论是数据的发送还是发送与接收的顺序都是有保证的。双方的函数调用顺序如图。下面的代码演示了如何建立连接和发送/接收数据: /*服务器方在端口6802上等待连接,当连接建立后关闭监听套接口客户方向服务器端口6802发起连接请求*/BOOL CMy63_s1_serverDlg:OnInitDialog()CDialog:OnInitDialog();CSocket sockListen;sockListen.Create(6802,SOCK_STREAM,);/创建本地套接口 sockListen.Bind(6802,);/绑定参数sockListen.Listen(5);sockListen.Accept(m_sockSend); /等待连接请求,m_sockSend为成员变量,用于通信sockListen.Close(); /关闭监听套接口SetTimer(1,3000,NULL); /启动定时器,定时发送数据.void CMy63_s1_serverDlg:OnTimer(UINT nIDEvent) static iIndex=0;char szSend20;sprintf(szSend,%010d,iIndex+);int iSend= m_sockSend.Send(szSend,10,0); /发送TCP数据.BOOL CMy63_s1_clientDlg:OnInitDialog()CDialog:OnInitDialog();m_sockRecv.Create(); /创建本地套接口BOOL fC=m_sockRecv.Connect(,6802); /发起连接请求TRACE(connect is %sn,(fC)?OK:Error);SetTimer(1,3000,NULL); /启动定时器,定时接收数据.void CMy63_s1_clientDlg:OnTimer(UINT nIDEvent) char szRecv20;int iRecv =m_sockRecv.Receive(szRecv,10,0); /接收TCP数据TRACE(received %d byten,iRecv);if(iRecv=0)szRecviRecv=0;m_szRecv=szRecv;UpdateData(FALSE);3.使用TCP协议实现发送、接收数据的程序(1) 建立TCP服务器程序,监听端口的信息(2) 建立TCP客户端程序,连接服务器程序(3) 客户端程序通过TCP协议连接服务器程序,并接收和显示服务器程序发出的数据,如图所示:实验四 FTP程序的实现一实验目的:了解FTP协议基础,学习利用WinSock实现FTP的方法二实验任务:编程实现FTP程序 三实验内容1 FTP协议基础FTP 是 TCP/IP 协议组中的协议之一,是英文File Transfer Protocol的缩写。该协议是Internet文件传送的基础,它由一系列规格说明文档组成,目标是提高文件的共享性,提供非直接使用远程计算机,使存储介质对用户透明和可靠高效地传送数据。简单的说,FTP就是完成两台计算机之间的拷贝,从远程计算机拷贝文件至自己的计算机上,称之为“下载(download)”文件。若将文件从自己计算机中拷贝至远程计算机上,则称之为“上载(upload)”文件。在TCP/IP协议中,FTP标准命令TCP端口号为21,Port方式数据端口为20。 依照 FTP 协议提供服务,进行文件传送的计算机就是 FTP 服务器,而连接FTP服务器,遵循FTP协议与服务器传送文件的电脑就是FTP客户端。FTP协议的任务是从一台计算机将文件传送到另一台计算机,它与这两台计算机所处的位置、联接的方式、甚至是是否使用相同的操作系统无关。假设两台计算机能通过ftp协议对话,并且能访问Internet, 就可以用ftp命令来传输文件。每种操作系统使用上有某一些细微差别,但是每种协议基本的命令结构是相同的。 FTP的传输有两种方式:ASCII传输模式和二进制数据传输模式。 (1)ASCII传输方式:假定用户正在拷贝的文件包含的简单ASCII码文本,如果在远程机器上运行的不是UNIX,当文件传输时ftp通常会自动地调整文件的内容以便于把文件解释成另外那台计算机存储文本文件的格式。 但是常常有这样的情况,用户正在传输的文件包含的不是文本文件,它们可能是程序,数据库,字处理文件或者压缩文件(尽管字处理文件包含的大部分是文本,其中也包含有指示页尺寸,字库等信息的非打印字符)。在拷贝任何非文本文件之前,用binary 命令告诉ftp逐字拷贝,不要对这些文件进行处理,这也是下面要讲的二进制传输。 (2)二进制传输模式:在二进制传输中,保存文件的位序,以便原始和拷贝的是逐位一一对应的。即使目的地机器上包含位序列的文件是没意义的。例如,macintosh以二进制方式传送可执行文件到Windows系统,在对方系统上,此文件不能执行。 如果你在ASCII方式下传输二进制文件,即使不需要也仍会转译。这会使传输稍微变慢 ,也会损坏数据,使文件变得不能用。(在大多数计算机上,ASCII方式一般假设每一字符的第一有效位无意义,因为ASCII字符组合不使用它。如果你传输二进制文件,所有的位都是重要的。)如果你知道这两台机器是同样的,则二进制方式对文本文件和数据文件都是有效的。FTP支持工作两种模式,一种方式叫做Standard (也就是 PORT方式,主动方式),一种是 Passive (也就是PASV,被动方式)。 Standard模式 FTP的客户端发送 PORT 命令到FTP服务器。Passive模式FTP的客户端发送 PASV命令到 FTP Server。 下面介绍一个这两种方式的工作原理: Port模式FTP 客户端首先和FTP服务器的TCP 21端口建立连接,通过这个通道发送命令,客户端需要接收数据的时候在这个通道上发送PORT命令。 PORT命令包含了客户端用什么端口接收数据。在传送数据的时候,服务器端通过自己的TCP 20端口连接至客户端的指定端口发送数据。 FTP server必须和客户端建立一个新的连接用来传送数据。 Passive模式在建立控制通道的时候和Standard模式类似,但建立连接后发送的不是Port命令,而是Pasv命令。FTP服务器收到Pasv命令后,随机打开一个高端端口(端口号大于1024)并且通知客户端在这个端口上传送数据的请求,客户端连接FTP服务器此端口,然后FTP服务器将通过这个端口进行数据的传送,这个时候FTP server不再需要建立一个新的和客户端之间的连接。 2. FTP编程基础FTP协议使用两条单独的TCP连接,一条专用于发送FTP命令,另一条则专用于传递数据。初始建立连接时,服务器在21号端口上接收来自客户端的命令连接。当需要传送数据时(文件列表、文件数据等),客户端向服务器发出Port命令,并进入监听状态,等待来自服务器的数据连接请求。 要联接到FTP服务器,需要两个步骤,必须创建一个CInternetSession对象,用类CInterSession创建并初始化一个或几个同时存在的Internet会话(session),并描述与代理服务器的连接(如果有必要的话),如果在程序运行期间需要保持与Internet的连接,可以创建一个CInternetSession对象作为类CWinApp的成员。 MFC中的类CFtpConnection管理与Internet服务器的连接,并直接操作服务器上的目录和文件,FTP是MFC的WinInet支持的三个Internet功能之一,需要先创建一个CInternetSession实例和一个CFtpConnection对象就可以实现和一个FTP服务器的通信,不需要直接创建CFtpConnection对象,而是通过调用CInternetSession:GetFtpConnection来完成这项工作。它创建CFtpConnection对象并返回一个指向该对象的指针。 下面简要介绍FTP连接类的信息 (1)CInternetSession对象 CInternetSession(LPCTSTR pstrAgent,DWORD dwConText ,DWORD dwAccessType,LPCTSTR pstrProxyName,LPCTSTR pstrProxyBypass,DWORD dwFlags); 在创建CInternetSession对象时调用这个成员函数,CInternetSession是应用程序第一个要调用的Internet函数,它将创始化内部数据结构,以备将来在应用程序中调用。如果dwFlags包含INTERNET_FLAG_ASYNC,那末从这个句柄派生的所有的句柄,在状态回调例程注冊之前,都会出现异步状态。如果沒有打开Internet连接,CInternetSession就会抛出一个例外,AfxThorowInternetException。 (2)GetFtpConnection()函数 CFtpConnection* CIternetSession:GetFtpConnection(LPCTSTR pstrServer,LPCTSTR pstrUserName,LPCTSTR pstrPassword,INTERNET_PORT nPort,BOOL bPassive); 调用这个函数建立一个FTP连接,并获得一个指向CFtpConnection对象的指针,GetFtpConnection连接到一个FTP服务器,创建并返回指向CFtpConnection对象的指针,它不在服务器上进行任何操作。如果打算读写文件,必须进行分步操作。关于查找,打开和读写文件的信息需参考CFtpConnection和CFtpFileFind类。 对这个函数的调用返回一个指向CFtpConnection对象的指针。如果调用失败,检查抛出的CInternetException对象,就可以确定失败的原因。 (3)GetFile()函数 BOOL GetFile(LPCTSTR pstrRemoteFile,LPCTSTR pstrLocalFile,BOOL bFailExists ,DWORD dwAttributes,DWORD dwFlags,DWORD dwContext); 调用这个成员函数,可以从FTP服务器取得文件,并且把文件保存在本地机器上。GetFile()函数是一个比较高级的例程,它可以处理所有有关从FTP服务器读文件,及把文件存放在本地机器上的工作。如果dwFlags为FILE_TRANSFER_TYPE_ASCII,文件数据的传输也会把控制和格式符转化为Windows中的等阶符号。默认的传输模式是二进制模式,文件会以和服务器上相同的格式被下载。 pstrRemoteFile和 pstrLocalFile可以是相对于当前目录的部分文件名,也可以是全文件名,在这两个名字中间,都既可以用反斜杠()或者正斜杠(/)来作为文件名的目录分隔符,GetFile()在使用前会把目录分隔符转化为适当的字符。 可以用自己选择的值来取代dwContext默认的值,设置为上下文标识符与CFtpConnection对象的定位操作有关,这个操作由CFtpConnection中的CInternetSession对象创建。返回给CInternetSession:OnStatusCallBack的值指出了所标识操作的状态。 如果调用成功,函数的返回为非0,否则返回0,如果调用失败,可以调用Win32函数GetLastError(),确认出错的原因。 (4)PutFile()函数 BOOL PutFile(LPCTSTR pstrLocalFile, LPCTSTR pstrRemoveFile ,DWORD dwFlags, DWORD dwContext); 调用这个成员函数可以把文件保存到FTP服务器。PutFile()函数是一个比较高级的例程,它可以处理有关把文件存放到服务器上的工作。要严格控制文件传输的应用程序,应该调用OpenFile和 CInternet:Write。利用自己选择的值来取代dwContext默认的值,设置为上下文标识符,上下文标识符是CInternetSession对象创建的CFtpConnection对象的特定操作有关,这个值返回给CInternetSession:OnStateCallBack,从而把操作的状态通报给它所标识的上下文。 如果调用成功,函数的返回为非0,否则返回0,如果调用失败,可以调用Win32函数GetLastError(),确认出错的原因。 3 编程实现FTP程序登录FTP服务器列出服务器上的文件下载选中的文件实验五 网络文件传输1一实验目的:了解网络文件传输的方法,学习使用WinSock实现网络文件的传输。二实验任务:编程实现网络文件传输程序 三实验内容1 网络文件传输编程原理在通信的时候主要可以分为两个部分,一个部分是用于传送控制信息,例如发送文件的请求,文件的名称、大小等,采用MFC所提供的CSocket类的串行化技术来实现;而另一个部分就是文件的传输部分,对于文件的传输,由于数据量相对来说比较大,使用两个线程,一个用于发送,一个用于接收。这两个部分在具体实现的时候分别建立有自己的套接字。几个辅助类的介绍:(1)CMessage类 程序传送控制信息的时候采用的是CSocket类的串行化技术,这样一来使得发送和接收网络数据就像普通的数据串行化一样简单。因此封装一个可以串行化的消息类是必要的,后面将会看到有了这个类,消息的发送和接收只需使用流操作符对缓冲区进行存取就可以了。根据程序的需要,消息类CMessage的定义如下:class CMessage : public CObjectpublic:void Serialize(CArchive& ar);CMessage();CMessage(int nType);CMessage(int nType, CString strFileName, DWORD dwFileSize);virtual CMessage();public:int m_nType;CString m_strFileName;DWORD m_dwFileSize;其中,m_nType用于标识消息的类型;m_strFileName为文件的名称;m_dwFileSize为文件的大小。(2) CListenSocket类负责监听管理的套接字类CListenSocket。使用ClassView或ClassWizard进行创建。 使用ClassView或手工加入如下的函数及成员变量的定义:public:CListenSocket(CFileTransfersDlg* pdlgMain);protected:CFileTransfersDlg* m_pdlgMain; CListenSocket(CFileTransfersDlg* pdlgMain)为重载的构造函数;m_pdlgMain为指向主对话框类CFileTransfersDlg的指针。 (3) CClientSocket类 该类用于连接的管理,其创建的方法与CListenSocket相似,其定义如下:class CClientSocket : public CSocket/ Attributespublic:/ Operationspublic:CClientSocket();virtual CClientSocket();/ Overridespublic:CSocketFile* m_pFile;CArchive* m_pArchiveIn;CArchive* m_pArchiveOut;void Init();void Abort();BOOL SendMsg(CMessage* pMsg);void ReceiveMsg(CMessage* pMsg);CClientSocket(CFileTransfersDlg* pdlgMain);/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CClientSocket)public:virtual void OnReceive(int nErrorCode);/AFX_VIRTUAL/ Generated message map functions/AFX_MSG(CClientSocket)/ NOTE - the ClassWizard will add and remove member functions here./AFX_MSG/ Implementationprotected:CFileTransfersDlg* m_pdlgMain;在CClientSocket套接字类封装了串行化功能,这也就是说,该类封装了客户应用程序的大部分功能,因此可以认为该套接字类所管理的就是一个客户应用程序。其中,m_pFile为一个CSocketFile类型的指针用于连接到一个CSocket对象;m_pArchiveIn和m_pArchiveOut均为CArchive类型的指针,分别用于接受和发送。2 编程实现文件传输功能(1) 采用C/S模式实现文件的传输服务器端程序如图客户端程序如图服务器程序侦听客户端程序连接请求,建立连接成功服务器端选择需要发送的文件客户端接收文件实验六 网络文件传输2一实验目的:了解点对点(P2P)网络文件传输的方法,学习使用WinSock实现P2P网络文件的传输。二实验任务:编程实现点对点网络文件传输程序 三实验内容1 点对点(P2P)通信基础点对点即Peer-To-Peer,通常简写为P2P。所谓网络中的点对点,其实可以看成是一种对等的网络模型。P2P其实是实现网络上不同计算机之间,不经过中继设备直接交换数据或服务的一种技术。P2P由于允许网络中任一台计算机可以直接连接到网络中其他计算机,并与之进行数据交换,这样既消除了中间环节,也使得网络上的沟通变得更容易、更直接。 P2P作为一种网络的模型,它有别于传统的客户/服务器模型。客户/服务器模型一般都有预定义的客户机和服务器。而在P2P模型转并没有明确的客户端和服务器,但其实在P2P模型中,每一台计算机既可以看成是服务器,也可以看成是客户机。在网络中,传统上的客户机/服务器通讯模型中,发送服务请求或者发送数据的计算机,一般称为客户机;而接收、处理服务或接收数据的计算机称为服务器。而在P2P网络模型中,计算机不仅接收数据,还有发

温馨提示

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

评论

0/150

提交评论