局域网即时通信软件毕业论文.doc
毕业论文题 目: 局域网即时通信软件 姓 名: 林韩超 系 别: 软件学院 年 级: 09级 专业班级: 09软件技术3-2 指导教师: 吴瑜 深圳信息职业技术学院教务处编摘 要语言交流本身是方便快捷的,所以人们已经习惯于用电话进行沟通。但是,电话通信需要建立双方共同应约的条件之下,而即时通信,则解决了这个问题。即时通信在互联网领域的应用取得了巨大的成功,但是在企业内部的应用仍远未普及。局域网即时通信软件,就是基于企业内部局域网使用的即时通信。本软件采用了较普遍的MFC对话框类,使用Visual C+ 6.0进行开发。以UDP作为网络通信协议,使用WinSock网络编程接口。本软件基本实现了用户名及头像的自定义修改、用户的上下线实时显示、即时通信聊天、聊天记录的存取等功能,本文主要介绍的是局域网即时通信软件的设计与实现。 关键词: C+、MFC、UDP、WinSock、局域网、通信AbstractVerbal communication itself is convenient, so people have become accustomed to communicate by telephone. However, the telephone communication needs of both sides should be about establishing the conditions under which instant communication, is to solve this problem. The field of instant messaging applications on the Internet has achieved great success, but the application within the enterprise still far from universal. LAN instant messaging software, is based on the internal LAN to use instant messaging.The software uses the more common MFC dialog class, using Visual C + + 6.0 for development. The UDP as the network communication protocol, using the WinSock network programming interface. The software is basically a user name and picture of the custom modifications, the user's real-time display on the assembly line, instant messaging chat, chat records access and other functions, this article focuses on the LAN instant messaging software design and implementation.Keywords: C + +, MFC, UDP, WinSock, LAN, communications. 目录第1章课题背景与开发意义61.1 课题背景61.2 开发现状分析61.3 现行系统问题分析61.4 解决方案71.5课题开发意义7第2章理论基础82.1 MFC开发类库82.2 类封装技术82.3 多线程技术82.4 WinSock技术92.5 CImageList图像列表技术92.6 CStdioFile文件存储技术10第3章系统需求分析113.1业务系统描述113.2 系统存在的主要问题的分析113.3解决方案113.4 功能分析11第4章系统总体设计134.1 系统功能结构134.2 系统框架图与流程图134.3 数据结构设计15第5章详细设计与功能实现185.1通信功能模块介绍185.1.1系统监听模块185.1.2聊天通信模块185.2通信功能模块详解185.2.1上下线监听185.2.2聊天请求监听215.2.3聊天通信245.3聊天功能模块介绍275.3.1聊天记录模块275.4聊天功能模块详解275.4.1聊天记录存储275.4.2聊天记录读取285.4.3清空聊天记录295.4.4用户登录模块295.4.5资料修改模块305.4.6用户注销模块305.5用户功能模块详解315.5.1用户登录315.5.2资料读取365.5.3资料修改375.5.4用户注销385.6头像功能模块介绍395.6.1头像更改模块395.6.2头像读取显示模块405.7头像功能模块详解415.7.1头像更改415.7.2头像读取显示43第6章系统总结45参考文献46第1章 课题背景与开发意义1.1 课题背景随着互联网应用越来越丰富,以快速、交互、简便为代表的即时通讯工具,已经成为当前网络用户最喜爱的网络沟通工具。聊天软件作为当今使用最为广泛的即时性通 信工具之一,给互联网上的用户提供了诸多的服务,如文字聊天、文件传输、语音聊天、视频聊天等功能。作为即时通讯工具最具增长潜力之一的聊天软件,不仅在基础应用方面,还是产品扩展应用方面都将有质的飞跃,它为满足人们的需要,将其功能不断的完善。随着聊天软件功能的不断完善,用户通过聊天软件在互联网上 尽情的交谈,不但可以文字聊天和文件传输,还可以通过语音、视频来聊天。在今后随着互联网技术的发展,聊天软件也在以前所未有的速度改变着人们的生活方 式,它必定会成为人们网络生活不可缺少的一部分。1.2 开发现状分析1996年11月ICQ在全球发布,拉开了互联网IM(Instant Messenger,即时通讯)应用的序幕。就是这样一款小软件在短短数年时间里发展出一个巨大的IM产业。当ICQ风行全球的时候,在国内各种仿ICQ的中文IM软件也纷纷推出,时至今日,占据国内的市场的主要是腾讯公司的QQ、微软的MSN、雅虎的雅虎通等。其中腾讯公司的QQ以占据了国内70%以上的市场。随着IM应用的深入,其功能早已超越了初期的即时文字聊天。表情图标早已成为各个IM软件的标准功能,文件传输、语音/视频聊天、游戏、网上交友等高级功能也正越来越多地被集成进入IM应用。事实表明,现在的IM已不再是一个简单的沟通工具,而是一个信息资讯、交流互动、休闲娱乐中心,IM平台上的语音、视频、音乐点播、信息共享等新应用层出不穷。发展到现在,IM软件越来越成熟,IM产业链也已经形成,已经成为现代人和现代经济中不可或缺的一部份,相信未来IM软件的道路会更加宽广和精彩。1.3 现行系统问题分析即时通信软件首要问题在于对信息的精准传输。现行许多IM软件(如:腾讯QQ),大都需要一个服务端做信息的转接,这种C-S架构并不适于公司内部的这种小型局域网通信的需要,不仅搭建环境复杂,成本高,难以维护,而且在信息的转接的过程容易发生错误造成信息的丢失,错发等信息安全问题。此外,使用C-S架构还需要一个高端的服务器和数据库做支持。1.4 解决方案为了解决以上所提到的问题,本软件抛弃了C-S架构的IM搭建方式,才用多端口接发数据,实现独立用户-专一端口,防止了信息的丢失和错发。同时,省略了服务器的搭建,节约了软件运行成本。而在数据方面,无论是用户信息,还是聊天记录,全部才用本地加密存储于文件中,节省了数据库的搭建成本。整个软件仅一个客户端,将所有功能封装于各式类文件中,后期维护简单。1.5课题开发意义21世纪是信息的时代,随着互联网技术的发展,信息在传递方面也有了崭新的一面。现今聊天软件成为信息传递最为广泛的应用工具,它发挥了即时性通信的特点,可以 让用户在第一时间内得到信息的交流,它不仅可以让用户进行文字聊天,而且还增添语音、视频功能。这样可以让网上的好友身临其境的面对面的聊天,让彼此之间 更为深入的了解。人性化的设计让每个用户都可以得心应手的使用,从而获得更多人的青睐。Internet的 出现连通了整个世界,而聊天软件的出现则连通了每一位网上的用户。相比较同类产品,局域网即时通讯软件具有以下优势:1. 界面友好,操作简单,易于上手。2. 采用WinSock网络编程的规范,更加安全稳定;3. 采用加密文件存储信息,安全有保证,且成本低;4. 采用UDP通信协议,通信即时性强,无需等待对方应答;5. 无需搭建服务器,后期维护成本低,前期搭建使用简单;第2章 理论基础2.1 MFC开发类库MFC(Microsoft Foundation Classes,又称微软基础类库)是一个微软公司提供的类库(class libraries),以C+类的形式封装了Windows API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。其中包含的类包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。而Visual C+中包含MFC应用程序向导,可用于兼容MFC的应用程序。在向导中有各种选项以定制生成的程序的功能,例如界面风格、语种、数据库开发支持、打印支持、自动化支持、ActiveX支持、网络支持、基于HTML的帮助文档支持等等。MFC的主要优点是可以用面向对象的方法来调用Windows API,以及应用程序开发的便捷。MFC将很多应用程序开发中常用的功能自动化,并且提供了文档框架视图结构和活动文档这样的便于自定义的应用程序框架。同时,在Visual C+内部也内建了很多对MFC的例如类向导这样的支持以减少软件开发的时间。MFC的消息映射机制也避免了使用性能较低的庞大虚函数表。2.2 类封装技术类(class),是一种面向对象计算机编程语言的构造,是创建对象的蓝图,描述了所创建的对象共同的属性和方法。C+是一种面向对象的编程语言,因此在局域网即时通信软件中,我们采用面向对象的编程方法,将一些对象封装成为类。如Socket通信类,User用户类等。通过使用类封装技术,可以提供模型化和信息隐藏的好处,同时还提供了可重用性的好处。使得代码的利用率增强,编程过程简化,后期更加易于维护。2.3 多线程技术多线程,是指从软件或者硬件上实现多个线程迸发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。软件多线程。即便处理器只能运行一个线程,操作系统也可以通过快速的在不同线程之间进行切换,由于时间间隔很小,来给用户造成一种多个线程同时运行的假象。这样的程序运行机制被称为软件多线程。在局域网即时通信软件中,我们需要同时监听用户上下线,即时通信这两方面的信息,因此需要通过多线程来实现。而我们采用的多线程技术就是软件多线程技术。采用多线程技术,可以更好地利用系统资源。其主要优势在于充分利用了CPU的空闲时间片,可以用尽可能少的时间来对用户的要求做出响应,使得进程的整体运行效率得到较大提高,同时增强了应用程序的灵活性。更为重要的是,由于同一进程的所有线程是共享同一内存,所以不需要特殊的数据传送机制,不需要建立共享存储区或共享文件,从而使得不同任务之间的协调操作与运行、数据的交互、资源的分配等问题更加易于解决。2.4 WinSock技术WinSock,即Windows Sockets API,是Windows下得到广泛应用的、开放的、支持多种协议的网络编程接口。是Windows 网络软件访问网络服务的一种技术规范定义,特别是对TCP/IP的协议发访问。它定义TCP/IP窗口之间的标准接口 (如FTP 客户端或web 浏览器) 的客户端应用程序和基础的 TCP/IP协议栈。通信的基础是套接口(Socket),一个套接口是通讯的一端。在这一端上你可以找到与其对应的一个名字。一个正在被使用的套接口都有它的类型和与其相关的进程。套接口存在于通讯域中。通讯域是为了处理一般的线程通过套接口通讯而引进的一种抽象概念。套接口通常和同一个域中的套接口交换数据(数据交换也可能穿越域的界限,但这时一定要执行某种解释程序)。Windows Sockets规范支持单一的通讯域,即Internet域。各种进程使用这个域互相之间用Internet协议族来进行通讯(Windows Sockets 1.1以上的版本支持其他的域,例如Windows Sockets 2)。套接口可以根据通讯性质分类;这种性质对于用户是可见的。应用程序一般仅在同一类的套接口间通讯。不过只要底层的通讯协议允许,不同类型的套接口间也照样可以通讯。用户目前可以使用两种套接口,即流套接口和数据报套接口。流套接口提供了双向的,有序的,无重复并且无记录边界的数据流服务。数据报套接口支持双向的数据流,但并不保证是可靠,有序,无重复的。也就是说,一个从数据报套接口接收信息的进程有可能发现信息重复了,或者和发出时的顺序不同。数据报套接口的一个重要特点是它保留了记录边界。对于这一特点,数据报套接口采用了与现在许多包交换网络(例如以太网)非常类似的模型。Windows Socket API 规范定义了两个接口: API用于应用程序开发人员和SPI,是提供给网络软件开发者向系统添加新协议模块的一种手段。每个接口表示一个协议。API可以保证一个应用程序对使用正常协议执行的任何网络软件供应商保持一致性。本软件采用UDP协议,结合WinSock网络编程接口,实现通信及用户上下线通知功能。2.5 CImageList图像列表技术有两种类型的图像列表(CImageList):非屏蔽的和屏蔽的。非屏蔽的图像列表由包含一个或多个图像的色位图构成。屏蔽的图像列表由相同大小的两个位图构成。第一个是包含图像的色位图,第二个是包含一系列屏蔽的单色位图(一个屏蔽对应第一个位图中的一个图像)。 Create成员函数的一个重载创建一个标志指示图像列表是否是屏蔽的。(其他重载创建屏蔽的图像列表)。 绘制非屏蔽图像时,只是简单地将其复制到目标DC。绘制屏蔽图像时,图像位和屏蔽位组合,一般在位图中产生显露目标DC背景色的透明区域。绘制屏蔽图像时可以指定几种绘图样式。例如,可以指定图像进行抖色处理以指示选定的对象。2.6 CStdioFile文件存储技术CFile的派生类CStdioFile提供了对文件进行流式的操作功能。其中函数void CStdioFile:WriteString( LPCTSTR lpsz )写入一个字符串,需要给字符串lpsz的末尾加上换行标志”rn”;函数bool CStdioFile:ReadString(CString &rString )从文件中读取一行,如果文件未读完返回true,否则返回false。第3章 系统需求分析3.1业务系统描述随着个人电脑的普及,许多公司甚至家庭都拥有不止一台电脑。而与此同时,网络用户也日益增多。许多公司及家庭的局域网应运而生。在这样的社会背景下,局域网即时通讯软件的出现,正解决了在局域网内即时通信的问题。局域网即时通讯软件可以实现即时显示在线用户的状态,且区别于国内某知名IM软件,占用内存小,完全不影响系统的正常操作。在内存控制方面极为苛刻,绝不会出现内存泄漏等严重问题。此外,无需搭建服务器,即可实现即时通信,信息准确传递,绝无延时丢失。软件搭建成本低,后期维护简单。还具备用户信息及聊天记录的存储功能,保证了信息的持久性。3.2 系统存在的主要问题的分析局域网即时通讯软件伴随网络技术的发展已经得到了长足的进步,功能设计及实现上已经比较完善。但是现行的一些系统仍旧存在一些问题,归纳如下:1. 功能过于单一,仅限于消息发送;2. 系统设计仍不是最优化,存在大量内存冗余;3. 信息存储加密方式过于简单,容易被破解,造成信息泄漏。3.3解决方案根据对目前已有的局域网即时通讯软件的了解,结合对此类应用系统的研究和分析,新系统的设计应具备以下几方面的要求:1、新增语音通信及文件传输的功能;2、优化内存管理,清除空置无用内存空间;3、采用新的更复杂的加密算法,并采用dll文件存储数据,提升信息的安全性。3.4 功能分析局域网即时通信软件主要完成对局域网即时通信的功能。本软件的其他功能为:1、 对首次登录用户,录入基本信息,包含用户名及头像,存储于文件之中;2、 点击主窗口用户头像,即可弹出用户信息设置对话框;3、 点击用户信息设置对话框中的头像,即可弹出更改头像对话框,点击相应头像,即可预览显示;4、 软件成功启动,即时通知局域网用户上线信息;5、 软件正常关闭,即时通知局域网用户下线信息;6、 双击用户头像,弹出聊天窗口;7、 接到聊天信息,若无显示窗口,则自动弹出新窗口,并将接收到的信息显示在窗口上;8、 聊天窗口点击发送,即可发送消息,若内容为空,则不可发送;9、 每个用户的所有聊天信息存储于文件中,点击右上角按钮,展开扩展窗口,显示聊天记录;第4章 系统总体设计4.1 系统功能结构针对软件的功能设计,系统将分成:1、视图层,主导用户各项可视化操作,主要体现在UI设计,空间布局上;2、业务层,主导系统WinSock通信的各项监听及发送工作,主要通过消息映射与线程函数实现;3、持久层,主导系统数据存储,其中包括存储聊天记录,用户资料等。4.2 系统框架图与流程图局域网即时通信软件在系统框架设计方面,主要分为了三个主框架,一是用户信息模块,包含用户上下线通知,资料的读取修改存储等;二是系统监听模块,包含对用户上下线消息与聊天请求消息的监听;三是聊天通信模块,其中包含用户聊天信息的接收、发送及存储三大功能。系统框架图与流程图如图所示:框架图流程图4.3 数据结构设计用户资料设置对话框类名CFirstLoginDlg变量名类型关联控件ID作用BitmapIDshort全局变量存储头像ID号m_bitCBitmap全局变量加载位图资源m_titleDlgCString全局变量存放对话框标题m_ctrlHeadCStaticIDC_STATIC_HEAD显示头像控件m_strIPCStringIDC_EDIT_IP显示本机IPm_strUserCStringIDC_EDIT_USER用户名变量FL_UserDataUserFileApp全局变量用户信息类类名CIMApp变量名类型关联控件ID作用b_DlgOpen255bool全局变量存放用户对话框状态,是否已弹出DATAFILEPATH全局常量用户信息存放路径工程主类主对话框类名CIMDlg变量名类型关联控件ID作用m_iBitmapIDshort全局变量存储头像ID号m_headbitCBitmap全局变量加载头像位图资源m_ctrlOnlineListCListCtrlIDC_LIST_ONLINE显示在线用户列表m_ctrlHeadBitCStaticIDC_STATIC_HEAD显示头像控件m_strIPCStringIDC_EDIT_IP显示本机IPm_strUserCStringIDC_EDIT_USER用户名变量IM_UserDataUserFileApp全局变量用户信息类theAppextern CIMApp全局变量共享工程类RecvDialogSocketApp全局变量监听聊天请求WinSock通信封装类RecvOnlineSocketApp全局变量监听上下线广播WinSock通信封装类imgCImageList *全局变量列表控件头像列表p_OnlineThreadCWinThread *全局变量上下线监听线程句柄p_DialogThreadCWinThread *全局变量聊天请求监听线程句柄All_user255struct Onlinechar IP15;char user20;int flag;int bitmapID;全局变量存放已上线用户信息类名CImgListDlg变量名类型关联控件ID作用m_iBitmapIDint全局变量存放头像ID号m_selbitCBitmap全局变量加载位图资源m_ctrlselbitCStaticIDC_STATIC_SELECT显示所选头像头像设置对话框聊天窗口对话框类名CMessageDlg变量名类型关联控件ID作用iBitmapIDint全局变量存放头像ID号bHeadmapCBitmap全局变量加载位图资源m_iPortint全局变量通信端口号p_LinMegThreadCWinThread *全局变量聊天通信线程句柄MyProstruct Onlinechar IP15;char user20;int flag;int bitmapID;全局变量存放本机资料rectLargestatic CRect全局变量对话框最大尺寸rectSmallstatic CRect全局变量对话框最小尺寸RMegSockSocketApp全局变量聊天通信Socket类theAppextern CIMApp全局变量共享工程类m_ctrlselbitCStaticIDC_HEAD_BITMAP显示所选头像m_ctrlHistoryCEditIDC_HISTORY显示聊天记录m_strHistoryMegCStringIDC_HISTORY更新聊天记录m_ctrlIP;CStaticIDC_USER_IP显示对方IPm_strIPCStringIDC_USER_IP显示对方IPm_ctrlTalkCEditIDC_EDIT_TALKING显示当前聊天记录m_strTalkCStringIDC_EDIT_TALKING当前聊天记录m_strMegCStringIDC_EDIT_MESSAGE发送消息字符串m_strUserCStringIDC_STATIC_USER显示用户名m_ctrlUserCStaticIDC_STATIC_USER显示用户名Socket通信类类名SocketApp变量名类型关联控件ID作用s_socketSOCKETprivate保护变量Socket对象s_sockaddrstruct sockaddr_inprivate保护变量设置Socket通信结构体s_wsaDataWSADATAprivate保护变量WinSock对象用户信息类类名UserFileApp变量名类型关联控件ID作用uf_struserCStringprivate保护变量用户名uf_ibitIDshortprivate保护变量头像ID号第5章 详细设计与功能实现5.1 通信功能模块介绍5.1.1 系统监听模块系统监听模块包含了两部分,一是用户上下线监听功能,二是聊天请求的监听工作。上下线监听功能既是当用户上线时,客户端接收到用户上线信息,即将其添加到用户上线列表之中,同时想对方报告自己上线的消息。而当用户下线时,客户端接收到下线消息,即将其从在线列表中删除。聊天请求监听功能则是接收对方所发来的聊天请求,然后可以自动弹出聊天窗体,以之开始聊天。5.1.2 聊天通信模块聊天通信模块包含了聊天信息的发送,接收,与记录。其中聊天信息的记录是由组内另一成员完成的,这里就不赘言。聊天信息发送指的是点击聊天窗口的发送按钮,即将编辑框的内容发送至对方。而聊天信息的接收指的是但对方发来消息时,他们需要将对方发送来的信息接收并显示到窗体之中。5.2 通信功能模块详解系统监听模块与聊天通信模块是这个软件最重要的部分,它保证了软件聊天的即时性。应该算是软件的核心功能之一。接下来,我将为大家讲解其具体实现方式:5.2.1 上下线监听做上下线功能,首先需要理清上下线通知需要包含什么信息。对于一个刚上线的用户,他需要通知局域网内的所有在线用户我“上线了”,通知信息中包含本机的一些信息(包含头像,用户名,IP等)。而局域网的其他用户在接收到该信息后,就需要将其用户加入自己的在线用户列表中,同时反馈一条信息告知,我“早已上线”。这时问题出现了,这两条信息是通过同一端口通信的,那么我们该如何区分这两条信息呢?在这里,我们采用了一种很技巧的方法,我们给每条信息都加上一个加上一个标识符flag,0表示上线,1表示反馈信息,2表示下线,如此就可以将其一一区分开了。因此,在上下线通知上需要包含标识符、头像,用户名,IP这几个信息。我们采用一个结构体来存储这些信息:struct Onlinechar IP15;char user20;int flag;int bitmapID;All_user255;在这里,我们还同时声明了一个结构体数组,用来存储接收到的用户信息。而上下线的监听线程,相关代码如下:/*/* 监听上下线线程 */*/UINT CIMDlg:LinOnlineThread(LPVOID p)CIMDlg *pDlg=(CIMDlg *)p;Online onlineMeg;RecvOnline.InitWSAData();RecvOnline.SetSock(6666,"0.0.0.0");RecvOnline.InitRecvSock();CString RecvIP,RecvUser,scmp;int flag,RecvBitID,i,UserNum;while(TRUE)RecvOnline.RecvMeg(char*)&onlineMeg,sizeof(onlineMeg);flag=onlineMeg.flag;RecvIP=onlineMeg.IP;RecvBitID=onlineMeg.bitmapID;RecvUser=onlineMeg.user;if (!strcmp(RecvIP,pDlg->m_strIP)continue;if (flag=2)for(i=0;i<pDlg->m_ctrlOnlineList.GetItemCount();i+)scmp=pDlg->m_ctrlOnlineList.GetItemText(i,1);if(!strcmp(RecvIP,scmp)pDlg->m_ctrlOnlineList.DeleteItem(i);break;elseif(flag=0) Online SendOnlineMeg;SendOnlineMeg.flag=1;strcpy(SendOnlineMeg.user,pDlg->m_strUser);strcpy(SendOnlineMeg.IP,pDlg->m_strIP);SendOnlineMeg.bitmapID=pDlg->m_iBitmapID;SocketApp OnlineSock;OnlineSock.InitWSAData();OnlineSock.InitSendSock();OnlineSock.SetSock(6666,RecvIP);OnlineSock.SendMeg(char*)&SendOnlineMeg,sizeof(SendOnlineMeg);OnlineSock.ClosSock();m_bit.LoadBitmap(IDB_BITMAP01+RecvBitID);img->Add(&m_bit,RGB(0,0,0);m_bit.DeleteObject();pDlg->m_ctrlOnlineList.SetItemText(pDlg->m_ctrlOnlineList.InsertItem(0,RecvUser),1,RecvIP);pDlg->m_ctrlOnlineList.SetImageList(img,LVSIL_SMALL);UserNum=atoi(RecvIP.Right(RecvIP.GetLength()-RecvIP.ReverseFind('.')-1)-1;strcpy(All_userUserNum.IP,RecvIP);strcpy(All_userUserNum.user,RecvUser);All_userUserNum.bitmapID=onlineMeg.bitmapID;All_userUserNum.flag=0;RecvOnline.ClosSock();return 0;监听线程需要使用,一些对话框的资源,因此我们声明了一个对话框的指针:CIMDlg *pDlg=(CIMDlg *)p;然后我们声明了一个 Online类型的结构体变量用于接收信息,和一个SocketApp类,启动监听端口6666。当接收到信息后,则将结构体的flag值提取出来,做一个判断。如果等于2的话,说明所接收到的信息是下线信息,那么我们历遍整个列表,找出所接收到的IP,然后将该行删除。如果接收到的flag为0,那么则需要发送反馈信息,然后将接收到的IP加入列表控件之中:Online SendOnlineMeg;SendOnlineMeg.flag=1;strcpy(SendOnlineMeg.user,pDlg->m_strUser);strcpy(SendOnlineMeg.IP,pDlg->m_strIP);SendOnlineMeg.bitmapID=pDlg->m_iBitmapID;SocketApp OnlineSock;OnlineSock.InitWSAData();OnlineSock.InitSendSock();OnlineSock.SetSock(6666,RecvIP);OnlineSock.SendMeg(char*)&SendOnlineMeg,sizeof(SendOnlineMeg);OnlineSock.ClosSock();如果接收到的flag为1,那么则直接跳过发送反馈信息,只做添加IP到列表控件的功能。5.2.2 聊天请求监听由于在功能设计上,我们设计其为当用户来消息时,即弹出聊天窗口,因此,我们设计了这个聊天请求监听模块。我们设计之中的聊天请求监听端口为8888。那么当我们在线程中接收到用户信息时,我们需要弹出一个非模态对话框。但是,在线程中直接弹出非模态对话框会出现内存错误,最后导致程序意外关闭。因此,我们需要为程序创建一个新的消息映射,然后通过SendMessage来实现弹出非模态对话框的功能。首先,我们到对话框的头文件IMDlg.h里,在/AFX_MSG(CIMDlg) 后加上:afx_msg void OnCreateDlg(WPARAM,LPARAM);/消息函数声明afx_msg void OnDeleteDlg(WPARAM,LPARAM);afx_msg void OnInitDlg(WPARAM,LPARAM);其中第一个为创建非模态对话框消息映射声明,第二个为销毁非模态对话框消息映射声明,第三个为初始化及显示非模态对话框消息映射声明。然后,我们进入IMDlg.cpp文件中,找到BEGIN_MESSAGE_MAP(CIMDlg, CDialog)在其后面加上:ON_MESSAGE(UM_CREATE_DLG,OnCreateDlg)/消息映射ON_MESSAGE(UM_DELETE_DLG,OnDeleteDlg)ON_MESSAGE(UM_INIT_DLG,OnInitDlg)接着,定义消息函数:/*/* 创建非模态对话框 */*/void CIMDlg:OnCreateDlg(WPARAM wParam,LPARAM lParam )CMessageDlg* p=(CMessageDlg*)wParam; /CTransportInfoDlg为非模态对话框类p->Create(IDD_DIALOG_MESSAGE,this); /IDD_TRAN