沈阳理工大学学士学位论文
2.4 Windows Sockets简介
Windows Sockets是Windows下得到广泛应用的、开放的、支持多种协议的网络编程接口[10]。
应用程序1应用程序2网络编程界面,例如Windows Sockets网络通讯协议服务界面,例如TCP/IP操作系统,例如Windows物理通讯介质
图2.3 Windows Sockets实现通讯工作的各层关系图
Windows Sockets规范定义并记录了如何使用API与Internet协议族(IPS,通常我们指的是TCP/IP)连接,尤其要指出的是所有的Windows Sockets实现都支持流套接口和数据报套接口,应用程序调用Windows Sockets的API实现相互之间的通信。Windows Sockets又利用下层的网络通信协议功能和操作系统调用实现实际的通信工作。Socket控件可以供Microsoft Acess、Visual Basic,Visual C++或Visual Foxpro的开发人员使用。Socket控件可以使用两种协议:TCP协议和UDP协议。Windows sockets无疑是我们进行网络编程的利器。所有的Windows Sockets实现都支持流套接口和数据报套接口。应用程序调用Windows Sockets的API实现相互之间的通信。Windows Sockets又利用下层的网络通讯协议功能和操作系统调用实现实际的通信工作。它们之间的关系如图2.3所示。
7
沈阳理工大学学士学位论文
2.5 MFC Windows Socket类
VC++在Windows下进行WinSock编程时,MFC对原来的Windows Sockets API库函数进行了一系列封装,继而产生了CAsyncSocket类和CSocke类,它们封装了有关Socket的各种功能[11]。 2.5.1 CAsyncSocket异步类
MFC提供了一个异步类CAsyncSockct,它封装了异步、非阻塞Socket的基本功能,用它做常用的网络通信软件很方便。它屏蔽了Socket的异步、非阻塞等概念,开发人员无需了解异步、非阻塞Socket的原理和工作机制。
CAsyncSocket类的编程模型:
(1)调用类的构造函数创建CAsyncSocket对象。 (2)调用Create()函数创建Socket句柄。
(3)如果欲创建的套接字是客户端的,则调用函数Connect()向服务器套接字发送连接请求。如果是服务器端套接字,则调用函数Listen()开始侦听客户的连接请求;当收到连接请求后,调用函数Accept()接收该请求。
(4)调用Send()等功能函数进行数据传输与处理。 (5)关闭或销毁套接字对象。 2.5.2 CSocket类
CSocket类派生于CAsyncSocket类。该类不但具有CAsyncSocket类的基本功能,还具有串行化功能。用户在实际编程中,通过将CSocket类与CSocketFile类和CArchive类一起使用,能够很好地管理数据以及发送数据[12]。
CSocket类编程模型:
(1)分别构造服务器和客户套接字对象。
(2)调用对象的Create()函数创建套接字,而Create()函数会调用Bind()函数将此套接字绑定到指定的地址。
(3)套接字创建完毕后,服务器调用Listen()成员函数开始侦听客户的连接请求,而客户可以调用Connect()成员函数向服务器请求连接。
(4)当服务器监听到客户连接请求时,创建一个新的套接字,并将其传送给Accept()成员函数以收到客户的连接请求,函数执行失败会返回特定的错误码。
(5)为服务器和客户的套接字对象分别创建与之相联系的CSocketFile类对象。
8
沈阳理工大学学士学位论文
(6)为服务器和客户的套接字对象分别创建一个与CSocketFile类相联系的CArchive类对象以进行数据的发送和接收。
(7)使用CArchive类对象在客户端和服务器之间进行数据传输。
(8)在任务执行完成后,关闭或销毁CSocket类、CSocketFile类和CArchive类的3个对象。
2.6 MFC多线程编程技术
MFC类库是一个很大的、扩展了的C++类层次结构,与传统上使用C语言直接访问Windows API相反,MFC已经包含和压缩了所有标准的“样板文件”代码,这些代码是所有用C编写的 Windows 程序所必需的,因此用MFC编写的程序要比用C语言编写的程序小得多,当然MFC所编写的程序的性能也毫无损失[13]。必要时,也可以MFC可以用面向对象的方法来调用Windows API,因为MFC不修改也不隐藏Windows程序的基本结构。MFC是很庞大的。
Win32 SDK函数支持进行多线程的程序设计,并提供了操作系统原理中的各种同步、互斥和临界区等操作。Visual C++ 6.0中,使用MFC类库也实现了多线程的程序设计,使得多线程编程更加方便[14]。
CWinThread对象代表在一个应用程序内运行的线程。运行的主线程通常由CWinApp的派生类提供;CWinApp由CWinThread派生。另外,CWinThread对象允许给定的应用程序拥有多个线程。
CWinThread支持两种线程类型:工作者线程和用户界面线程。工作者线程没有收发消息的功能:例如,在电子表格应用程序中进行后台计算的线程。用户界面线程具有收发消息的功能,并处理从系统收到的消息。CWinApp及其派生类是用户界面线程的例子。其它用户界面线程也可由CWinThread直接派生。CWinThread类的对象存在于线程的生存期。
要使代码和MFC是完全线程安全的,CWinThread类是完全必要的。框架使用的用来维护与线程相关的信息的线程局部数据由CWinThread对象管理。由于依赖CWinThread来处理线程局部数据,任何使用MFC的线程必须由MFC创建。例如,由运行时函数_beginthreadex创建的线程不能使用任何MFC API。为了创建一个线程,调用AfxBeginThread函数。
根据需要工作者线程还是用户界面线程,有两种调用AfxBeginThread的格式。如果
9
沈阳理工大学学士学位论文
需要用户界面线程,则将指向CWinThread派生类的CRuntimeClass的指针传递给AfxBeginThread。如果需要创建工作者线程,则将指向控制函数的指针和控制函数的参数传递给AfxBeginThread。对于工作者线程和用户界面线程,可以指定可选的参数来修改优先级,堆栈大小,创建标志和安全属性。AfxBeginThread线程将返回指向新的CWinThread对象的指针。
与调用AfxBeginThread相反,可以构造一个CWinThread派生类的对象,然后调用CreateThread。如果需要在连续创建和终止线程的执行之间重复使用CWinThread对象,这种两步构造方法非常有用。创建线程也可以使用API函数:CreateThread函数完成。
2.7 Access数据库
Access是微软公司推出的基于Windows的桌面关系数据库管理系统(RDBMS),是Office系列应用软件之一。它提供了表、查询、窗体、报表、页、宏、模块7种用来建立数据库系统的对象;提供了多种向导、生成器、模板,把数据存储、数据查询、界面设计、报表生成等操作规范化;为建立功能完善的数据库管理系统提供了方便,也使得普通用户不必编写代码,就可以完成大部分数据管理的任务[15]。Access是一种关系型数据库管理系统,其主要特点如下:
(1)存储方式单一:Access管理的对象有表、查询、窗体、报表、页。宏和模块,以上对象都存放在后缀为(.mdb)的数据库文件中,便于用户的操作和管理。
(2)面向对象:Access是一个面向对象的开发工具,利用面向对象的方式将数据库系统中的各种功能对象化,将数据库管理的各种功能封装在各类对象中。它将一个应用系统当作是由一系列对象组成的,对每个对象它都定义一组方法和属性,以定义该对象的行为和外国,用户还可以按需要给对象扩展方法和属性。通过对象的方法、属性完成数据库的操作和管理,极大地简化了用户的开发工作。同时,这种基于面向对象的开发方式,使得开发应用程序更为简便。
(3)界面友好、易操作:Access是一个可视化工具,是风格与Windows完全一样,用户想要生成对象并应用,只要使用鼠标进行拖放即可,非常直观方便。系统还提供了表生成器、查询生成器、报表设计器以及数据库向导、表向导、查询向导、窗体向导、报表向导等工具,使得操作简便,容易使用和掌握。
(4)集成环境、处理多种数据信息:Access基于Windows操作系统下的集成开发环境,该环境集成了各种向导和生成器工具,极大地提高了开发人员的工作效率,使得
10
沈阳理工大学学士学位论文
建立数据库、创建表、设计用户界面、设计数据查询、报表打印等可以方便有序地进行。
(5)Access支持ODBC(开发数据库互连,Open Data Base Connectivity):利用Access强大的DDE(动态数据交换)和OLE(对象的联接和嵌入)特性,可以在一个数据表中嵌入位图、声音、Excel表格、Word文档,还可以建立动态的数据库报表和窗体等。Access还可以将程序应用于网络,并与网络上的动态数据相联接。利用数据库访问页对象生成HTML文件,轻松构建Internet/Intranet的应用。
11
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库基于VC++的网络即时通信软件的设计与实现(3)在线全文阅读。
相关推荐: