版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 VC+网络聊天软件摘要网络聊天室,其实质就是基于In ternet的一种网络聊天软件。它可以在网 络环境下进行实时的一对多或多对多的匿名交谈。网络聊天室软件的制作方法有 很多种,比如用MFC和Java等语言设计的就有很多,本次课程设计主要是利用 MFC所提供的各种控件尤其是 Win Sock控件,基于C/S模式,设计了一个网络聊 天室,圆满地实现在网络上实时聊天及多种人性化的辅助功能。关键词:Win Sock; C/S ; Visual C+ 6.0;聊天室目录 TOC o 1-5 h z HYPERLINK l bookmark6 o Current Document .查找资料 3 HY
2、PERLINK l bookmark8 o Current Document 1.1网络聊天程序的开发背景 3 HYPERLINK l bookmark10 o Current Document 1.2网络聊天程序的设计目标 3 HYPERLINK l bookmark12 o Current Document .相关知识 5 HYPERLINK l bookmark14 o Current Document WNSOCK介绍 5 HYPERLINK l bookmark16 o Current Document MFC的 CASYNCSOCK类和CSdcke类 62.3利用CSOcket进行
3、有连接的通信.8 HYPERLINK l bookmark20 o Current Document 2.4方案比较与选择9.详细设计143 .1聊天程序现15 TOC o 1-5 h z .程序流程图 624.1建立连接的流程图 624.2客户关闭或者注销时的程序流程图 63 HYPERLINK l bookmark48 o Current Document .程序运行结果 64 HYPERLINK l bookmark50 o Current Document 5.1客户端 64 HYPERLINK l bookmark52 o Current Document 5.2服务端 646、讨论
4、及进一步研究建议65 HYPERLINK l bookmark56 o Current Document 7、课程设计心得66 HYPERLINK l bookmark58 o Current Document 8、参考文献67查找资料当前是数字信息时代,网络时代,获得信息的渠道做种多样。而最为快速的 当然就是网络了。所以在课程设计动员之后,我们就马不停蹄的通过互联网收缩 有关网络编程和MFC编程的有关资料。找到大量资料之后,我们还有根据课程设 计的要求进行筛选资料,最后选定方案和确定实现方法。这也是我们第一阶段的 工作。1.1网络聊天程序的开发背景近年来,互连网发展日新月异,网络使空间的距离
5、不再成为人们沟通的障碍,世界各个角落的人们可以通过In ternet收发邮件、实时聊天、获取最新的资讯。 所以网络聊天的程序早已被前人所实现,而且实现的方法多种多样。因此,本次 课程设计,我们主要借鉴前人创立的方法和编程经验来制作一个C/S聊天室程序,通过制作该程序达到的学习网络 socket编程和使用MFC编程的相关知识。1.2网络聊天程序的设计目标本课题是设计一个网络聊天的程序,包括服务器端和客户端,主要功能为: 客户端部分:1、输入服务器端IP地址和端口号进行连接2、发送消息给服务器端并显示服务器端回传的消息3、在客户端增加历史聊天记录和当天聊天记录4、可以设置个性昵称、增添快捷表情、更
6、换个性图像和背景设计服务器端部分:1、立服务器端与客户端的连接请求2、接收所有用户发送的消息3、向所有在线用户群发消息4、在客户端增加历史聊天记录和当天聊天记录5、可以设置个性昵称、增添快捷表情、更换个性图像和背景设计通过这次课程设计,可以比较深入的了解和掌握 WINSOCK件基本属性、方 法和事件,熟悉VC+勺开发环境。理解网络聊天通信的概念,输控制协议(TCP 进行数据交流,初步掌握网络聊天通信程序的设计方法, 以及WINDOWS程的一 些方法。并能巩固和扩展之前学过的知识, 进行项目的设计开发训练,更好的适 应社会的需求。相关知识Win sock 介绍Windows Sockets 规范
7、以 U.C. Berkeley 大学 BSD UND中流行的 Socket 接 口为范例定义了一套 Micosoft Windows下网络编程接口。它不仅包含了人们所 熟悉的Berkeley Socket风格的库函数;也包含了一组针对Windows的扩展库函 数,以使程序员能充分地利用 Win dows消息驱动机制进行编程。Windows Sockets规范本意在于提供给应用程序开发者一套简单的API,并让各家网络软件供应商共同遵守。此外,在一个特定版本Win dows的基础上,Windows Sockets也定义了一个二进制接口( ABI),以此来保证应用WindowsSockets API
8、的应用程序能够在任何网络软件供应商的符合Windows Sockets协议的实现上工作。因此这份规范定义了应用程序开发者能够使用,并且网络软件 供应商能够实现的一套库函数调用和相关语义。遵守这套WindowsSockets规范的网络软件,我们称之为 WindowsSockets 兼容的,而 Windows Sockets兼容实现的提供者,我们称之为 Windows Sockets 提供者。一个网络软件供应商必须百分之百地实现 WindowsSockets规范才能做 到现 Windows Sockets 兼容。任何能够与WindowsSockets兼容实现协同工作的应用程序就被认为是具有Wind
9、ows Sockets接口。我们称这种应用程序为 Windows Sockets应用程序。Win dows Sockets规范定义并记录了如何使用 API与In ternet协议族(IPS,通常我们指的是TCP/IP)连接,尤其要指出的是所有的 WindowsSockets实现都支持流套接口和数据报套接口应用程序调用 Windows Sockets的API实现相互之间的通讯。WindowsSockets又利用下层的网络通讯协议功能和操作系统调用实现实际的通讯工作。MFC 的 CAsyncsocket 类和 CSocket 类构造一个CAsyncSocket对象并使用该对象创建基础 SOCKET
10、句柄。套接字的创建:遵循两阶段构造的MFC模式。例如:CAs yn cSocket sock;sock.Create( ); / Use the default parameters-或-CAsy ncSocket* pSocket = new CAsy ncSocket;i nt n Port = 27;pSocket- Create( nPort, SOCK_DGRAM );上面的第一个构造函数在堆栈上创建一个 CAsyncSocket对象,第二个构造 函数在堆上创建CAsyncSocket。上面的第一个Create调用使用默认参数创建 流式套接字,第二个Create调用创建具有指定端口和
11、地址的数据文报套接字。(任一个Create版本都可以和任一种构造方法一起使用。)Create的参数有:“端口” :短整型。对于服务器套接字,必须指定端口。对于客户端套接字,通常接受此参数的 默认值,该值允许 Windows Sockets选择端口。套接字类型:SOCK_STREA(默认值)或SOCK_DGRAM套接字“地址”,如“ ”或“ ”。该地址为网 络上的网际协议(IP)地址。很可能要始终依赖此参数的默认值。如果套接字是客户端,则使用CAs yn cSocket:Co nnect 将此套接字对象 连接到服务器套接字。如果套接字是服务器,则将套接字设置为开始侦听(使 用CAsy ncSoc
12、ket:Liste n)来自客户端的连接尝试。接收到连接请求时,用CAsy ncSocket:Accept 接受该请求。接受连接后,可以执行验证密码等任务。注意Accept成员函数采用对新的空 CSocket对象的引用作为它的参数。 在调用Accept之前,必须构造该对象。如果此套接字对象超出范围,则连接关 闭。不要对这个新套接字对象调用Create 。通过调用 CAsyncSocket对象的圭寸装 Windows Sockets API 函数的成员 函数,与其他套接字进行通信。如果在堆栈上创建了套接字对象,当包含函数超出范围时将调用此对象 的析构函数。如果使用new运算符在堆上创建了套接字对
13、象,则您必须负责使用delete 运算符销毁此对象。析构函数在销毁对象之前调用对象的 Close成 员函数。利用CSocket进行有连接的通信微软的MFC把复杂的Win Sock API函数封装到类里,这使得编写网络应用程 序更容易。CAsy ncSocket类逐个圭寸装了 Win Sock API,为高级网络程序员提供 了更加有力而灵活的方法。这个类基于程序员了解网络通讯的假设,目的是为了在MFC中使用Win Sock,程序员有责任处理诸如阻塞、字节顺序和在Un icode与MBCS间转换字符的任务。为了给程序员提供更方便的接口以自动处理这些任务,MFC合出了 CSocket类,这个类是由C
14、AsyncSocket类继承下来的,它提供了比CAsyncSocket更高层 的 Win Sock API 接口。CSocket 类和 CSocketFile 类可以与 CArchive 类一起合 作来管理发送和接收的数据,这使管理数据收发更加便利。CSocket对象提供阻塞模式,这对于CArchive的同步操作是至关重要的。阻塞函数(如Receive。、Send()、ReceiveFrom()、SendTo()和 Accept()直到操作完成后才返回控制 权。因此如果需要低层控制和高效率,就使用Casy ncSock类;如果需要方便,则可使用CSocket类。由于我们对网络底层的了解比较浅薄
15、,所以这次课程设计我们选择了采用 CSocket类来编程实现。下面主要针对这种方法进行讲述。使用CSocket对象涉及CArchive和CSocketFile 类对象。以下介绍的针对 字节流型(即基于TCP/IP协议)套接字的操作步骤中,只有第 3和第4步对于客 户端和服务端操作是不同的,其他步骤都相同。构造一个CSocket对象。使用这个对象的Create ()成员函数产生一个socket对象。在客户端程序中,除非需要数据报套接字,Create ()函数一般情况下应该使用默认参数。 而对于服务端程序,必须在调用Create时指定一个端口。需要注意的是,CArchive类对象不能与数据报(UD
16、P套接字一起工作,因此对于数据报套接字, CAsyncSocket和CSocket的使用方法是一样的。如果是客户端套接字,则调用 CAsyncSocket工Connect ()函数与服务 端套接字连接;如果是服务端套接字,则调用 CAsyncSocket工Listen ()开始 监听来自客户端的连接请求,收到连接请求后,调用 CAsyncSocket工Accept () 函数接受请求,建立连接。请注意 Accept ()成员函数需要一个新的并且为空 的CSocket对象作为它的参数。重载CSocket类的部分函数。客户端需要重载 On Receive nt i) OnClose(int i);
17、服务器端需要重载 OnAccept(int i) 、OnClose(int i) On Receive(i nt i) ;调用Send()的方法来发送数据,调用 Receive ()的方法来接受数据。调用Close()方法来关闭套接字以终止通信。通讯完毕后,销毁CSocket对象。2.4方案比较与选择系统分析与设计1、系统构架方式如下图所示:喜户总肺-1= 服务器OCT信息交互J1 口CChentSccket-匚 ServerSocket*-TCP/TP1TCP/IP通信底层4通倍底层设计出一个完整的网络聊天程序,使之实现以上基本要求。1、服务端需要完成的三件事在特定端口等待连接请求,并需要维
18、护一个客户连接表,已记录所 有成功连接。及时接受消息,然后转发到客户连接。3)监控连接状态,客户离开或故障时从列表中删除相应表项,并及时 更新连接表。2、客户端需要完成的三件事1)建立与维护服务器的连接,并随时监测连接状态。2)把用户输入的信息及时发送到服务端,同时准备好接受,并显示信 息。3)在用户退出时关闭连接。程序方案比较:方案一:基于TCP的socket编程TCP(Transmission Control Protocol ,传输控制协议)是基于连接的协议, 也就是说,在正式收发数据前,必须和对方建立可靠的连接。服务器端程序流程如下:1)创建套接字(socket);2)将套接字绑定到一
19、个本地地址和端口上(bind);3)将套接字设为监听模式,准备接受客户请求(listen );4)等待客户请求到来;当请求到来后,接受连接请求,返回一个新的对应 于此次连接的套接字(accept);5)用返回的套接字和客户端进行通信(send/recv);6)返回,等待另一客户请求;7)关闭套接字;客户端程序流程如下:1)创建套接字(socket);2)向服务器发出连接请求(connect);3)和服务器端进行通信(send/recv);4)关闭套接字。在服务器端,当调用accept函数时,程序就会等待,等待客户调用connect 函数发出连接请求,然后服务器端接受该请求,于是双方就建立了连接
20、。之后,服务器端和客户端就可以利用 send和recv函数进行通信了。因为服务器需要接 受客户端的请求,所以必须告诉本地主机它打算在哪个IP地址和哪个端口上等待客户要求,因此必须调用bind函数来实现这一功能。而对客户端来说,当它 发起连接请求,服务器端接受请求后,在服务端就保存了改客户端的IP地址和端口的信息。这样,对服务器端来说,一旦建立连接之后,实际上它已经保存了 客户端的IP地址和端口号的信息,就可以利用所返回的套接字调用send/recv函数与客户端进行通信。程序流程图如下:TCP服箔塢SacketOBindQ_方案二:基于UDP(面向无连接)的socket程序UDP( User D
21、ata Protocol ,用户数据报协议)是与 TCP相对应的协议。它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去。UDP 适用于一次只传送少量数据、对可靠性要求不高的应用环境服务器端也叫接收端,对于基于 UDP(面向无连接)的套接字编程来说,它的服务器端和客户端这种概念不是很强化, 我们也可以把服务器端,即先启动的 一端称为接收端,发送数据的一端称为发送端,也称为客户端。服务端程序编写流程如下:1)创建套接字(socket);2)将套接字绑定到一个本地地址和端口上(bind);3)等待接受数据(recvfrom);4)关闭套接字。虽然面向无连接的socket编程无须建
22、立连接,但是为了完成这次通信,对 于接受端来说,它必须先启动以接受客户端发送的数据,因此接收端必须告诉主机它是在哪个地址和端口上等待数据的到来,接收端(服务器端)必须调用bind函数将套接字绑定到一个本地地址和端口上。客户端程序编写流程如下:1)创建套接字(socket);2)向服务器发送数据(sengto);3)关闭套接字。在UDP的套接字编程时,利用的是sendto和recvfrom这两个函数实现数据 的发送和接收,而基于TCP的套接字编程时,发送数据是调用 send函数,接受 数据调用recv函数。程序流程图如下:SocketO1FSendto()FRecviromOTClase()UD
23、P容户UDP服务器一貫阴塞到收到 来自吝户的教帼1F一教据価答)SendtoO1 方案比较结果TCP与UDP最基本的区别在于基于连接与无连接,相比之下,第一种方案对 系统的要求以及数据量都比较大,但是保证数据的正确性与数据顺序,在传输大 量数据的时候具有更高的可靠性。至于第二种方案的优点在于传输的速度快, 程 序结构精简。总的来说,我认为TCPtt、议更能满足目前各行业对远程数据传输的要求,它提供更稳定更便利的传输通道,满足了对安全性的要求以及远程数据传输的要求。所以我们小组选择方案一。详细设计我们利用MFC提供的CSocket类来编程实现一个网络聊天室。那么就需要一个聊天的服 务器(即是服务
24、端),它可以和很多客户端进行通信,从而把来自不同的客户的聊天信息转 交到所有其他的客户端。当然也需要用户界面(客户端)。这样就形成了一个采用Clie nt/Server结构的并可以多人同时在线的聊天室。同时,服务器端应该有一定的管理功能,如手动/自动响应申请、设置服务器名称和服务器端口、在线名单统计、单独断开某人 连接以及保持聊天记录等功能。对于客户端,因为是面向用户, 所以外观和功能都应有更高的要求。实现诸如:手动输入IP和用户名、头像切换、心情书写、表情输入、软件皮肤切换、注销登录、保存聊天记录以及伸缩界面等功能。下面详细介绍各项功能是如何实现的。3.1聊天程序的实现(1)首先启动 Vis
25、ual C+6.0,利用 MFOAppWizardEXE建立一个新的 MFC 工程,工程名为chat,在MFC AppWizard Stepl的时候选择 Dialog based 即基 于对话框,在Step4时勾选 Windows Sockets选项(如图表0-2),其他默认值 下一步。图表0-1图表0-2(2)客户端的界面如图图表0-3所示。其中包含文档编辑框、按键控件、静态 文本控件组成。左半边由上自下分别是:头像、昵称、当天聊天信息显示、12个表情按钮、消息输入框和发送按钮。右半边有历史记录显示框、历史记录显示 按钮。图表0-3软件界面图表0-4控件类型及各自ID标题控件类型控件ID昵称
26、:StaticIDC_STATIC服务器IP:StaticIDC_STATIC端口号(默认5000):StaticIDC_STATIC头像ButtonIDC_TouXia ng表情1ButtonIDC_BQ1表情2ButtonIDC_BQ2表情3ButtonIDC_BQ3表情4ButtonIDC_BQ4表情5ButtonIDC_BQ5表情6ButtonIDC_BQ6表情7ButtonIDC_BQ7表情8ButtonIDC_BQ8表情9ButtonIDC_BQ9表情10ButtonIDC_BQ10表情11ButtonIDC_BQ11表情12ButtonIDC_BQ12发送ButtonIDC_SE
27、ND连接ButtonIDC_CONNECT建立ButtonIDC_SETSERVER聊天纪录ButtonIDC_LiaoTia nJiLu聊天信息显示EditIDC_SHOWTEXT信息输入EditIDC_INPUTTEXT昵称输入EditIDC_NAME服务器IP输入EditIDC_SERVERIP端口输入EditIDC PORT聊天记录显示EditIDC_ShowHistory聊天程序总共有 6个类。其中,CChatApp和CAboutDIg由AppWizard实现;另 外,CServerSocket和CClientSocket分别负责服务端和客户端的网络通信功 能;CChatDIg为程序
28、的主控类,主界面、通信方式及程序逻辑均由该类实现, 它继承自CDialog类;CMessgage是对消息的封装。CCIientSocket通过相应的On Receive消息来接收数据,响应On Close消息来断开对话的处 理,实现以CArchive对数据进行的串行化。类定义代码如下:#i ncludeMessg.h /命令目标class CChatDlg;class CClie ntSocket:public CSocketpublic:CArchive *m_aSessio nln;CArchive *m_aSessio nO ut;CSocketFile *m_sfSocketFile;
29、CChatDlg *m_dlg;bool m_bl nit; /是否进行了初始化bool m_bClose; / 连接是否关闭public:void In it(CChatDlg *dlg);BOOL Sen dMessage(CMessg *msg);void CloseSocket();public:static int GetLocalHostName(CString &sHostName); / 获得本地计算机名称static int GetlpAddress(c onst CStri ng &sHostName,CString &slpAddress); /获得本地 IPstatic
30、 int GetIpAddress(co nst CStri ng & sHostName,BYTE &f0,BYTE& f1,BYTE & f2,BYTE & f3);/ 获得本地IPstatic CStri ng ErrorReas on (i nt tag);public:virtual void On Receive(i nt n ErrorCode);virtual void On Close(i nt n ErrorCode);public:CClie ntSocket();virtual CClie ntSocket();protected:;CClie ntSocket.CPP
31、中的代码:#in clude stdafx.h#in clude chat.h#i nclude Clie ntSocket.h#in cludeChatDlg.h/ CClie ntSocketCClie ntSocket:CCIie ntSocket()m_aSessio nln=NULL;m_aSessio nOut=NULL;m_sfSocketFile=NULL;m_bl ni t=false;m_bClose=false;CClie ntSocket:CCIie ntSocket()if(m_aSessio nln)delete m_aSessi onln;if(m_aSessio
32、 nO ut)delete m_aSessi onO ut;if(m_sfSocketFile)delete m_sfSocketFile;/Clie ntSocket成员函数void CClie ntSocket: On Receive(i nt n ErrorCode)CSocket: On Receive( nErrorCode); /On Receive()函数的实现doCMessg temp;temp.Serialize(*m_aSessio nln);m_dlg-m_sMsgList+=temp.m_strText+rn;m_dlg-m_tmpMsgList=temp.m_strT
33、ext+rn;m_dlg-SetDlgltemText(IDC_SHOWTEXT,m_dlg-m_sMsgList);FILE* fp;fp = fope n(chat note.txt,a+);fputs(m_dlg-m_tmpMsgList,fp);fclose(fp);m_dlg-SetDlgltemText(IDC_SHOWTEXT,m_dlg-m_sMsgList);int linenu m=(CEdit*)(m_dlg-GetDlgltem(IDC_SHOWTEXT)-GetLi neCou nt(); (CEdit*)(m_dlg-GetDlgltem(IDC_SHOWTEXT)
34、-L in eScroll(li nen um); if(!m_dlg-m_bClie nt)for(POSITIONpos=m_dlg-m_co nn ectio nList.GetHeadPositio n();pos!=NULL;)CClie ntSocket *t=(CClie ntSocket*)m_dlg-m_c onn ectio nList.GetNext(pos);if(t-m_hSocket!=this-m_hSocket)t-Se ndMessage(&temp);while(!m_aSessio nln-lsBufferEmpty();void CClie ntSock
35、et:l ni t(CChatDlg *dlg)m_sfSocketFile=new CSocketFile(this);m_aSessi onln=new CArchive(m_sfSocketFile,CArchive:load); m_aSessi onOut=new CArchive(m_sfSocketFile,CArchive:store); m_bClose=false;this-m_dlg=dlg;/*SendMessage()函数的实现*主要功能:*将信息串行化*/BOOL CClie ntSocket:Se ndMessage(CMessg *msg)if(m_aSessi
36、o nOut!=NULL)msg-Serialize(*m_aSessio nO ut);m_aSessio nOut-Flush();return TRUE;elsem_bClose=true; /对方关闭了连接CloseSocket();m_dlg-CloseSessio nSocket();return FALSE;/*CloseSocket()函数的实现*主要功能:*关闭套接字的连接*/void CClie ntSocket:CloseSocket()if(m_aSessio nln)delete m_aSessi onln;m_aSessi onln=NULL;if(m_aSessi
37、o nO ut)delete m_aSessi onO ut;m_aSessio nOut=NULL;if(m_sfSocketFile)delete m_sfSocketFile; m_sfSocketFile=NULL;Close();m_bl ni t=false;m_bClose=true;/*OnClose()函数的实现*主要功能:*关闭套接字的连接*/void CClie ntSocket: On Close( int n ErrorCode)m_bClose=true;CloseSocket();m_dlg-CloseSessio nSocket();CSocket: On Cl
38、ose( nErrorCode);/*GetLocalHostName()函数的实现*主要功能:*获得本地计算机的名称*/int CClie ntSocket:GetLocalHostName(CStri ng &sHostName)char szHostName256;int n RetCode;n RetCode=gethost name(szHostName,sizeof(szHostName);if(n RetCode!=0) /产生错误sHostName=_T( 没有取得);return GetLastError();sHostName=szHostName;return 0;/*G
39、etlpAddress()函数的实现*主要功能:*取得本地IP地址*/int CClie ntSocket:GetlpAddress(co nstCStri ng & sHostName,CStri ng& sIpAddress)/ 获得本地IPstruct hoste nt FAR *lpHostE nt=gethostb yn ame(sHostName);if(lpHostE nt=NULL) /产生错误sIpAddress=_T();return GetLastError();LPSTR lpAddr=lpHostE nt-h_addr_listO;if(lpAddr)struct i
40、n _addr in Addr;memmove(&in Addr,lpAddr,4);sIpAddress=i net_ntoa(i nAddr); /转换为标准格式if(sIpAddresssEmpty()sIpAddress=_T(没有取得);return 0;/* GetIpAddress () 函数的实现*主要功能:*获得本地IP地址*/int CClie ntSocket:GetlpAddress(co nst CStri ng & sHostName,BYTE &f0,BYTE & f1,BYTE & f2,BYTE & f3)获得IP地址struct hoste nt FAR *
41、lpHostE nt=gethostb yn ame(sHostName);if(lpHostE nt=NULL) /产生错误f0=f1=f2=f3=0;return GetLastError();LPSTR lpAddr=lpHostEnt-h_addr_list0; /获取 IPif(lpAddr)struct in _addr in Addr;memmove(&in Addr,lpAddr,4);f0=i nAddr.S_u n.S_un_b.s_b1;f1=i nAddr.S_u n.S_un_b.s_b2;f2=i nAddr.S_u n.S_un_b.s_b3;f3=i nAddr
42、.S_u n.S_un_b.s_b4;return 0;CStri ng CClie ntSocket:ErrorReaso n(i nt tag) /错误信息的宏定义CStri ng result;switch(tag)case WSANOTINITIALISED:result=A successful AfxSocket Init must occur before usingthis API.;break;case WSAENETDOWN:result=The n etwork subsystem failed;break;case WSAEADDRINUSE:result=The sp
43、ecified address is already in use;break;case WSAEINPROGRESS:result=A block ing Win dows Socket call is in progress;break;case WSAEADDRNOTAVAIL:result=The specified address is not available from the local mach in e;break;case WSAEAFNOSUPPORT:result=Address in the specified family cannot be used witht
44、his socket;break;case WSAECONNREFUSED:result=The attempt to connect eas rejected;break;case WSAEDESTADDRREQ:result=A dest in ati on address is requireed;break;case WSAEFAULT:result=The n SockAddrLe n argueme nt is in correct;break;case WSAEINVAL:result=I nvalid host address;break;case WSAEISCONN:res
45、ult=The socket is already conn ected;break;case WSAEMFILE:result=No more file descripti ons are available;break;case WSAENETUNREACH:result=Thenetwork cannot be reached from this host at thistime;break;case WSAENOBUFS:result=No buffer space is available.The socket cannot beconn ected;break;case WSAEN
46、OTSOCK:result=The descriptor is not a socket;break;case WSAETIMEDOUT:result=Attemptto connect timed out without establishing aconn ecti on;break;case WSAEWOULDBLOCK:result=Thesocket is marked as non block ing and theconnnection cannot be completed immediately;break;default:result=unknown error;retur
47、n result;CServerSocketCServerSocket主要功能是实现OnAccept()消息,负责监听服务窗口,是一 个服务socket oCServerSocket.h 的代码如下:/ CServerSocket comma nd targetclass CChatDIg;class CServerSocket: public CSocketpublic:CServerSocket();virtual CServerSocket();CChatDlg *m_dlg;UINT m_uPort;BOOL In it(UINT port,CChatDlg *dlg);public:
48、virtual void On Accept(i nt n ErrorCode); /用于响应 On Accept 消息的函数;CServerSocket.CPP 的代码如下:#in clude stdafx.h#in clude chat.h#in clude ServerSocket.h#in clude ChatDlg.h/ CServerSocketCServerSocket:CServerSocket()CServerSocket:CServerSocket()/CServerSocket 成员函数BOOL CServerSocket:I ni t(UINT port,CChatDl
49、g *dlg)m_uPort=port;m_dlg=dlg;if(Create(m_uPort)=FALSE)AfxMessageBox(_T(Server Socket Create Error);return FALSE;if(this-Liste n()=FALSE)AfxMessageBox(Server Liste n Error);return FALSE;m_dlg-SetDlgltemText(IDC_SHOWTEXT,ServerrHas Bee n Set OK!);return TRUE;void CServerSocket: On Accept(i nt n Error
50、Code)m_dlg-ProcessPe ndi ngAccept();CSocket:O nAccept( nErrorCode);CMessgCMessg类主要作用是实现信息的串行化,方便信息的传输。CMessg.h代码如下:#pragma onceclass CMessg:public CObject /命令目标protected:DECLARE_DYNCREATE(CMessg)public:CMessg();public:CStri ng m_strText;public:void Ini t();public:virtual CMessg();virtual void Serial
51、ize(CArchive &ar); /实行串行化#if def_DEBUGvirtual void AssertValid() con st;virtual void Dump(CDumpC on text &dc) con st;#en dif;CMessg.CPp弋码如下:#in elude stdafx.h#in elude chat.h#in elude Messg.h/ Con struetio n/Destructio nIMPLEMENT_DYNCREATE(CMessg,CObject)CMessg:CMessg()In it();CMessg:CMessg()/CMessg
52、成员函数void CMessg:I ni t()m_strText = _T();/CMsg serializati onvoid CMessg:Serialize(CArchive &ar)if (ar.IsStori ng()arLoadlco n(IDR_MAINFRAME);/标m_sShowStri ng=_T();m_uPort=5000;m_hlco n=AfxGetApp()-LoadIco n( IDR_MAINFRAME);void CChatDlg:DoDataExcha nge(CDataExcha nge *pDX) CDialog:DoDataExcha nge(p
53、DX);DDX_Text(pDX,IDC_INPUTTEXT,m_s In putText);DDX_Text(pDX,IDC_NAME ,n ame);DDX_Text(pDX,IDC_SHOWTEXT,m_sShowStri ng);DDX_Text(pDX,IDC_PORT,m_uPort);/DDV_Mi nMaxUI nt(pDX,m_uPort,1024,100000);BEGIN_MESSAGE_MAP(CChatDlg,CDialog)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_EN_UPDATE(IDC_INP
54、UTTEXT, Onln putText)/AFX_MSG_MAPON_BN_CLICKED(IDC_CONNECT, OnBn ClickedCo nnect)ON_BN_CLICKED(IDC_SETSERVER, OnBn ClickedSetserver)ON_BN_CLICKED(IDC_SEND, OnBn ClickedButt on1)AFX_MSG_MAP(CMyclie ntDIg)ON_BN_CLICKED(IDC_BUTTON2, On Butt on2)ON_WM_CLOSE()ON_WM_CTLCOLOR()/改变对话框的背景色ON_BN_CLICKED(IDC_B
55、Q1, On Bq1)ON_BN_CLICKED(IDC_BQ2, On Bq2)ON_BN_CLICKED(IDC_BQ3, On Bq3)ON_BN_CLICKED(IDC_BQ4, On Bq4)ON_BN_CLICKED(IDC_BQ5, On Bq5)ON_BN_CLICKED(IDC_BQ6, On Bq6)ON_BN_CLICKED(IDC_BQ7, On Bq7)ON_BN_CLICKED(IDC_BQ8, On Bq8)ON_BN_CLICKED(IDC_BQ9, On Bq9)ON_BN_CLICKED(IDC_BQ1O, On Bq10)ON_BN_CLICKED(IDC
56、_BQ11, On Bq11)ON_BN_CLICKED(IDC_BQ12, On Bq12)ON_BN_CLICKED(IDC_TouXia ng. On TouXia ng)ON_BN_CLICKED(IDC_LiaoTia nJiLu, On LiaoTia nJiLu)/AFX_MSG_MAPEND_MESSAGE_MAP()/ CMyclientDIg 类的改变对话框的背景色的函数HBRUSH CChatDlg:O nCtlColor(CDC *pDC, CWnd *pWnd, UINT n CtICoIor)HBRUSH hbr = CDialog:O nCtlColor(pDC,
57、 pWnd, n CtlColor);pDC-SetBkColor(RGB(64,36,33);pDC-SetTextColor(RGB(165,165,165);/字体设为灰白色hbr = CreateSolidBrush(RGB(64,36,33);return hbr;BOOL CChatDlg: On I ni tDialog()CDialog:O nlni tDialog();ASSERT(IDM_ABOUTBOX &0 xFFFO)=IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX Appe ndMe nu(MF_SEPARATOR);pSysMe nu-Appe
58、 ndMe nu(MF_STRING,IDM_ABOUTBOX,strAboutMe nu);Setlco n(m_hlco n,TRUE);Setlco n(m_hlco n,FALSE); if(AfxSocket In it(NULL)=0) AfxMessageBox(CSocket Inital Error);/获取IP控件的指sCWnd *cw=GetDlgltem(IDC_SEND);针cw-E nableWi ndow(true);/让输入有效cw=GetDlgltem(IDC_BQ1);/获取IP控件的指针cw-E nableWi ndow(true);/让输入有效cw=Ge
59、tDlgltem(IDC_BQ2);/获取IP控件的指针cw-E nableWi ndow(true);/让输入有效cw=GetDlgltem(IDC_BQ3);/获取IP控件的指针cw-E nableWi ndow(true);/让输入有效cw=GetDlgltem(IDC_BQ4);/获取IP控件的指针cw-E nableWi ndow(true);/让输入有效cw=GetDlgltem(IDC_BQ5);/获取IP控件的指针cw-E nableWi ndow(true);/让输入有效cw=GetDlgltem(IDC_BQ6);/获取IP控件的指针cw-E nableWi ndow(tr
60、ue);/让输入有效cw=GetDlgltem(IDC_BQ7);/获取IP控件的指针cw-E nableWi ndow(true);/让输入有效cw=GetDlgltem(IDC_BQ8);/获取IP控件的指针cw-E nableWi ndow(true);/让输入有效cw=GetDlgltem(IDC_BQ9);/获取IP控件的指针cw-E nableWi ndow(true);/让输入有效cw=GetDlgltem(IDC_BQ10);/获取IP控件的指针cw-E nableWi ndow(true);/让输入有效cw=GetDlgltem(IDC_BQ11);/获取IP控件的指针cw-
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 电子设备交易合同案例
- 悔过自责重建信任
- 珍爱和平和谐相处
- 香蕉采购合同示例
- 版企业借款合同模式
- 地毯招标废标原因文件
- 建筑施工土方填筑招标
- 户外垃圾桶设计招标
- 电子招投标操作技巧
- 大楼租赁合同书
- 企业数字化转型对组织韧性的影响研究
- GB/T 24977-2024卫浴家具通用技术条件
- 小学四年级上册道德与法治期末测试卷(完整版)
- 2024年长沙电力职业技术学院单招职业技能测试题库附答案
- ICP备案网站建设方案书
- 中外文化比较专题智慧树知到期末考试答案2024年
- 装修设计招标评标办法
- 初中英语翻译专题训练100题含答案
- 基于机器学习的查询优化
- 2024届浙江省义乌市稠州中学数学八年级下册期末学业质量监测试题含解析
- 葡萄酒鉴赏智慧树知到期末考试答案2024年
评论
0/150
提交评论