基于windows平台的局域网聊天系统内容摘要:
用户接口 )资源两大部份,两部份最后以 RC 编译程序整合为一个完整的 EXE 文件。 所谓 UI 资源是指功能菜单、对话框、程序图标、光标形状等等东西。 这些 UI 资源的实际内容(二进制代码)系借助各种工具产生,并以各种扩展名存在,如 .ico .bmp .cur 等等。 程序员必须在一个所谓的资源描述档( .rc )中描述它们。 RC 编译器( )读取 RC 文件的描述后将所有 UI 资源文件集中制作出一个 .RES 文件,再与程序代码结合在一起,这才是一个完整的 Windows 可执行文件。 与控制台程序 相同的是,一个 WIN32 程序也必须有一个程序入口点,但是在这儿它不再叫 main(),而叫做 WinMain(),当 WINDOWS 的 SHELL 检测到用户欲执行一个 EXE 程序,就会调用加载器把程序进行加载,然后调用 C startup code,后者再调用WinMain(),程序的执行就开始了, WinMain()函数的原型为: int CALLBACK WinMain( HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow); 湖北经济学院本科毕业(设计)论文 8 图 31 32 位 WINDOWS 程序的开发流程 下面程序必须进行必要的初始化工作-产生窗口,第一步是注册一个窗口类:用API 函数: RegisterClass(),而这个函数需要一个已经定义好的系统结构: WNDCLASS,这个结构里面定义了窗口的种种属性,需要自己定义,但是许多属性都有默认值。 然后调用 CreateWindow()函数来产生具有上述定义属性的已注册窗口,但是需要注意的是它只是生成窗口,但并不显示之,所以还需要调用一个函数 ShowWindow()将它显示在屏幕上,做完这些初始化工作以后,系统 将进入消息循环: while (GetMessage(amp。 msg, NULL, 0, 0)){ TranslateMessage(amp。 msg)。 DispatchMessage(amp。 msg)。 } 当消息循环捕捉到消息以后将交由窗口函数 WndProc()窗口函数进行相应的处理。 这样,一个基于消息事件驱动的 WIN32 程序的雏形就建立了起来。 MFC 框架 由上面的介绍可以看出,直接用 API 函数开发一个 WIN32 程序是相当麻烦的,有好多既定的重复性的工作要做,所以微软就用 C++的类机制将绝大部分的 API 函数进行了封装,构成了类,并且将基本的流程也封装在类机制下面,大大简化了WIN32 开的的复杂性,尤其是在开发比较大型程序的时候这个便宜性更会得以体现。 它就是 Microsoft Foundation Classes,简称为 MFC,可以说它是 VC开发环境的一个核心构件。 MFC 构架了一个庞大的类体系结构,在 时代就多达 189 个类,程序代码湖北经济学院本科毕业(设计)论文 9 达 252 个文件, 58 个头文件,共 10MB 之多, 时又多加了 29 个类,但是最为主干的是下面类结构示图所示的一些类: 图 32 MFC 类框架主体 CObject 是 MFC 类库的根类。 MFC 类库包括: ( 1) CCmdTarget 类:是 CObject 类的子类,它是 MFC 库中所有具有消息映射属性的类的公共基类。 它的子类有 CWinThread 类, CWnd 类、 CDocument 类,从 CCndTarget 类派生的类能在程序运行时动态创建对象,并处理命令消息。 ( 2) CWinThread 类:是 CCmdTarget 的子类。 CWinThread 是所有线程类的基类,封装了应用程序操作的多线程功能。 应用程序类 CWinApp 是 CWinThread 的子类,封装了初始化、运行、终止应用程序的代码。 ( 3) CWnd 类:窗口类,是 CcmdTarget 类的子类,从 CWnd 派生的类可以拥有自己的窗口,并对它进行控制。 窗口框架类 CFrameWnd 和 CView 类是 CWnd 的子类,前者创建和维护窗口的边框、菜单栏、工具栏、状态栏,负责显示和搜索用户命令,后者负责为文档提供一个或几个视图。 视图的作用是为修改、查询文档等任务提供 人机交互的界面。 ( 4)文档类 CDocument 类:是 CCmdTarget 类的子类,负责封装和维护文档。 文档包括应用程序的工作成果或环境设置数据等,可以是程序需要保存的任何内容。 CObject CWnd CDocument CwinThread CcmdTarge 湖北经济学院本科毕业(设计)论文 10 一个 MFC 应用程序并不直接操作上述类,而是以上述类为基类派生新的类,构建 Windows 应用程序的基本框架。 构建一个基于 MFC 框架的程序,可以使用 MFC 的向导程序,但首先要明白,一个基于 MFC 的程序可以有几种类型:基于单文档结构的程序,基于多文档结构的程序以及基于对话框的应用程序,不同类型的程序具有不同 的程序属性。 使用其向导以及控件编程,使得不论是界面编写,还是程序内核设计,都更加的简单。 其中有合理的消息映射机制,有方便的运行时类型识别功能,更有文档 /视图结构设计,文档串行化功能等非常多的优秀功能。 TCP/IP 协议及 WINDOWS SOCKETS 网络编程接口 TCP/IP 协议简介 ( 1) TCP/IP 协议 通常包含了一系列与 “TCP(传输控制协议) ”和 “IP(网际协议) ”有联系的 网络协议 ,它包括其它的协议,应用软件,甚至网络媒介。 这些协议的示例是: UDP( User Datagram Protocol)协议、 ICMP( Inter Control Message Protocol)协议、 ARP(地址解析协议)和其他一些协议的协议组。 应用的示例: tel(远程登录 )、 ftp(文件传递协议 )、 等。 ( 2)逻辑结构: 图 33 逻辑结构 湖北经济学院本科毕业(设计)论文 11 这是 TCP/IP 协议的分层结构在互连网计算机上的表示,用互连网技术互相通信的每台计算机都有这样的分层结构。 这样的分层结构决定了计算机在 inter 上互相通信的方式。 数据通过这样的分层结构从上层传 到底层,然后通过网线把数据传送出去。 底层的水平线代表以太网网线, “O”代表收发器, “*”代表 IP 地址, “@”代表网址,理解这样的分层结构是理解 INTERNET 技术的基础。 (3)本论文涉及到的协议: IP、 TCP IP( Inter Protocol)是 TCP/IP 的心脏,也是网络层中最重要的协议。 IP 层接收由更低层(网络接口层例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层 TCP 或 UDP 层;相反, IP 层也把从 TCP 或 UDP 层接收来的数据包传送到更低层。 IP 数据包是不可靠的,因为 IP 并没有做任何事情来确认数据包是按顺序发送的或者没有被破坏。 IP 数据包中含有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址)。 UDP( IP 协议号 17)是一个 无连接的 数据报协议。 它是一个 “best effort”或者 “不可靠 ”协议 ——不是因为它特别不可靠,而是因为它不检查数据包是否已经到达目的地,并且不保证它们按顺序到达。 UDP 的典型性应用是如流媒体(音频和视频等)这样按时到达比可靠性更重要的应用,或者如 DNS 查找这样的简单查询 /响应应用,如果需要建立可靠的连结,哪么所作的额外工作将是不成比例 地大。 本程序只应用于局域网中,局域网中的数据流传输的可靠性高,故选择 UDP 协议。 WINDOWS SOCKETS 网络编程接口概述 在网络编程中最常用的方案便是 Client/Server (客户机 /服务器 )模型。 在这种方案中客户应用程序向服务器程序请求服务。 一个服务程序通常在一个众所周知的地址监听对服务的请求,也就是说,服务进程一直处于休眠状态,直到一个客户向这个服务的地址提出了连接请求。 在这个时刻,服务程序被 惊醒 并且为客户提供服务-对客户的请求作出适当的反应。 为了方便这种 Client/Server 模型的网络编程, 90 年代初,由 Microsoft 联合了其他几家公司共同制定了一套 WINDOWS下的网络编程接口,即 Windows Sockets 规范,它不是一种网络协议 ,而是一套开放的、支持多种协议的 Windows 下的网络编程接口。 现在的 Winsock 已经基本上实现了与协议无关,你可以使用 Winsock 来调用多种协议的功能,但较常使用的是 TCP/IP 协议。 Socket 实际在计算机中提供了一个通信端口,可以通过这个端口与任何一个具有Socket 接口的计算机通信。 应用程序在网络上传输,接 收的信息都通过这个 Socket接口来实现。 如下图所示: 湖北经济学院本科毕业(设计)论文 12 图 34 面向连接的套接字的系统调用图 微软为 Visual C++定义了 Winsock 类如 CAsyncSocket 类和派生于 CAsyncSocket 的 CSocket 类,它们简单易用,我们当然 可以使用这些类来实现自己的网络程序,但是为了更好的了解 Winsock API 编程技术,本设计中将使用底层的 API 函数实现 Winsock 平台的即时通信工具。 在 VC 中进行 WINSOCK 的 API 编程开发的时候,需要在项目中使用下面的三个文件,否则会出现编译错误。 (1) : 这是 WINSOCK API 的头文件,需要包含在项目中。 (2) : WINSOCK API 连接库文件。 (3) : WINSOCK 的动态连接库,位于 WINDOWS 的安装目录下。 多线程编程技术 进程及线程概述 进程和线程都是操作系统的概念。 进程是应用程序的执行实例,每个进程是由私湖北经济学院本科毕业(设计)论文 13 有的虚拟地址空间、代码、数据和其它各种系统资源组成,进程在运行过程中创建的资源随着进程的终止而被销毁,所使用的系统资源在进程终止时被释放或关闭。 线程是进程内部的一个执行单元。 系统创建好进程后,实际上就启动执行了该进程的主执行线程,主执行线程以函数地址形式,比如说 main 或 WinMain 函数,将程序的启动点提供给 Windows 系统。 主执行线程终止了,进程也就随之终止。 每一个进程至少有一个主执行线程,它无需由用户去主动创建,是由系统自动创建的。 用户根据需要在应用程序中创建其它线程,多个线程并发地运行于同一个进程中。 一个进程中的所有线程都在该进程的虚拟地址空间中,共同使用这些虚拟地址空间、全局变量和系统资源,所以线程间的通讯非常方便,多线程技术的应用也较为广泛。 多线程可以实现并行处理,避免了某项任务长时间占用 CPU 时间。 要说明的一点是,目前大多数的计算机都是单处理器( CPU)的,为了运行所有这些线程,操作系统为每个独立线程安排一些 CPU 时间,操作系统以轮换方式向线程提供时 间片,这就给人一种假象,好象这些线程都在同时运行。 由此可见,如果两个非常活跃的线程为了抢夺对 CPU 的控制权,在线程切换时会消耗很多的 CPU 资源,反而会降低系统的性能。 这一点在多线程编程时应该注意。 Win32 SDK 函数支持进行多线程的程序设计,并提供了操作系统原理中的各种同步、互斥和临界区等操作。 Visual C++ 中,使用 MFC 类库也实现了多线程的程序设计,使得多线程编程更加方便。 Win32 API 对多线程编程的支持 Win32 提供了一系列的 API 函数来完成线程的创建、挂起、 恢复、终结以及通信等工作。 下面将选取其中的一些重要函数进行说明。 (1) HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, DWORD dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId)。 该函数在其调用进程的进程空间里创建一个新的线程,并返回已建线程的句柄。 (2) DWORD SuspendThread(HANDLE hThread)。 湖北经济学院本科毕业(设计)论文 14 该函数用于挂起指定的线程,如果函数执行成功,则线程的执行被终止。 (3) DWORD ResumeThread(HANDLE hThread)。 该函数用于结束线程的挂。基于windows平台的局域网聊天系统
相关推荐
.......................................................................................16 MC13213 活动模式 ................................................................................................
define SENSOR_TYPE_MAGNETIC_FIELD 2 //磁力 define SENSOR_TYPE_ORIENTATION 3 //方向 define SENSOR_TYPE_GYROSCOPE 4 //陀螺仪 define SENSOR_TYPE_LIGHT 5 //光线感应 define SENSOR_TYPE_PRESSURE 6 //压力 define
Uk。 Uk1=Uk。 基本 PID算法+惯性环节 加热器(对象) R PV E U(t) Y 图( 2)加热器温度控制图 11 Ek2=Ek1。 Ek1=Ek。 da=(unsigned short int)(Uk*)。 AC6611_DA(hDevice,da)。 Edit3Text=FloatToStrF(Uk,0,4,4)。 } 5 控制算法程序设计
计数输入),时钟输出 T2EX(定时器 /计数器 T2 的捕捉 /重载触发信号和方向控制) MOSI(在 系统 编程用) MISO(在 系统 编程用) SCK(在 系统 编程用) P2 口: P2 口是一个具有内部上拉电阻的 8 位双向 I/O 口, P2 输出缓冲器能驱动 4 个 TTL 逻辑电平。 对 P2 端口写 “1” 时,内部上拉电阻把端口拉高,此时可以作为输入口使用。 作为输入使用时
常现象,最后把判断的结果转换为警告信息。 ( 3)事件数据库 ( Response units ) 事件数据库是存放各种中间和最终数据的地方。 ( 4)响应单元 ( Response units ) 响应单元根据警告信息做出反应,如切断连接、改变文本属性等强烈的反 应,也可能是简单地报警。 它是入侵检测系统中的主动武器。 输出:事件的有关信息 输出:原始或低级事件 响应单元 事件分析器
的名字加 -文本编辑器 ,具体实现的代码如下: = (*.rtf)|*.rtf|All File(*.*)|*.*。 = () + -文本编辑器。 与实际运行的结果(图 )对照,结果正确 17 (图 ) ( 4) 对菜单 Save 的测试 按下菜单 Save 时,如果文件原来不存在,那它就会弹出一个对话框,让你选择保存路径,和填写文件名