基于VC的局域网聊天室2.doc_第1页
基于VC的局域网聊天室2.doc_第2页
基于VC的局域网聊天室2.doc_第3页
基于VC的局域网聊天室2.doc_第4页
基于VC的局域网聊天室2.doc_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

摘 要随着计算机科学和Internet 的飞速发展, 网上聊天已成为人们相互交流的一种方式, 与E-mail、电话相比, 聊天服务更具有实时性和有效性。本项目采用软件工程的方法,综合运用程序设计技术、网络技术,以Visual C+ 6.0作为系统前台应用程序开发工具,主要研究了在TCP/IP协议下的局域网聊天室。此局域网聊天室采用客户端/服务器(C/S)模式和TCP连接。它有两个模块组成:服务器和客户端。服务器模块主要用来维护网络上所有用户的信息,如用户名;聊天客户端模块主要包括用户登录、发送信息、接收信息等。整个工程采用结构化的方式进行编译,逐步完善系统功能。系统采用CSocket实现连网功能。CSocket是MFC在CAsyncSocket基础上派生的一个同步阻塞Socket的封装类。而Socket是Windows中得到广泛应用的、开放的、支持多协议的网络编程接口。该聊天室是一套适用于Internet网络使用的网络聊天室,其操作简单,灵活性好,运行也比较稳定。关键词:VC+;套接字;传输控制协议;网络; 绪论在网络越来越发达的今天,人们对网络的依赖越来越多,越来越离不开网络,由此而产生的聊天工具越来越多,例如,国外的ICQ、国内腾讯公司开发的OICQ。基于VC+网络编程的强大功能,本次毕业设计使用VC+编写一个聊天系统。本系统建立在VC平台上,系统的设计使用了面向对象技术和面向对象的设计原则。系统采用C/S结构,客户端与客户端以及客户端与服务器端之间通过CSocket传送消息1。使用VC+语言编写,开发工具采用VC6.02。本课题主要研究的是局域网聊天室,该聊天室采用客户端/服务器(C/S)模式和TCP连接,能实现用户在客户端与服务器间传递文字信息。它有两个程序组成:服务器和客户端,首先需要登录服务器,需要指定服务器地址和端口号,同时设置一个网名,与服务器建立连接,如果所取网名已经被其他已经登录的客户端使用,服务器会告诉客户端 ,要求重新登录。登录后,客户端各用户可以发送文字信息,相互聊天。服务器模块主要用来维护网络上所有用户的信息,如用户名;聊天客户端模块主要包括用户登录、发送信息、接收信息等。整个工程采用结构化的方式进行编译,逐步完善系统功能。研究本课题需要熟练掌握VC+语言,并且熟悉VC平台的操作,利用socket编程技术、TCP协议进行局域网聊天软件的实际开发。选择TCP协议而不选UDP是为了保证信息的可靠性,不同于UDP协议,TCP要求在获得可靠连接后才发送消息。图2 MSN服务器-客户端模型。3 开发环境及编程语言介绍3.1 Visual C+可视化集成开发环境VC6.0是微软推出的一款可视化编程工具,适用面非常广泛。VC6.0包含了一个文本编辑器、资源编辑器、工程编译工具、一个增量连接器、源代码浏览器、集成调试工具,以及一套联机文档。使用VC6.0,可以完成创建、调试、修改应用程序等的各种操作。VC6.0采用标准的多窗口Windows用户界面,并增加了一些新特性,使得开发环境更易于使用,用户很容易学会它的使用方法。由于VC6.0是一个可视化的开发工具,在介绍VC6.0的各个组成部分之前,首先了解一下可视化编程的概念。可视化技术是当前发展迅速并引人注目的技术之一,它的特点是把原来抽象的数字、表格、功能逻辑等用直观的图形、图象的形式表现出来5。可视化编程是它的重要应用之一。所谓可视化编程,就是指:在软件开发过程中,用直观的具有一定含义的图标按钮、图形化的对象取代原来手工的抽象的编辑、运行、浏览操作,软件开发过程表现为鼠标点击按钮和拖放图形化的对象以及指定对象的属性、行为的过程。这种可视化的编程方法易学易用,而且大大提高了工作效率6。3.2 网络编程80年代初,美国政府的高级研究工程机构(ARPA)给加利福尼亚大Berkeley分校提供了资金,让他们在UNIX操作系统下实现TCP/IP协议。在这个项目中研究人员为TCP/IP网络通信开发了一个API(应用程序接口)。这个API称为Socket接口(套接字)。今天,SOCKET接口是TCP/IP网络最为通用的API,也是INTERNET上进行应用开发最为通用的API。套接字是从英文单词 socket翻译过来的, ( Socket在英文中是插座的意思,在这里设计者实际上是暗指电话插座。因为在 Socket环境下编程很像是打电话的模拟,Internet的 IP地址就是电话号码,要打电话,首先要有个电话插座,在程序中就是向系统申请一个 Socket,以后两台机器上的程序“交谈”都是通过这个 Socket来进行的。对程序员来说,也可以把Socket看成一个文件指针,只要向指针所指的文件读写数据,就可以实现双向通讯。它是网络通信的基本构件。套接字是可以被命名和寻址的通信端点,是网络互连终点。换句话说,网络互连是两个计算机或处理器通过网络相互传输数据。网络专业人员将每个网络会话的末端称做终点。若通过套接字接口进行网络互连,则程序在每个网络互连的末端都需要一个套接字,套接字接口相当于文件系统,可以使用 API通过网络软件申请一个可以指定特定套接字的句柄来定义套接字的特性。当然 ,套接字句柄和文件句柄是不同的,文件句柄指向一个特定的文件和设备,而套接字句柄并不代表一个特定的终点或目标地址。基于套接字的程序先创建一个套接字,然后再将套接字和目标终点连接起来。底层的套接字函数是 WinInetAPI的一部分,但使用MFC的 CSocket类,它封装了这些套接字函数。CSocket类实际上来源于 CAsyncSocket类,但该类编程比较复杂,需要编写底层函数来进行通信操作,而 CSocket为底层函数提供了一个更抽象的封装,替编程者执行对底层函数的操作,简化了Socket编程。CSocket类提供了一个高级的 Socket支持,运用了 MFC的序列化类来提供和传输 Socket对象。利用 Socket进行通讯,有两种主要的方式。一种叫流方式 ( StreamSocket)也称面向连接方式。在这种方式下,两个通讯的应用程序之间先要建立一种虚拟的连接。其过程好像客户机在给服务器打电话,只有服务器拿起了听筒,才有可能开始传输数据,这种方式对应的TCP协议。第二种叫作数据报文方式 (DatagramSocket) ,又称无连接方式 ,这时两台计算机像是把数据放在一封封信里通过网络寄给对方,信在传送的过程中有可能会残缺不全,而且,后发出的信也有可能会先收到,它对应的是 UDP协议7。流方式的特点是,通讯可靠,对数据有校验和重发的机制,通常用来作数据文件的传输如 ftp、telnet等;数据报文方式由于取消了重发校验机制,能够达到较高的通讯速率,可以用作一些对数据可靠性要求不高的通讯 ,如实时的语音、像转送、播消息等。由于两台计算机之间采用的是客户机/服务器模式,为保证数据的可靠性,可以采用了基于流方式的套接字编程8。4 局域网聊天室的设计4.1 客户机/服务器模式通信的两个应用程序间相互作用的主要模式是客户机/服务器模式,即客户向服务器发出服务请求,服务器接收到请求后,提供相应的服务。客户机/服务器模式的建立基于以下两点:首先。建立网络的起因是网络中软硬件资源、运算能力和信息不均等,需要共享,从而造就拥有众多资源的主机提供服务,资源较少的客户请求服务这一非对等作用。其次,网间进程通信完全是异步的,相互通信的进程间既不存在父子关系,又不共享内存缓冲区,因此需要一种机制为希望通信的进程间建立联系,为二者的数据交换提供同步9。客户机/服务器模式在操作过程中采取的是主动请求方式:首先服务器方要先启动,并根据请求提供相应服务:1) 打开通信通道并告知本地主机,它愿意在某一公认地址上接收客户请求;2) 等待客户请求到达该端口;3) 接收到服务请求,处理该请求并发送应答信号。服务完成后,关闭与客户的通信链路,并终止;4) 返回第二步,等待客户请求;5) 关闭服务器。客户方:1) 打开一通信通道,并连接到服务器所在主机的特定端口; 2) 向服务器发服务请求,等待并接收应答;3) 请求结束后关闭通信通道并终止。由此可知:1) 客户与服务器进程的作用是非对称的,因此编码不同;2) 服务进程一般是先于客户请求而启动的。只要系统运行,该服务进程一直存在,直到正常终止或被强迫终止。4.2 系统实现原理聊天系统的设计跟普通网站设计有着许多不同的地方,普通网站设计所考虑的因素,例如,普通网站需要对布局进入大量美化以及动画设计等等,而聊天室只要提供满足访客双方直接实时聊天即可。因此,在设计聊天系统的过程中,必须要考虑好以下几个设计要点:在Internet上的聊天程序一般都是以服务器提供服务端连接响应,使用者通过客户端程序登录到服务器,就可以与登录在同一服务器上的用户交谈,这是一个面向连接的通信过程。因此,程序要在TCP/IP环境下,实现服务器端和客户端两部分程序。为了利用重载套接字的消息相应函数 必须从CAsyncSocket派生出自己的套接字类,有时为了分开监听套接字和客户端套接字,还应该分别派生监听套接字类和客户端套接字类。利用这两类函数就可以开始写网络通信程序。整个过程可以分成三个阶段 连接建立 、数据传和拆除连接10。客户端服务器建立服务端监听等待并接受连接创建连接套接字发送消息Send接受消息Receive关闭套接字Close向服务端发送连接请求 Connect发送消息Send接受消息Receive关闭套接字Close图3 系统实现原理图在套接字创建以及通信的过程中,将用到很多函数处理相关事件,具体函数见下:(1) AfxSocketInit(): 此函数在初始化应用程序函数中调用,用于确定Winsock版本并做一些套接字的初始化工作。(2) Create(): 创建套接字,在创建监听套接字时必须加上端口号。(3) Listen(): 监听套接字专用,用于向监听套接字发送对端口监听的命令。(4) Connect(): 客户端套接字专用,用于向服务器发送连接请求。(5) Accept(): 监听套接字专用,用于接受客户端通过网络发送的连接请求,建立连接。(6) Send(): 用于向套接字发送数据。(7) Receive(): 用于套接字接受数据。(8) Close(): 关闭套接字,可由析构函数调用。在整个通信过程中,当某一事件触发时,应用框架将收到某些消息,从而自动调用响应函数。可以在这些函数中写入自己的代码,从而更好的完成通信过程。具体函数见下:(1) OnAccept(): 监听套接字在端口听到连接请求时应用程序框架自动调用,以告知可以接受请求或拒绝连接。可在该函数中调用Accept()来连接请求,建立连接。(2) OnConnect(): 当客户端套接字连接请求完成后 ,应用程序框架调用该函数 ,告之是否成功。(3) OnSend(): 框架调用此函数来通知该套接字现在可以调用Send函数来传送数据。(4) OnReceive(): 框架调用此函数来告诉套接字现在可以调用Receive函数从数据缓冲区取出数据。(5) OnCloes(): 框架调用该函数告知套接字与其连接的对方套接字已经断开连接。4.3 系统工作流程结束启动服务器判断启动启动客户端判断连接登入聊天室退出聊天室退出服务器开始否否是是图4 系统总工作流程图首先启动聊天室的服务端,设置端口,打开监听。然后启动客户端(可启动多个),设置用户昵称和连接端口等信息,连接服务器。进入聊天室后用户之间可以进行简单的文字聊天。当用户发送信息后,服务器会收到用户发送的信息,然后服务器把收到的信息发送给所有在线用户。这样登入服务器的用户们之间就可以进行简单的文字聊天了。当用户进入聊天室后,服务器会发送相应的消息通知该用户进入了聊天室。当用户断开连接后,服务器也会通知该用户下线。整个聊天室基于CSocket的流式连接放大。基于TCP传送控制协议。该协议所要求用户必须先确定连接成功后才能发送消息,如果是UDP协议那可以不进行连接过程,这样实时性比较好11。4.4 界面设计图5 界面资源图在设计的过程中,当掌握了核心思想内容,成功完成功能实现后,界面设计永远是重要的部分。一个好的界面会让使用者方便操控,会让功能直观的实现,也会给人们良好的视觉冲击。上图为该局域网聊天室的服务器界面资源图。对于基本内容发送及接受消息,设计都以比较突出的方式显示,并且占据大部分界面。上半部为服务器名称设置,监听端口的设置。右边部分为一些其它内容设置12。5 局域网聊天室的实现5.1 准备工作注意勾选这项了!图6 设置MFC向导图该聊天室是基于MFC的CSocket编程,首先建立正确的MFC AppWizard(exe)程序后,进行MFC程序向导的设置中要记得勾选Windows Socket这项。这样编译器会自动的加载有关Socket的相关动态连接库和静态库及相应的头文件到程序中。如果没有勾选也没关系,只要在编程过程中正确加入相应内容即可!正确的向导设置会给你省去很多工作13!在开始程序之前先得创建一个派生于CAsyncSocket的类,当然也可以直接派生于CSocket。CAsyncSocket类中封装了一些有关套接字之间消息传递的函数。当有相关消息到来时,应用框架会自动调用这些函数,从而可以比较方便的实现套接字之间的信息传输。代码如下:class csocket:public CSocketpublic:void OnReceive(int i)dlg-onrev(mynum);void OnAccept(int i)dlg-onac();void OnClose(int i)dlg-oncl();void setp(CTcpseverDlg * severdlg,int num) mynum=num; dlg=severdlg;private:CTcpseverDlg *dlg;int mynum;在上面的代码中,只解释一个封装于CAsyncSocket中的函数。OnReceive()函数在MSDN中的声明是这样的:virtual void OnReceive( int nErrorCode );该函数定义为虚函数,这样才可以在派生的新类csocket中重新定义,根据多态性原理可以当应用程序框架收到消息后会调用定义的这个OnReceive函数。在函数的实现中加入了自己的代码:dlg-onrev(mynum);该代码意为用对象dlg调用函数onrev(),onrev()在类CTcpseverDlg中做了声明和定义,后续会去分析这个函数。在类csocket中直接用到了CTcpseverDlg类的对象。这样在派生csocket类之前一定要对CTcpseverDlg类做一个申明。或者把类csocket类的声明放在类CTcpseverDlg之后。当服务器收到网络发送的消息后,框架自动调用函数OnReceive(),这样就执行了代码dlg-onrev(mynum);现在来分析onrev()在类CTcpseverDlg中的定义。void CTcpseverDlg:onrev(int mynum)CString str,str1;int i;char ss100;for(int j=0;j100;j+) ssj=0;csrevmynum.Receive(ss,100);str.Format(%s,ss);for(i=1;iLineScroll(ce-GetLineCount()-1);从定义中可以看出,函数实现的功能是把收到的信息(某客户端发送的)发送到连接到这个聊天室的所有用户。并且在发送完成后把信息打印到自己的屏幕上。并设置正确的滚动条信息。这样就完成了接收并转发消息的功能。下面的OnAccept和OnClose函数都是框架自动调用的,分别在建立连接和断开连接后触发调用。在这些消息调用中只要正确的加入自己的信息就可以处理好各种事件。函数setp()起到了一个指针保护作用。在类CTcpseverApp的初始化函数中对套接字做了一个初始化工作,使工程正确的得到WinSock的信息。部分代码如下:if (!AfxSocketInit()AfxMessageBox(IDP_SOCKETS_INIT_FAILED);return FALSE;AfxSocketInit()函数如果初始化成功则返回非零,否者返回零。这样可知如果初始化失败则会调用函数AfxMessageBox弹出错误信息。在类CTcpseverDlg的初始化函数中也做了一些事情,看代码:BOOL CTcpseverDlg:OnInitDialog()CWnd* wnd;CString str;wnd=GetDlgItem(IDC_MARKST);wnd-GetWindowText(str);wnd=GetDlgItem(IDC_MARK);wnd-SetWindowText(str);wnd-ShowWindow(SW_HIDE);SetDlgItemText(IDC_EDIT3,亡羊哺狼);SetDlgItemText(IDC_EDIT4,1025);CBitmap bitmap;bitmap.LoadBitmap(IDB_BITMAP1);m_setPic.ModifyStyle(0,SS_BITMAP);m_setPic.SetBitmap(HBITMAP)bitmap.Detach();return TRUE; / return TRUE unless you set the focus to a control代码中又涉及到了虚函数多态性,实现了动态联编。先定义了个CWnd的指针。CWnd封装了函数GetDlgItem(),这样对于其派生的比如编辑框类,静态文本类,按钮类等都继承了此函数。这样只需在最前面定义一个CWnd的指针就可以动态的获取相应消息。这些代码首先对窗口进行了一些文本设置和某些窗口的隐藏。还设置了服务器的昵称为亡羊哺狼,默认监听端口号1025.并且对某窗口的位图做了个默认的设置。5.2 功能实现图7服务器启动界面图运行VC,打开服务端时启动界面如上。首先服务器有一个默认设置,服务器名称默认值为“亡羊哺狼”,默认端口号是1025.注意了,在32位机器上端口号有65536个。但是0-1023被系统占用了,只能设置从1024-65535中的号码。当点击开始监听后,服务器设置中的按钮都会变成灰色,不可点击了,这样在整个监听过程中维护了信息的安全性。聊天区右上角有个“清空”按钮,初始状态是灰色的,不可点击。当聊天区有信息记录后会变成可点击按钮。当点击清空后会清空聊天区的信息记录。监听成功,用户登入,聊天内容,用户退出等信息都会记录在聊天区中,方便阅读。在监听端口过程中可能发生端口被占用的错误信息,这样就得重新设置端口了。当然从1025-65535之间的端口不可能被全部占用。下面贴出部分实现代码:void CTcpseverDlg:Onsend() CString str,history;GetDlgItemText(IDC_EDIT1,history);GetDlgItemText(IDC_EDIT2,str);str=severname+:+str;int len=str.GetLength();for(int i=1;iLineScroll(ce-GetLineCount()-1);这是点击控件“发送”的消息响应函数。函数先把以前聊天区的内容存储下来,再把其要发送的内和以前的内容都打印到屏幕上。做完这些工作向各个登入用户发送信息。可清空了灰色了发送的聊天记录图8 用户登入后聊天图void CTcpseverDlg:Onlisten() CString ipstr,portstr;int port;GetDlgItemText(IDC_EDIT3,ipstr);severname=ipstr;GetDlgItemText(IDC_EDIT4,portstr);portstr.TrimLeft();portstr.TrimRight();port=atoi(portstr);if(port1024&portEnableWindow(false);cw=GetDlgItem(IDC_EDIT4);cw-EnableWindow(false);cw=GetDlgItem(IDC_listen);cw-EnableWindow(false);cw=GetDlgItem(IDC_EDIT1);cw-SetWindowText(本服务器名称为: +severname+rn正在后台等待用户连接,监听端口:+portstr+);elseMessageBox(绑定监听端口失败,请确认该端口没有被其它程序占用);cslisten.Close();CString strServ,strPort;CWnd* wnd;wnd=GetDlgItem(IDC_EDIT3);wnd-GetWindowText(strServ);wnd=GetDlgItem(IDC_EDIT4);wnd-GetWindowText(strPort);wnd=GetDlgItem(IDC_SERVINFORM);wnd-SetWindowText(n*服务器名称:n+strServ+nn端口号: +strPort+nn协议类型:TCPn传输控制协议n*);elseMessageBox(端口输入有误,请重新输入);前面一部分代码捕捉了端口号,但是端口号是以字符串的形式处理的,而不是数字。函数TrimLeft和TrimRight分别意为裁掉该端口字符串的左边空格和右边空格。这样防止了用户某些习惯性输入错误。当正确输入端口号后,创建了一个监听套接字并对端口进行监听。然后通过EnableWindow()把某些窗体设置为不可点击。最后再把信息反馈到屏幕上打印出来。右边有个图片设置,可以点击图片更改到下一幅。再下面就是服务器信息。打印出了服务器的监听端口号,昵称等等,这些由程序动态获取。最后是个公告信息,可以直接点击进行编辑。贴出部分实现代码:void CTcpseverDlg:OnPic() static int index;index+;index=index%5;CBitmap bitmap;int bit5=IDB_BITMAP1,IDB_BITMAP2,IDB_BITMAP3,IDB_BITMAP4,IDB_BITMAP5;bitmap.LoadBitmap(bitindex);m_setPic.ModifyStyle(0,SS_BITMAP);m_setPic.SetBitmap(HBITMAP)bitmap.Detach();这是点击改变图片的代码,在VC中,ID号其实就是一些整数的标记,把ID存入一个整型数组中,实现没点击图片一次自动更换ID。这样可以实现动态改变图片。void CTcpseverDlg:OnMarkst() CWnd* wnd;CString str;wnd=GetDlgItem(IDC_MARKST);wnd-GetWindowText(str);wnd-ShowWindow(SW_HIDE);wnd=GetDlgItem(IDC_MARK);wnd-ShowWindow(SW_SHOW);wnd-SetWindowText(str);这是公布框的设计,其实在同一区域中摆放了两个控件,一个静态文本,一个编辑框。在设计的过程中对话框的初始化函数中对两个控件做了设置。将静态文本显示,编编辑框隐藏,并且设置静态文本中的内容和编辑框一样。这样当启动服务端后显示出来的就是静态文本了,这样比较美观。上面函数意思为当点击静态文本时,先获取文本中的内容,然后将其隐藏。再将编辑框显示出来,设置编辑框中的内容为开始获取的静态文本中内容。这样就可以和设置QQ心情一样的设置文本内容了。这样实现起来比较简单,方便,无需弹出一个对话框设置。设置好文本后,点击编辑框以外的任何地方,都可以把内容做更新。然后隐藏编辑框,显示静态文本。这样就要建立一个系统响应函数,对MouseClick消息做一个捕获。代码见下:void CTcpseverDlg:OnLButtonDown(UINT nFlags, CPoint point) CWnd* wnd;CString str;wnd=GetDlgItem(IDC_MARK);wnd-GetWindowText(str);wnd-ShowWindow(SW_HIDE);wnd=GetDlgItem(IDC_MARKST);wnd-ShowWindow(SW_SHOW);wnd-SetWindowText(str);CDialog:OnLButtonDown(nFlags, point);该函数当点击对话框时会被系统自动调用,函数将编辑框中上的内容设置到了静态文本中,然后显示静态文本,隐藏了编辑框。有一个问题就是在初始化函数中为什么要将静态文本的内容复制到编辑框中呢?这个必须要复制的,不然在启动程序后任何时候点击对话框都会将静态文本内容置空。这个可以去理解一下。下图显示了点击公告栏和图片后的情况:可以输入编辑了变了图片图9修改资料效果图在服务器中有个”符号。再次点击又会还原出来。图10精简视图 void CTcpseverDlg:OnShow() / TODO: Add your control notification handler code hereCString str;static CRect rectLarge;staticCRect rectSmall;CRect rectSeparate;if(rectLarge.IsRectNull()GetWindowRect(&rectLarge);GetDlgItem(IDC_SEPARATE)-GetWindowRect(&rectSeparate);rectSmall.top=rectLarge.top;rectSmall.left=rectLarge.left;rectSmall.bottom=rectSeparate.bottom;rectSmall.right=rectSeparate.right;if(GetDlgItemText(IDC_SHOW,str),str=nnnnnnnnnnnnnnn;SetDlgItemText(IDC_SHOW,str);SetWindowPos(NULL,0,0,rectSmall.Width(),rectSmall.Height(),SWP_NOMOVE|SWP_NOZORDER ); else str=nnnnnnnnnnnnnnnGetWindowRect(&rectSeparate);记录矩形区域信息。这样当点击按钮时自动识别要做怎样的处理。更具Z规则,设置某个视图在最上方,这样就成功的隐藏了要截取的区域。客户端的编程和服务端基本差不多,这里不做详细论述。值得注意的一点是,当服务器退出后,客户端断开连接要提示给用户。见下图:图11 提示断开连接在CSocket中前面也提到过,当某个套接字获取到消息与其连接的套接字断开连接后。系统会自动获取该消息,并有应用程序框架自动调用函数OnClose。在OnClose中可以设置一些代码,给出相关操作。服务端中,要派生出自己的csocket类,基类可以选择CAsyncSocket也可以是CSocket。在CAsyncSocket中定义了很多被框架自动调用的虚函数,编程时要重写这些函数。class csocket:public CSocketpublic:void OnReceive(int i)dlg-onrev(mynum);void OnAccept(int i)dlg-onac();void OnClose(int i)dlg-oncl();void setp(CTcpseverDlg * severdlg,int num) mynum=num; dlg=severdlg;private:CTcpseverDlg *dlg;int mynum;代码中OnReceive是当有消息到来时,框架调用该函数。OnAccept为当连接成功后调用。OnClose为当失去连接后系统自动调用。在这些函数中分别做了自己的事情。写入自己的函数。Onrev函数前面已经介绍过,这里介绍其他的几个关键函数。void CTcpseverDlg:onac()cslisten.Accept(csrev+csnum);csrevcsnum.setp(this,csnum);Onac函数作用是接受连接,并且让连接的套接字计数加一。void CTcpseverDlg:oncl()for(int i=1;iEnableWindow(false);elseGetDlgItem(IDC_CLEAN)-EnableWindow(true);CDialog:OnMouseMove(nFlags, point);该函数是设置“清空”按钮的状态的,当鼠标在对话框中移动时检测状态。当屏幕内容不为空时。清空按钮可以点解,否者则为灰色按钮。袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羈腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羈腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羈腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羈腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羈腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀

温馨提示

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

评论

0/150

提交评论