




已阅读5页,还剩30页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
引言如今社会,科学技术不断发展,电子和通信技术达到了一个新的高度。随之而来的是教育水平的不断进步,教育模式也与前几年有了很大的不同,以教师为中心转变为以学生为中心,更倾向于网络化和多媒体化的方向发展。最新的教学模式认为,在整个教学过程中由教师起组织、指导和促进作用,学生是学习的主体,利用情境、协作、会话等学习环境要素充分发挥学生的积极性、主动性,最终完成对知识的意义建构。学生的学习不是被动的,而应是主动的,探索式的,协作式的学习。多媒体网络教学,打破了地域和时空的局限,实现了双向交互、实时多点交流、广泛的传播、快捷的数据信息收集等多种功能,并以网络通信技术、多媒体技术为依托。 因此,在多媒体网络教学中,学生们可以共享学习资源,共同探讨和交流问题,并且可以通过多种媒体(如声频,视频,图像,文字等)来使学生加强记忆和增进理解,以避免原先单调和机械的学习,提高学生的学习能动性,而且可以使学生跟计算机之间进行积极而频繁的信息交换,并能得到及时的反馈。可以说,网络多媒体的交互式教学改变了学生在教学过程中认识事物的过程,改变了传统的教学原则,改变了教学内容和教材形式。全球化是网络的必然趋势,也是多媒体网络教学发展的必然趋势。在互联网已连通世界各地、Internet站点遍布全球的当今时代,无论是校园网、多媒体教室局域网,还是单台多媒体计算机,不与广域网连接、不利用Internet上无限丰富的信息资源,是不可思议的。基于Internet的新型教学,突破了局域网多媒体教学在资源、距离、规模上的限制,将多媒体网络教学推向全球,“开放大学”、“虚拟学校”、“全球教室”等一批新型的教育教学系统迅速发展。1 本课题的研究特点、功能和实现环境1.1 课题研究特点本课题是为了转变传统的教学模式,对网络交互式教学进行支持而实现的。本课题所设计的软件是运行于Windows操作系统上,在局域网上使用多媒体技术进行交互式教学的计算机教学系统。它可以使用在电子教室、多媒体网络教室或者电脑教室中,集电脑教室的同步教学、控制、管理等功能于一体,并同时实现屏幕监视、教师演示、远程辅导、远程控制和文件传输等网络管理功能。本课题的特点主要有:(1)本课题系统对多媒体网络进行了实时通信和处理,基于TCP/IP网络模型,使用面向连接的TCP协议和无连接的UDP协议进行网络通信。对单机进行控制和要求数据可靠时,使用面向连接的TCP协议;对实时性要求较高,或者需要将数据同时传往多个接收者时,则使用无连接的UDP协议。(2)根据面向连接TCP协议的流传输的特性,为无边界的数据流建立边界,实现数据成块传输;而对于无连接的UDP协议的特性,将超过最大传输单元MTU的数据进行分片传输,并且对其无序性、丢包和错包提供处理。(3)为了保证实时性方面的要求,应尽量减少网络传输的数据量,尤其是屏幕图像数据。因此,必须把屏幕图像数据进行处理,划分网格并将其转换为高压缩比的JPEG格式,以最大限度的减少网络传输负载,满足实际的网络带宽的要求。(4)使用系统API函数和MFC类库相结合,对系统进行控制,实现鼠标和键盘处理功能,实现文件处理功能,并且可以对进程、系统重启、系统注销和系统关闭进行操作。1.2 系统功能本系统的主要功能模块有:(1)网络通信传输功能网络通信传输功能是整个系统的基础,主要负责教师机同其他学生机的数据传输处理。(2)学生机连接管理功能对学生机的连接情况进行管理,显示当前在线的学生机及其信息,并且当学生机关闭和掉线时进行处理。(3)图像处理功能对教师机和学生机的屏幕进行处理,并且能在BMP位图格式和JPEG格式之间进行转换,是“教师演示” 、“监视学生”和“远程帮助”的基础,是系统的核心功能。(4)鼠标、键盘处理功能此功能和图像处理功能合在一起,就可以使教师机对学生机进行远程操作,就好像是教师直接在学生机上操作一样,可以对学生机进行远程辅导。(5)文件处理功能教师可以把共享的文件群发到所有学生机的临时目录中,可以传输各种类型和任意大小的文件。(6)系统控制功能使用系统API函数,对系统进行控制,可以进行进程管理、信息查询、开关机和注销机器等操作。1.3 系统的实现环境考虑到用户的使用要求和系统的通用性和实时性,本课题的实现环境为:(1)用户(学生机和教师机):采用PC机,运行平台为Windows2000 或Windows XP操作系统(2)网络:10/100BASET以太网(3)开发环境:Visual C+6.0 2 系统理论设计2.1 网络通信传输技术2.1.1 传输控制协议TCP概述 TCP(Transmission Control Protocol)是TCP/IP协议族中的传输层协议,它实现了虚电路间的连接,是面向连接的协议。TCP通过序列确认以及包重发机制,提供可靠的数据流发送和到应用程序的虚拟连接服务,与IP协议相结合,TCP组成了因特网协议的核心。TCP对话通过三次握手来建立连接。三次握手的目的是使数据段的发送和接收同步;告诉其它主机其一次可接收的数据量,并建立虚连接。三次握手的简单过程如下:(1)初始化主机通过一个同步标志置位的数据段发出会话请求。(2)接收主机通过发回具有以下项目的数据段表示回复:同步标志置位、即将发送的数据段的起始字节的顺序号、应答并带有将收到的下一个数据段的字节顺序号。(3)请求主机再回送一个数据段,并带有确认顺序号和确认号。TCP提供了面向连接的服务,其特性有:数据流传输、可靠性、有效流控制、全双工操作和多路复用技术等。TCP使用数据流传输 ,可以交付一个由序列号定义的无结构的字节流。这个服务对应用程序有利,因为在送出到 TCP 之前应用程序不需要将数据划分成块, TCP 可以将字节整合成字段,然后传给IP进行发送。TCP通过面向连接的、端到端的可靠数据报发送来保证可靠性。 TCP 在数据包上加上一个递进的确认序列号来告诉接收者发送者期望收到的下一个数据包。如果在规定时间内,没有收到关于这个包的确认响应,重新发送此包。 TCP 的可靠机制允许设备处理丢失、延时、重复及读错的包。超时机制允许设备监测是否丢失数据包,丢失则会请求重发。TCP提供了有效流控制。当向发送者返回确认响应时,接收TCP进程就会说明它能接收并保证缓存不会发生溢出的最高序列号。TCP还具有全双工操作,即TCP进程能够同时发送和接收数据包。TCP中的多路技术,大量同时发生的上层会话可以在单个连接上进行多路复用。面向连接的服务(例如Telnet,FTP,rlogin,X Windows和SMTP)需要高度的可靠性,所以通常都使用TCP。在本课题中,“群发文件”功能需要很高的可靠性,因为在传输过程中只要有一个数据帧错误或者是丢失,则整个文件就会被破坏,因此,“群发文件”功能应该使用TCP来进行传输。此外,在教师机对一个学生机进行操作时,也使用TCP来传输数据,以尽可能的保证数据的正确传输。2.1.2 用户数据报协议UDP概述UDP(User Datagram Protocol)是 ISO 参考模型中一种无连接的传输层协议,提供面向事务的不可靠信息传送的服务。UDP协议基本上是IP协议与上层协议的接口。 与TCP不同,UDP并不提供对IP协议的可靠机制、流控制以及错误恢复功能,也不需要事先建立连接。由于UDP比较简单,UDP头包含很少的字节,比TCP协议负载消耗少,效率也比较高。因此,虽然UDP的可靠性不高,但是由于它传输数据的高效率,使得它在实际的网络应用中被广泛采用。广播数据即数据从一个工作站发出,局域网内的其他所有工作站都能收到它。这一特征适用于无连接协议,因为L A N上的所有机器都可获得并处理广播消息。使用广播消息的不利之处是每台机器都必须对该消息进行处理。比如,一位用户在LAN上广播一条消息,每台机器上的网卡都会收到这条消息,并把它上传到网络堆栈。然后,堆栈将这条消息在所有的网络应用中循环,看它们是否应该接收这条消息。通常,这个局域网上的多数机器对该消息都不感兴趣,并将它丢弃。但是,各台机器仍需花时间来处理这个数据包,看是否有应用对它感兴趣。如果广播通信过于频繁,那么会使LAN上的机器陷入困境,因为每个工作站都要检查这个数据包,这就叫做广播风暴。因此,需要将报文同时传往多个接收者时,那么必须使用广播或者多播。广播和多播都是由UDP协议来实现的。多播(multicast)处于单播和广播之间:即数据帧仅仅传送给属于多播组的多个主机。55是受限的广播地址,可以使用它来进行本网络的广播通信。在任何情况下,路由器都不转发目的地址为受限的广播地址的数据报,这样的数据报仅出现在本地网络中。而主机号为全1的地址是指向网络的广播地址,一个路由器必须转发指向网络的广播,但它也必须有一个不进行转发的选择。UDP适用于不需要TCP可靠机制的情形,比如当高层协议或应用程序提供错误和流控制功能的时候。UDP是传输层协议,服务于很多知名应用层协议,包括网络文件系统(NFS)、简单网络管理协议(SNMP)、域名系统(DNS)以及简单文件传输系统(TFTP)等。在本课题中,“教师演示”功能必须使用广播来进行群发。如果使用TCP协议,则不能同时向所有的主机进行连接通信,而是需要循环连接所有的主机,这样会极大地降低网络传输的效率。如果学生机数量太多,则实时性就不能得到满足,教师机的网络负载也会达到极限。因此,使用UDP广播是非常好的选择,并且不会在路由器上转发广播,缩小了广播的影响范围。2.1.3 Windows 网络编程技术本课题是基于Windows操作系统开发的,网络通信传输模块主要使用了由微软MFC类库中的CSocket类。它继承于CAsyncsocket类,是对Windows Sockets API的高层抽象。它通常和CSocketFile及CArchive类混合使用,这个类主要负责数据的发送和接收。CSocket提供了阻塞式的访问方式,这对于CArchive的同步操作是必须的。该类的成员是阻塞函数,例如Receive()、Send()、ReceiveFrom()、SendTo()和Accept()函数,不会像Winsock中的函数一样返回WSAEWOULDBLOCK的错误。取而代之的是,这些函数会自己等待直到操作的完成。如果这些阻塞函数正在等待时,应用程序调用了CancleBlockingCall()函数,那么这些函数将会完成等待并返回一个WSAEINTR的错误。CSocket类是CAsyncSocket类的子类。因此,要使用CSocket类,必须要调用AfxSocketInit()函数初始化Socket。CSocket类中,其成员变量m_hSocket保存其对应的socket句柄,该类的主要函数有:(1)Create()函数:创建一个Windows Socket句柄并把它关联到对象上。该函数的完整格式为:BOOL Create(UINT nSocketPort = 0, int nSocketType = SOCK_STREAM, LPCTSTR lpszSocketAddress = NULL)。 其中参数nSocketPort是要分配的端口号,如果它为0则系统自动分配一个端口给该套接字。参数nSocketType指明了该套接字的类型,使用SOCK_STREAM参数则建立流套接字,使用SOCK_DGRAM则会建立数据报套接字,默认时是使用流式套接字。参数lpszSocketAddress则指明了套接字的网络地址。如果函数成功执行,返回值为TEUE,否则返回值为FALSE。(2)Accept()函数:接收对方发送的连接请求。该函数的完整格式为:virtual BOOL Accept(CAsyncSocket& rConnectedSocket,SOCKADDR* lpSockAddr = NULL, int* lpSockAddrLen = NULL)。其中参数rConnectedSocket为连接有效的新的套接字的指针。参数lpSockAddr指明了接收连接套接字的地址。参数lpSockAddrLen说明了指向lpSockAddr地址的长度字节的指针。如果函数成功执行,返回值为TEUE,否则返回值为FALSE。使用该函数并成功返回时,会建立一个新的套接字,该套接字用于网络数据的传输。(3)Bind()函数:把本地地址关联到Socket上。函数的完整格式为:BOOL Bind (UINT nSocketPort, LPCTSTR lpszSocketAddress = NULL)。参数nSocketPort指明要绑定的套接字端口。参数lpszSocketAddress指明了套接字的地址。如果函数成功执行,返回值TRUE,否则返回值为FALSE。(4)Close()函数:关闭当前Socket,释放套接字描述符。(5)Connect()函数:与对方Socket进行连接。该函数的完整格式为:BOOL Connect(LPCTSTR lpszHostAddress, UINT nHostPort)。 参数lpszHostAddress指明了对方主机的地址。参数nHostPort指明了对方主机的Socket端口号。如果函数成功执行,返回值为TRUE,否则返回值为FALSE。(6)Listen()函数:监听到来的连接请求。该函数的完整格式为:BOOL Listen (int nConnectionBacklog=5)。 参数nConnectionBacklog为等待处理连接的队列所允许达到的最大长度。如果函数成功执行,返回值为TRUE,否则返回值为FLASE。(7)Receive()函数:从Socket中接收数据。该函数的完整格式为:virtual int Receive(void* lpBuf, int nBufLen, int nFlags = 0)。其中参数lpBuf为接收数据的缓冲。参数nBufLen为该缓冲的大小(字节数)。参数nFlags可以设置调用的模式。如果函数成功执行,返回值为接收到的字节数,如果连接已经关闭,则返回值为零。否则返回SOCKET_ERROR。(8)ReceiveFrom()函数:接收一个数据报并且存储源地址。该函数的完整格式为:int ReceiveFrom(void* lpBuf, int nBufLen,CString& rSocketAddress, UINT& rSocketPort, int nFlags = 0)。 其中参数lpBuf为接收数据的缓冲。参数nBufLen为该缓冲的大小(字节数)。参数rSocketAddress为发送方的主机地址。参数rSocketPort为发送方的套接字端口。参数nFlags可以设置调用的模式。如果函数成功执行,返回值为接收到的字节数,否则返回SOCKET_ERROR。(9)Send()函数:发送数据到已连接的套接字接口。函数的完整格式为:virtual int Send(const void* lpBuf, int nBufLen, int nFlags = 0)。参数lpBuf为发送数据的缓冲。参数nBufLen为该缓冲的大小(字节数)。参数nFlags可以设置调用的模式。如果函数成功执行,返回值为发送的字节数,如果连接已经关闭,则返回值为零。否则返回SOCKET_ERROR。(10)SendTo()函数:发送数据报到具体的目标地址。该函数的完整格式为:int SendTo(const void* lpBuf, int nBufLen,UINT nHostPort, LPCTSTR lpszHostAddress = NULL, int nFlags = 0)。 参数lpBuf为发送数据的缓冲。参数nBufLen为该缓冲的大小(字节数)。参数rSocketAddress为接收方的主机地址。参数rSocketPort为接收方的套接字端口。参数nFlags可以设置调用的模式。如果函数成功执行,返回值为发送的字节数,否则返回SOCKET_ERROR。在使用该函数时,如果发送的是广播数据,那么参数rSocketAddress必须要正确设置。当要向广播地址55发送数据时,参数rSocketAddress可以为NULL,也可以为“55” 。当要向广播地址.255(即是指向某网络的广播地址)发送数据时,rSocketAddress应该为“.255” 。(11)SetSockOpt()函数:设置当前Socket套接字的选项。选项会影响套接字的操作,例如是否允许在套接字中发送广播,是否允许在普通数据流中接收快速传输的数据等。该函数的完整格式为:BOOL SetSockOpt(int nOptionName, const void * lpOptionValue,int nOptionLen, int nLevel = SOL_SOCKET)。参数nOptionName说明要设置的套接字选项。参数lpOptionValue说明要设置的值的缓冲地址。参数nOptionLen说明lpOptionValue缓冲的字节数。参数nLevel说明选项定义所在的级别。可重载的消息响应函数主要有:(1)OnAccept()函数:通知监听的Socket,接收连接请求。在接收到连接请求时,系统发送消息,该函数响应消息并处理连接请求。可以重载该函数,在该函数中调用Accept()函数来接收连接请求并且生成新的套接字。(2)OnClose()函数:通知Socket,和它相连的Socket已经关闭(3)OnReceive函数:通知Socket有数据到达。当有数据到达时,系统发送消息,该函数响应消息并对数据进行接收和处理。可以重载该函数,在该函数中调用ReceiveFrom()函数来接收一个UDP数据报,或者调用Receive()函数来接收一个TCP数据包。(4)OnSend函数:通知Socket可以调用Send发送数据。此函数在发送数据时响应系统消息而被调用。2.2 图像处理技术2.2.1 BMP位图格式本课题中对屏幕的截取是使用BitBlt()函数,截取后的数据是设备相关位图DDB,要将图像数据发送到另一台机器上显示,则必须将设备相关位图DDB转换为设备无关位图DIB,以使图像在任何类型的显示设备上显示。并且,在本课题中对BMP位图的处理是系统的核心内容,对BMP位图格式的深入理解是完成本系统的关键。BMP(Bitmap-File)图像文件是Windows采用的图像文件格式,在Windows环境下运行的所有图像处理软件都支持BMP文件格式。Windows系统内部各图像绘制操作都是以BMP为基础的。Windows 3.0以前的BMP文件格式与显示设备有关,因此把这种BMP图像文件格式称为设备相关位图DDB(device-dependent bitmap)文件格式。Windows 3.0以后的BMP图像文件与显示设备无关,因此把这种BMP图像文件格式称为设备无关位图DIB(device-independent bitmap)格式,目的是为了让Windows能够在任何类型的显示设备上显示所存储的图像。BMP位图文件默认的文件扩展名是BMP或者bmp(有时它也会以.DIB或.RLE作扩展名)。位图文件可看成由4个部分组成:位图文件头(bitmap-file header)、位图信息头(bitmap-information header)、彩色表(color table)和定义位图的字节阵列。BMP文件头数据结构含有BMP文件的类型、文件大小和位图起始位置等信息。文件格式如图 2.1所示:位图文件的组成 结构名称 符号 位图文件头(bitmap-file header)BITMAPFILEHEADERbmfh位图信息头(bitmap-information header)BITMAPINFOHEADERbmih彩色表(color table)RGBQUADaColors图象数据阵列字节BYTEaBitmapBits图 2.1(1)BMP文件头结构其结构定义如下:typedef struct tagBITMAPFILEHEADERWORDbfType; / 位图文件的类型,必须为BMDWORD bfSize; / 位图文件的大小,以字节为单位 WORDbfReserved1; / 位图文件保留字,必须为0WORDbfReserved2; / 位图文件保留字,必须为0DWORD bfOffBits; / 位图数据的起始位置,以相对于位图/ 文件头的偏移量表示,以字节为单位 BITMAPFILEHEADER;(2)位图信息头BMP位图信息头主要用于说明位图的尺寸等信息。typedef struct tagBITMAPINFOHEADERDWORD biSize; / 本结构所占用字节数LONGbiWidth; / 位图的宽度,以像素为单位LONGbiHeight; / 位图的高度,以像素为单位WORD biPlanes; / 目标设备的级别,必须为1WORD biBitCount/ 每个像素所需的位数,必须是1(双色),/ 4(16色),8(256色)或24(真彩色)之一DWORD biCompression; / 位图压缩类型,必须是 0(不压缩), 1(BI_RLE8/压缩类型)或2(BI_RLE4压缩类型)之一DWORD biSizeImage; / 位图的大小,以字节为单位LONGbiXPelsPerMeter; / 位图水平分辨率,每米像素数LONGbiYPelsPerMeter; / 位图垂直分辨率,每米像素数DWORD biClrUsed;/ 位图实际使用的颜色表中的颜色数DWORD biClrImportant;/ 位图显示过程中重要的颜色数 BITMAPINFOHEADER;(3)颜色表颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个RGBQUAD类型的结构,定义一种颜色。RGBQUAD结构的定义如下:typedef struct tagRGBQUADBYTErgbBlue;/ 蓝色的亮度(值范围为0-255)BYTErgbGreen; / 绿色的亮度(值范围为0-255)BYTErgbRed; / 红色的亮度(值范围为0-255)BYTErgbReserved;/ 保留,必须为0 RGBQUAD;颜色表中RGBQUAD结构数据的个数有biBitCount来确定:当biBitCount=1,4,8时,分别有2,16,256个表项;当biBitCount=24时,没有颜色表项。位图信息头和颜色表组成位图信息,BITMAPINFO结构定义如下:typedef struct tagBITMAPINFOBITMAPINFOHEADER bmiHeader; / 位图信息头RGBQUAD bmiColors1; / 颜色表 BITMAPINFO;(4)位图数据位图数据记录了位图的每一个像素值,记录顺序是在扫描行内是从左到右,扫描行之间是从下到上。位图的一个像素所占的字节数:当biBitCount=1时,8个像素占1个字节;当biBitCount=4时,2个像素占1个字节;当biBitCount=8时,1个像素占1个字节;当biBitCount=24时,1个像素占3个字节;Windows规定一个扫描行所占的字节数必须是4的倍数(即以long为单位),不足的以0填充,2.2.2 JPEG格式截取一副完整的屏幕图像(1024768象素,24位真彩色),总共需要10247683102410242.25MB,如果每一秒传送5副图片则需11.25MB。这样大的数据量,网络是很难承受的。因此,压缩BMP位图是非常有必要的。在本系统中,将BMP位图转换为JPEG格式,可以极大地减少网络传输的数据量,其压缩比可以达到20:1甚至更高。JPEG是Joint Photographic Experts Group(图像专家联合小组)的首字母缩写,是连续色调静止图像压缩的标准。JPEG的主要作用是用于数字化图像的标准编码技术。它采用混合编码方法,定义了两种基本压缩算法:一种是基于空间预测技术,即差分脉冲编码调制的无失真压缩算法,另一种是基于DCT的有损压缩算法,可以支持很高的图像分辨率和量化精度。它的编码主要由颜色转换、DCT变换、进行量化、编码这几个步骤组成,而解码是其逆向过程。2.3 鼠标键盘处理技术鼠标和键盘处理技术是本系统中“远程帮助”功能的基础。教师机接收学生机发送过来的图像,然后使用鼠标和键盘远程操作学生机,就像教师在学生机上亲自操作一样。使用“远程帮助” ,教师机可以随意的操作学生机,那么就需要教师机向学生机发送鼠标键盘的模拟消息,而学生机收到消息后交由操作系统执行。在本系统中,主要使用系统API函数来进行鼠标和键盘的模拟消息的发送。鼠标消息是我们常需要处理的消息,消息分为:鼠标移动(WM_MOUSEMOVE) 、鼠标左键按下(WM_LBUTTONDOWN)、鼠标左键弹起(WM_LBUTTONUP)、鼠标左键双击(WM_LBUTTONDBCLICK)、鼠标右键按下(WM_RBUTTONDOWN)、鼠标右键弹起( WM_RBUTTONUP)、鼠标右键双击(WM_RBUTTONDBCLICK)。这组消息是与鼠标输入相关的,WM_MOUSEMOVE消息发生在鼠标移动的时候,剩余的六个消息则分别对应于鼠标左右键的按下、释放和双击事件。键盘消息有WM_CHAR,WM_KEYDOWN,WM_KEYUP三种。这三个消息用来处理用户的键盘数据,当用户在键盘上按下某个键的时候,会产生WM_KEYDOWN消息,释放按键的时候又会产生WM_KEYUP消息,所以WM_KEYDOWN与WM_KEYUP消息一般总是成对出现的。而WM_CHAR消息是在用户的键盘输入能产生有效的ASCII码时才会发生。在前两个消息中,伴随消息传递的是按键的虚拟键码,所以这两个消息可以处理非打印字符,如方向键,功能键等。而伴随WM_CHAR消息的参数是所按的键的ASCII码,ASCII码是可以区分字母的大小写的。而虚拟键码是不能区分大小写的。当鼠标、键盘事件被触发后,相应的鼠标或键盘驱动程序就会把这些事件转换成相应的消息,然后输送到系统消息队列,由Windows系统负责把消息加入到相应线程的消息队列中,于是就有了消息循环。在消息队列中插入键盘事件,主要使用keybd_event()函数,该函数合成一个键盘事件,系统可以用合成的事件来产生一个WM_KEYUP或WM_KEYDOWN消息。而插入鼠标事件,则使用mouse_event()函数,该函数合成鼠标的移动和点击事件,并将其插入到队列中。2.4 文件处理技术在本系统中,文件处理是使用微软MFC类库中的CFile类和CFileFind类来实现的,它是“群发文件”功能的基础。CFile类是由CObject类直接派生得到的,它直接提供非缓冲的二进制磁盘输入输出服务,并且间接地通过派生类来支持文本文件和内存文件。CFile类和CArchive类共同使用,可以支持MFC对象的串行化。它的成员变量m_hFile包含了文件的句柄。它的主要成员函数有:(1)Open()函数:带有错误检验选项,可以安全的打开一个文件。该函数的完整格式为:virtual BOOL Open (LPCTSTR lpszFileName , UINT nOpenFlags , CFileException* pError = NULL)。参数lpszFileName说明要打开文件的路径。参数nOpenFlags说明文件共享和访问的模式,可以用OR(|)操作符进行多值连接。模式的主要参数有以下几种,CFile:modeReadWrite说明打开文件供读写,CFile:modeRead说明打开文件仅供读,CFile:modeWrite说明打开文件仅供写,modeCreate说明创建一个新文件(如果文件已存在,则长度为0)。参数pError指向一个文件异常类的对象,以获取失败操作的状态。函数成功执行时,返回值为TRUE,否则为FALSE。(2)Close()函数:关闭文件,删除对象。其该函数的完整格式为:virtual void Close()。(3)Read()函数:从文件的当前位置读数据。该函数的完整格式为:virtual UINT Read(void* lpBuf, UINT nCount)。参数lpBuf指向用户提供的缓冲区,以接收从文件中读取的数据。参数nCount说明可以从文件中读取数据的最大字节数。函数成功执行时,返回值为实际读取到的数据的字节数。(4)Seek()函数:当前的文件指针重新定位。该函数的完整格式为:virtual LONG Seek(LONG lOff, UINT nFrom)。参数lOff说明指针移动的字节数。参数nFrom说明指针移动的模式,其值有:CFile:begin 指示移动是从文件的起始位置开始的,此时指针必须向后移动;CFile:current指示移动是从文件的当前位置开始的,指针可以向前或者向后移动;CFile:end指示移动是从文件的结尾位置开始的,此时指针必须向前移动。(5)SeekToBegin()函数:定位文件指针到文件开头。(6)Write()函数:从文件的当前位置写数据。该函数的完整格式为:virtual void Write(const void* lpBuf, UINT nCount)。参数lpBuf指向用户提供的缓冲区,缓冲区内包含将要写入的数据。参数nCount说明写入数据的长度。CFileFind类可以执行本地文件查找,有开始查找、定位文件、返回文件路径、判断文件属性、判断文件是否是目录等功能。2.5 其他系统处理技术对系统进行底层操作,例如查看当前进程、杀死进程、开机、关机、注销机器、锁定鼠标键盘、查看系统信息等,大都由系统API函数来实现。本课题对时间的要求比较严格:学生机每隔2秒向教师机发送一次连接命令;教师机每隔5秒检查一次学生链表,得到当前的在线学生信息,并且将掉线或者关机的链表结点予以删除;进行实时的屏幕传输时,本系统定义了每隔100ms截取和传送一次屏幕图像。对于这些操作,必须使用计时器来对系统进行定时响应,处理相应的操作。本系统使用了定时器函数来进行定时,主要的函数有: (1)SetTimer()函数:创建一个系统定时器事件,当定时器事件发生时,系统向应用程序发送WM_TIMER消息。该函数的完整格式是:UINT SetTimer(UINT nIDEvent, UINT nElapse, void (CALLBACK* lpfnTimer)(HWND, UINT, UINT, DWORD)。参数nIDEvent说明了定时器的事件标识符。参数nElapse指示了定时器事件之间的时间间隔(以ms计算)。参数lpfnTimer指示定时器事件发生后接收消息的函数指针。若该参数为NULL,则将WM_TIMER放入应用程序的消息队列中。(2)OnTimer()函数:在本系统中,重载了该函数来响应定时器事件发生时产生的WM_TIMER消息。该函数的完整格式是:void OnTimer (UINT nIDEvent)。其中参数nIDEvent为定时器的事件标识符,在多个定时器共同作用时,该参数指示了发生消息的是哪一个定时器。(3)KillTimer()函数:撤销定时器事件。该函数的完整格式是:BOOL KillTimer (int nIDEvent)。参数nIDEvent为要撤销的定时器的事件标识符3 系统功能设计实现当教师机和学生机进行交互式通信时,必须使用双方都能解释的命令或者指令进行发送。因此,本系统对每一个要发送的数据,无论是TCP还是UDP,都必须在数据的首部附加网络传输数据结构DATANET,以使接收端可以正确解释该数据包。其数据结构如下:struct DATANET/定义网络传输的数据结构DWORD cmdNet;/命令DWORD para;/数据参数DWORD lengData;/数据长度(包括此结构);该网络传输结构是系统命令和网络传输的核心,结构中的cmdNet变量是命令参数,它指示了接收端所要执行的操作;para变量是数据参数,它指示了该数据包的参数;lengData变量是该数据包的数据长度,这个变量可以确定数据包的边界,从合在一起的数据包中划分出单独的数据包。3.1 网络传输功能设计实现本系统的网络传输功能主要由CSocket类实现,并且根据传输的数据不同,使用不同的Socket类型,有面向连接的TCP和无连接的UDP两种。在选择端口时,应该特别小心,因为有些可用端口号是为“已知的”(即固定的)服务保留的(比如说文件传输协议和超文本传输协议,即FTP和HTTP)。“已知的协议”即固定协议,采用的端口由“互联网编号分配认证(IANA)”控制和分配。从本质上说,端口号有以下三类:“已知”端口、已注册端口、动态和私用端口。(1)01023端口:由IANA控制,是为固定服务保留的。(2)102449151端口:是IANA列出来的、已注册的端口,供用户进程或程序使用。(3)4915265535端口:是动态和私用端口。普通用户应用应该选择102449151之间的已注册端口,从而避免端口号已被另一个应用或系统服务所用。此外, 4915265535之间的端口可自由使用,因为IANA这些端口上没有注册服务。在本系统中,UDP协议使用5055作为数据端口,仅仅供教师机的广播图像使用。UDP协议同时还使用5056端口作为命令端口,可以供教师机广播命令和学生机发送连接命令。TCP协议使用5050端口,所有学生机使用5050端口进行监听,仅仅当教师机需要进行TCP连接时,才向学生机发送请求和建立连接。3.1.1 UDP广播设计实现在本系统中,“教师演示”功能同时向所有在线的学生机发送图像信息,教师机向所有学生机发送命令(除了“群发文件”外),学生机每2秒广播其在线信息,都使用UDP广播来发送数据。因此, UDP广播的实现如下所示:(1)建立UDP广播socketm_pUdpSocket=new CStudNetSocket(this);/创建socket对象,CStudNetSocket/类由CSocket类中派生m_pUdpSocket-Create(m_nUdpPort,SOCK_DGRAM);/创建socket句柄,并且确/定其类型为UDPm_pUdpSocket-Bind(m_nUdpPort); /绑定UDP端口BOOL optval=TRUE; :setsockopt(m_pUdpSocket-m_hSocket,SOL_SOCKET,SO_BROADCAST,(char *)&optval,sizeof(optval); /设置套接字选项为广播执行这段代码后,UDP广播端口就建立成功了。系统可以通过m_nUdpPort端口向对方发送数据。(2)接收UDP广播当接收广播数据时,也可以使用CStudNetSocket派生类对象从m_nUdpPort端口接收广播数据。重载OnReceive()虚函数,当一个数据报(广播数据报或者非广播数据报)到达时,系统会调用消息响应函数OnReceive(),在该函数里使用ReceiveFrom()函数来接收数据。 (3)发送UDP广播当发送数据时,可以使用CStudNetSocket派生类对象从m_nUdpPort端口发送UDP广播数据,即调用CSocket:SendTo()函数发送。 参考文献 1 叶子,进实现J计算机工程与科学,2009,1(07):61-64. 2 基于MATLAB 实现的指纹图像预处理J2008,34(04):836-856. 3 /xinshijiyulecheng/ 4 http:/2014/dafatiyu/ 5 By-gnksguybb 6 李 宁指纹增强算法研究D济南:山东大学,2007. 7 马扬彪基于Gabor 滤波的指纹图像增强J. 微计算机信息,2009,25(15):305-306. 8 向 锐面向低质量指纹的图像增强算法研究D重庆:西南政法大学,2008.在使用UDP发送接收数据时,必须深入理解UDP协议的特性,即无连接、接收无序、有丢包和错包。UDP没有可靠机制和错误恢复功能,并且发送超过一定大小的数据会发送失败。因此,不能在要求高可靠性的场合使用UDP,例如发送文件。在进行“教师演示” 、“远程帮助”等功能时,需要对整个屏幕图像进行处理。由于图像数据的过于巨大,一副完整屏幕图像的大小远远超过了网络能够支持的UDP数据报的最大长度。所以,超过一定大小的数据必须进行分片,将一个大的数据报分解为若干个小的数据报进行传输,每一个分片的大小必须小于网络的最大传输单元MTU。在到达接收端后,再将这些数据报重新组合成一个完整的大的数据报。对于传输层,理论上UDP数据报中用户数据的最长长度为65507字节。但是大多数实现所使用的长度要小于这个值,应用程序可能会受到其程序接口的限制。大部分系统默认的UDP数据报长度为8192字节。为了解决大的UDP数据报传输问题,本系统设计了UDP分片的数据结构,并且实现了UDP数据的分片和重组。对于每一个UDP数据报,无论它是否要分片,都必须在数据的前面加入分片数据结构,并且把该数据报的详细信息写入分片结构,以确保接收端可以根据信息重组分片。该分片数据结构为:#define LEN_PRE_PART 1000/每个分片的最大数据长度struct PARTBAND/分片定义BOOL isPart;/是否分片,0:只有一个分片 1:大于一个分片DWORD magicSign;/分片标记,说明一系列的分片属于一个数据包DWORD partNum;/分片数目DWORD PartValue;/分片计数值(1-partNum)DWORD partLen;/该分片数据长度DWORD dataLen;/完整数据包的总长度DWORD partTime; /该分片发送时间;此结构中,isPart指示该数据报是否大于分片的最大数据长度,大于的置1,说明有多个分片;小于的置0,说明只有一个分片,此时,该数据结构的其他变量可以置空。magicSign指示接收端接收的多个分片是否是同一个数据报。PartNum指示该数据报的分片数目,以便接收端重新组合数据并且判断数据是否接收完整。PartValue指示该分片在数据报中的位置,无序接收时可以进行数据的填充。partLen指示该分片的长度,如果是最后一个分片,则长度要小于等于分片的最大数据长度,否则该长度等于分片的最大数据长度。dataLen指示了该数据报的总长度。partTime指示了该分片的发送时间,同一个数据报的所有分片的发送时间是一致的,这可以判断数据报发送的顺序,若上一个数据报发生丢包,则当新的数据报到达时,所有的接收缓存被清除,以缓存新的数据报。3.1.2 TCP设计实现面向连接的TCP协议,提供可靠的数据流发送和到应用程序的虚拟连接服务。因此,在进行文件传输和单机控制时,使用TCP连接是必需的。TCP的实现如下所示:(1)学生机建立TCP监听端口m_pSocket=new CStudNetSocket(this);/创建socket,CStudNetSocket类由/CSocket类派生if(m_pSocket-Create(m_nTcpPort)/创建socket句柄并确定其类型为TCPif(!m_pSocket-Listen(5) /监听连接请求delete m_pSocket;else delete m_pSocket;执行完代码后,学生机会在m_nTcpPort端口上监听连接请求,以等待教师机的连接。(2)教师机建立TCP连接m_pSocket=new m_pListenSocket(this);/创建socket对象,m_pListenSocket/类由CSocket类派生if(!(m_pListenSocket-Create()/创建socket句柄,并且确定其类型为TCPdelete m_pListenSocket;return;if(!m_pListenSocket-Connect(lpAddr,m_nTcpPort) /与服务器连接delete m_pListenSocket;return;执行这段代码,教师机会在m_nTcpPort端口上建立与学生机的连接,进行三次握手的初始化。此后,教师机和学生机之间就可以通过此套接字进行通信了。(3)学生机建立TCP连接学生机建立TCP监听端口后,如果有连接请求则会调用可重载的消息响应函数OnAccept()函数。在OnAccept()函数中,可以调用Accept()函数来接收连接请求,此函数会创建一个新的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 美术项链艺术创作全解析
- 河北省鹿泉市2025年上半年公开招聘村务工作者试题含答案分析
- 河北省临西县2025年上半年事业单位公开遴选试题含答案分析
- 2025年二手房装修工程设计与施工监理、验收合同范本
- 2025年建筑项目竣工测绘服务合同
- 2025年度轻钢龙骨砌筑工程劳务承包合同
- 2025年荒山荒滩治理承包地租赁合同汇编
- 2025年充电桩安装与充电站安全保障体系合同范本
- 2025版汽车维修贷款授权委托合同
- 2025东航大客户航空保险定制服务合同
- 《新能源材料概论》 课件 第2章 热电转换新能源材料
- 矿产品买卖合同
- DB37-T 4382-2021 环保稳定型胶粉改性沥青及混合料施工技术规程
- 《当代中日关系》课件
- 大学生军事技能训练(同济大学)学习通测试及答案
- T-CSPSTC 72-2021 隧道衬砌脱空注浆治理技术规程
- 碳中和技术概论 课件 第1-3章 碳中和概述、太阳能、风能
- 2024年7月生化室内质控总结报告
- 危重症患者的血糖管理课件
- GB/T 19342-2024手动牙刷一般要求和检测方法
- 选择性必修第一册人教A版2024-2025学年上学期期中高二数学模拟测试卷含答案
评论
0/150
提交评论