欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    《VC++程序设计》第9讲_WINSOCK网络编程.ppt

    • 资源ID:2241269       资源大小:262.50KB        全文页数:80页
    • 资源格式: PPT        下载积分:8金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要8金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    《VC++程序设计》第9讲_WINSOCK网络编程.ppt

    第9讲 WindSock网络编程,主讲教师:李璟e-mail:手机:13806419626,第9讲 WinSock网络编程,9.1网络通信基础9.2WinSock概述9.3MFC WinSock编程9.4MFC WinSock网络编程实例,9.1网络通信基础,网络编程是指:应用程序需要与网络中其它系统上的应用程序之间进行通信。以下介绍一下有关网络通信的基础知识。,计算机网络,计算机网络是相互连接的独立自主的计算机的集合,最简单的网络形式由两台计算机组成。,两台计算机通过网络进行通信,A,B,192.168.0.118,192.168.0.10,协议,协议,端口号,端口号,IP地址,IP网络中每台主机都必须有一个惟一的IP地址;IP地址是一个逻辑地址;因特网上的IP地址具有全球唯一性;32位,4个字节,常用点分十进制的格式表示,例如:192.168.0.16,协议,为进行网络中的数据交换(通信)而建立的规则、标准或约定。(=语义+语法+规则)不同层具有各自不同的协议。,网络的状况,多种通信媒介有线、无线不同种类的设备通用、专用不同的操作系统Unix、Windows 不同的应用环境固定、移动 它们互相交织,形成了非常复杂的系统应用环境。,网络异质性问题的解决,网络体系结构就是使这些用不同媒介连接起来的不同设备和网络系统在不同的应用环境下实现互操作性,并满足各种业务需求的一种粘合剂,它营造了一种“生存空间”任何厂商的任何产品、以及任何技术只要遵守这个空间的行为规则,就能够在其中生存并发展。网络体系结构解决异质性问题采用的是分层方法 把复杂的网络互联问题划分为若干个较小的、单一的问题,在不同层上予以解决。就像我们在编程时把问题分解为很多小的模块来解决一样。,ISO/OSI七层参考模型,OSI(Open System Interconnection)参考模型将网络的不同功能划分为7层。,应用层,表示层,物理层,会话层,传输层,网络层,数据链路层,处理网络应用,数据表示,主机间通信,端到端的连接,寻址和最短路径,介质访问(接入),二进制传输,ISO/OSI七层参考模型,通信实体的对等层之间不允许直接通信。各层之间是严格单向依赖。上层使用下层提供的服务 Service user;下层向上层提供服务 Service provider。,对等通信示例,“你好”,“Hello”,传真,中国教师,翻译,秘书,“Hallo”,“Hello”,传真,德国教师,翻译,秘书,对交谈内容的共识,用英语对话,使用传真通信,物理通信线路,对等层通信的实质,对等层实体之间虚拟通信。下层向上层提供服务,实际通信在最底层完成。,OSI各层所使用的协议,应用层:远程登录协议Telnet、文件传输协议FTP、超文本传输协议HTTP、域名服务DNS、简单邮件传输协议SMTP、邮局协议POP3等。传输层:传输控制协议TCP、用户数据报协议UDP。TCP:面向连接的可靠的传输协议。UDP:是无连接的,不可靠的传输协议。网络层:网际协议IP、Internet互联网控制报文协议ICMP、Internet组管理协议IGMP。,数据封装,一台计算机要发送数据到另一台计算机,数据首先必须打包,打包的过程称为封装。封装就是在数据前面加上特定的协议头部。,数据,数据,协议头,数据封装,OSI参考模型中,对等层协议之间交换的信息单元统称为协议数据单元(PDU,Protocol Data Unit)。OSI参考模型中每一层都要依靠下一层提供的服务。为了提供服务,下层把上层的PDU作为本层的数据封装,然后加入本层的头部(和尾部)。头部中含有完成数据传输所需的控制信息。这样,数据自上而下递交的过程实际上就是不断封装的过程。到达目的地后自下而上递交的过程就是不断拆封的过程。由此可知,在物理线路上传输的数据,其外面实际上被包封了多层“信封”。但是,某一层只能识别由对等层封装的“信封”,而对于被封装在“信封”内部的数据仅仅是拆封后将其提交给上层,本层不作任何处理。,TCP/IP模型,TCP/IP起源于美国国防部高级研究规划署(DARPA)的一项研究计划实现若干台主机的相互通信。现在TCP/IP已成为Internet上通信的工业标准。TCP/IP模型包括4个层次:应用层传输层网络层网络接口,TCP/IP与OSI参考模型的对应关系,7654321,OSI参考模型,TCP/IP模型,端口,按照OSI七层模型的描述,传输层提供进程(应用程序)通信的能力。为 了标识通信实体中进行通信的进程(应用程序),TCP/IP协议提出了协议端口(protocol port,简称端口)的概念。端口是一种抽象的软件结构(包括一些数据结构和I/O缓冲区)。应用程序通过系统调用与某端口建立连接(binding)后,传输层传给该端口的数据都被相应的进程所接收,相应进程发给传输层的数据都通过该端口输出。端口用一个整数型标识符来表示,即端口号。端口号跟协议相关,TCP/IP传输层的两个协议TCP和UDP是完全独立的两个软件模块,因此各自的端口号也相互独立。端口使用一个16位的数字来表示,它的范围是065535,1024以下的端口号保留给预定义的服务。例如:http使用80端口。,9.2WinSock概述,Windows Sock(Windows套接字,简称WinSock)是微软根据UNIX操作系统中流行的Berkeley(伯克利)套接字规范,而实现的一套Microsoft Windows下的网络编程接口。,在ISO的OSI网络七层协议中,WinSock主要负责控制数据的输入和输出,也就是传输层和网络层。它屏蔽了数据链路层和物理层,给Windows下的网络编程带来了巨大的变化。,Windows Sockets通信机制,Windows Sockets通信的基础是套接字(Socket)。Socket就是在应用程序之间用于读(接收信息)或写(发送信息)的一个网络对象。,客户机服务器模式,在TCP/IP网络应用中,通信的两个进程间相互作用的主要模式是客户机/服务器模式(client/server),即客户向服务器提出请求,服务器接收到请求后,提供相应的服务。,客户机服务器模式,客户机/服务器模式在操作过程中采取的是主动请求的方式。首先服务器方要先启动,并根据请求提供相应的服务:打开一个通信通道并告知本地主机,它愿意在某一地址和端口上接收客户请求。等待客户请求到达该端口。接收到服务请求,处理该请求并发送应答信号,同时要激活一个新的进程(或线程)来处理这个客户请求。新进程(或线程)处理此客户请求,并不需要对其它请求作出应答。服务完成后,关闭此新进程与客户的通信链路,并终止。返回第二步,等待另一客户请求。关闭服务器。客户方:打开一个通信通道,并连接到服务器所在主机的特定端口。向服务器发服务请求报文,等待并接收应答;继续提出请求。请求结束后关闭通信通道并终止。,基于TCP(面向连接)的socket编程,服务器端程序:1、创建套接字(socket)。2、将套接字绑定到一个本地地址和端口上(bind)。3、将套接字设为监听模式,准备接收客户请求(listen)。4、等待客户请求到来;当请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept)。5、用返回的套接字和客户端进行通信(send/receive)。6、返回第4步,等待另一客户请求。7、关闭套接字。,客户端程序:1、创建套接字(socket)。2、向服务器发出连接请求(connect)。3、和服务器端进行通信(send/receive)。4、关闭套接字。,9.3MFC WinSock编程,MFC为套接字提供了相应的类CAsynSocket和CSocket,它们封装了Windows Sockets的API,从而程序员可以用面向对象的方法调用Socket。基本类CAsySocket提供了全面的事件驱动的Socket通信能力,用户可以创建自己派生的Socket类,来捕获和响应每个事件。CSocket类是CAsySocket的派生类,封装和简化了基本类的某些功能。,9.3MFC WinSock编程,9.3.1MFC WinSock类9.3.2WinSock初始化9.3.3Socket的创建、连接与关闭9.3.4数据的发送与接收,9.3.1MFC WinSock类,CAsyncSocket类是在一个很低的层次上封装了Windows Sockets API,只提供了一些基本的操作。CSocket则是由CAsyncSocket派生,是Windows Sockets API的高层抽象,提供了更高层次的功能。通过MFC WinSock类,开发者可以不考虑网络字节顺序和忽略掉更多的通信细节。,CAsyncSocket类主要成员函数及其功能(一),构造函数CAsyncSocket:构造CAsyncSocket对象。Create:创建套接字。属性:Attach:对CAsyncSocket对象附加套接字句柄。Detach:从CAsyncSocket对象除去套接字句柄。FromHandle:返回CAsyncSocket对象的指针,给出套接字句柄。GetLastError:获得上一次运行失败的状态。GetPeerName:获得与套接字连接的对等套接字的地址。GetSockName:获得套接字的本地名。GetSockOpt:获得套接字选项。SetSockOpt:设置套接字选项。,CAsyncSocket类主要成员函数及其功能(二),操作函数:Accept:接受套接字上的连接请求。CAsyncSelect:请求对于套接字的事件通知。Bind:与套接字有关的本地地址。Close:关闭套接字。Connect:发出连接请求。IOCtr:控制套接字模式。Listen:建立套接字,监听即将到来的连接请求。Receive:从套接字上接收数据。Send:给连接套接字发送数据。SendTo:给特定目的地发送数据。ShutDown:使套接字上的send或receive调用无效。,CAsyncSocket类主要成员函数及其功能(三),可重载函数:OnAccept:通知侦听套接字,通过Accept接受连接请求。OnClose:通知套接字,关闭对它的套接字连接。OnConnect:通知连接套接字,连接尝试已经完成,无论成功或失败。OnReceive:通知侦听套接字,通过调用Receive接收数据。OnSend:通知套接字,通过调用Send,它可以发送数据。数据成员:m_hSocket:指定附加在此AsyncSocket对象上的SOCKET句柄。,CSocket类主要成员及其功能,构造函数:CSocket:构造一个CSocket对象。Create:创建一个套接字。属性:IsBlocking:确定一个阻塞调用是否在进行中。FromHandle:返回一个指向CSocket对象的指针,给出一个套接字句柄。操作函数:CancelBlockingCall:取消一个当前在进行中的套接字调用。可重载函数OnMessagePending:当等待完成一个阻塞调用时调用此函数来处理悬而未决的消息。,9.3.2WinSock初始化,在使用WinSock MFC类之前,必须为应用程序初始化WinSock环境。这只需要调用实例初始化函数AfxSocketInit()即可。如下面的代码:BOOL CChatRoomServerApp:InitInstance()if(!AfxSocketInit()AfxMessageBox(IDP_SOCKETS_INIT_FAILED);return FALSE;,同时,在”stdafx.h”文件中添加如下代码:#include 如果在使用MFC AppWizardEXE创建MFC工程时,在MFC AppWizard step 2对话框选择”Windows Sockets”选项,则程序会自动添加上面的代码,实现WinSock的初始化。,9.3.3Socket的创建、连接与关闭,初始化Winsock环境后,即可以实现socket的创建、连接与关闭。1.创建Socket为了使应用程序可以使用Socket,首先需要声明CAsyncSocket、CSocket或者这两个类派生类的一个对象成员,如:CAsyncSocket m_sock;,使用Socket对象之前,必须调用它的Create函数创建Socket。如果准备用Socket连接另一个应用程序,作为客户程序,不必给Create函数传送任何参数。而如果Socket作为服务程序,准备监听另一个应用程序的连接请求,则至少需要传送一个端口给Create函数:if(m_sock.Create(5800)/Socket创建成功后的代码else/错误处理代码Create函数的其他参数还有很多,可以包括Socket类型、准备响应的事件以及Socket的本地的IP地址等,一般情况下取默认值即可。,2.Socket连接建立Socket对象后,就可以创建一个连接,共需要以下3个步骤:(1)在服务器端让Socket调用listen()函数,监听对方的连接请求。(2)在客户端通过调用Connect()函数连接服务器。(3)在服务器通过调用Accept()函数接受连接请求。,(1)在服务器端让Socket调用listen()函数,监听对方的连接请求。listen()函数的调用方式如下:if(m_sock.listen()/Socket监听成功后的代码else/错误处理代码,(2)在客户端通过调用Connect()函数连接服务器。使用Connect()函数连接服务器必须传达两个参数:连接的计算机名或IP地址和端口号。Connect()函数的调用方式如下:if(m_sock.Connect(“127.0.0.1”,5802);/Socket连接成功后的代码else/错误处理代码,(3)一旦服务器监听到连接请求,CAsycnSocket类就激活OnAccept()事件,让应用程序知道已有连接请求,则服务器端必须调用Accept()函数接受连接请求。Accept()函数调用成功,将创建另一个Socket,通过它与对方应用程序连接。Accept()函数的调用方式如下:if(m_sock.Accept(m_sock2);/等待连接请求/连接请求成功后的代码else/连接请求失败后的代码m_sock2和客户方建立了连接,以后就通过这个m_sock2对象去和客户方进行通信,而监听Socket m_sock仍然继续在监听,一旦又有一个客户方要连接服务方,OnAccept()又会被调用一次。m_sock2是和客户方通信的服务方,它不会触发OnAccept()事件,因为它不是监听Socket。,3.关闭Socket连接在应用程序之间的通信完成之后,就可以调用Close()函数关闭这个连接。如下:m_sock.close();,9.3.4数据的发送与接收,通过Socket提供的send()和Receive()函数可以实现任何类型数据的发送和接收。,1.发送通过Socket连接发送请求,可以使用Send()函数,该函数的原型如下:int CAsynSocket:Send(const void*lpBuf,int nBufLen,int nFlags=0);各参数含义如下:lpBuf:指向发送数据缓冲区的指针。数据为CString变量时,可使用LPCTSTR操作符把CString变量作为缓冲区传送。nBuflen:指明缓冲区要发送数据的长度。nFlags:该参数是可选的,用于控制消息的发送方式。函数执行成功,返回发送到对方应用程序的数据总量。如果有错误产生,函数返回SOCKET_ERROR。,典型的Send()函数调用方式如下:char str1000;int ilen;int iSend;iLen=str.GetLength();iSend=m_sock.Send(LPCTSTR(str),iLen);if(iSend=SOCKET_ERROR)/发送不成功错误处理代码else/发送成功处理代码,2.接收数据发送数据后,在另一端应用程序就可通过Receive()函数接收数据了。其函数原型如下:int CAsyncSocket:Receive(void*lpBuf,int nBufLen,int nFlags=0);各参数含义如下:lpBuf:指向接收数据缓冲区的指针。nBufLen:接收数据缓冲区的长度。nFlags:该参数是可选的,用于控制消息的发送方式。通过执行成功后,Receive()函数也返回接收到的数据的数据量。如果有错误产生,函数返回SOCKET_ERROR。,典型的Receive()的调用方式如下:char Buf1024;int iRecv;iRecv=m_sock.Receive(Buff,1024);if(iRecv=SOCKET_ERROR)/接收不成功错误处理代码else BufiRecv=0;接收成功时处理代码,9.4MFC WinSock网络编程实例,为了说明WinSock的基本功能,本节将采用MFC提供的CSocket类实现一个采用Client/Server结构的可以多人同时在线的聊天室。正如大多数聊天室一样,需要一个聊天室服务器,它可以和很多客户端进行通信,从而实现把来自不同的客户的聊天信息转发给所有其他的客户端。,9.4MFC WinSock网络编程实例,9.4.1实例说明9.4.2服务器端程序创建9.4.3客户端程序创建,9.4.1实例说明,创建一个多人在线的服务器,首先必须有一个服务器端口程序,各客户端消息均发送至服务器,而服务器则将收到的消息分发给所有的客户程序。对于本例,服务器和客户端均在本机运行,因此服务器的IP地址为127.0.0.1。服务器程序为一个简单的对话框程序,只有3个按钮:“启动”、“停止”、“退出”,分别实现启动、停止网络服务和退出窗口的功能。如下图所示:,客户端启动时,首先弹出窗口实现用户的连接,就可以向服务器发送消息,并在列表框中显示服务器会传的其所有接收到的消息。其运行结果如下图所示:,分析:,为了实现多人在线聊天,本程序中设计了客户套接字列表来保存所有的客户端套接字。,9.4.2服务器端程序创建,服务器端程序为基于对话框的MFC应用程序。其创建过程如下:1.创建工程:创建一个名为”ChatRoomServer”的基于对话框的MFC工程,在步骤2时选中“Windows Sockets”选项,其他步骤使用默认值。2.添加控件资源服务器端对话框只有3个按钮控件:“启动”、“停止”和“退出”,利用ClassWizard为“启动”和“停止”按钮添加BN_CLICKED消息响应函数OnButtonStart()和OnButtonStop()。,3.派生CSocket类程序从CSocket类派生了两个Socket类CListenSocket和ClientSocket,用于创建监听套接字和客户套接字。其中,ClientSocket类主要用于创建服务方的客户端套接字列表,实现将服务器接收的消息分发给所有客户端Socket。ClistenSocket类主要是重载了CSocket类的OnAccept()函数,用于创建客户端套接字和维护客户端套接字列表。,(1)CClientSocket类,该类主要用于创建服务器客户Socket,实现接收消息并分发给所有连接至服务器的客户Socket。,CClientSocket类的声明如下:class CClientSocket:public CSocketpublic:CClientSocket(CClientSocketList*);virtual CClientSocket();CClientSocketList*List;/所在列表首地址 CClientSocket*Front;/指向前一个套接字 CClientSocket*Next;/指向后一个套接字virtual void OnReceive(int nErrorCode);virtual void OnClose(int nErrorCode);,相应的函数实现代码如下:CClientSocket:CClientSocket(CClientSocketList*tmp)Front=0;Next=0;List=tmp;/此处OnReceice是接收时激活的。void CClientSocket:OnReceive(int nErrorCode)/通过this指针指向的客户套接字接收数据/并把接收到的数据再发送给所有客户端List-Sends(this);,(2)CClientSocketList类,该类用于接收数据和向各客户套接字发送数据。其声明如下:class CClientSocketListpublic:CClientSocketList();virtual CClientSocketList();/接收并向所有客户套接字发送数据BOOL Sends(CClientSocket*);/向客户套接字列表添加一个套接字 BOOL Add(CClientSocket*);CClientSocket*Head;/客户套接字列表元素指针;其主要函数的实现如下所示:,Add方法,/功能:将add元素添加在列表最后。BOOL CClientSocketList:Add(CClientSocket*add)/tmp暂存Head元素 CClientSocket*tmp=Head;if(!Head)/如果列表为空,则添加头元素后返回Head=add;return true;/若列表不为空,则add元素添加在列表最后,/并把原来的末尾元素指向该元素 while(tmp-Next)tmp=tmp-Next;tmp-Next=add;return true;,sends方法,/功能:通过tmp指针指向的客户套接字接收数据/并把接收的数据再发送给所有客户端BOOL CClientSocketList:Sends(CClientSocket*tmp)char buff1000;/分配缓存int n;/将当前套接字指针置为客户套接字列表的头指针CClientSocket*curr=Head;/把tmp客户套接字中的内容接收到缓存buff中。n=tmp-Receive(buff,1000);buffn=0;/把缓存中buff中的内容依次发送给列表中的所有套接字while(curr)curr-Send(buff,n);/向各个客户端发所有聊天记录 curr=curr-Next;return true;,(3)CListenSocket类,CListenSocket类派生自CSocket类,用于监听套接字接受连接请求,创建客户端套接字,并把客户端套接字添加到客户套接字列表中。其类的声明如下:class CListenSocket:public CSocketpublic:CListenSocket();virtual CListenSocket();virtual void OnAccept(int nErrorCode);CClientSocketList CCSL;,在CListenSocket类中,重载了CSocket:OnAccept函数,用于接受客户端连接请求,创建与该客户端通信的套接字,并把该套接字添加到客户端套接字列表中。OnAccept函数重新定义如下:void CListenSocket:OnAccept(int nErrorCode)/创建客户套接字并放在客户端套接字列表中 ClientSocket*tmp=new CClientSocket(,4.添加按钮响应函数的实现代码,“开始”按钮响应函数的实现代码如下:void CChatRoomServerDlg:OnButtonStart()/使启动按钮无效m_IDC_BUTTON_START.EnableWindow(FALSE);/创建监听套接字的端口为6767 ListenSocket.Create(6767);ListenSocket.Listen();/开始监听/将停止按钮激活 m_IDC_BUTTON_STOP.EnableWindow(TRUE);,“停止”按钮响应函数的实现代码如下:void CChatRoomServerDlg:OnButtonStop()/TODO:Add your control notification handler code here/使停止按钮无效m_IDC_BUTTON_STOP.EnableWindow(FALSE);ListenSocket.Close();/关闭监听套接字/将启动按钮激活 m_IDC_BUTTON_START.EnableWindow(TRUE);,9.4.3客户端程序创建,客户端同样为基于对话框的MFC应用程序,其创建过程如下:1.创建工程创建一个名为“ChatRoomClient”的基于对话框的MFC 工程,同样在步骤2时选中“Windows Sockets”选项,其他步骤使用默认值。,2.创建并设计一个派生自CSocket类的CClientSocket类,管理创建客户端的套接字,以发送连接请求,和接收数据。CClientSocket类的类声明如下:class CClientSocket:public CSocketpublic:CChatRoomClientDlg*myDlg;BOOL SetDlg(CChatRoomClientDlg*tmp);CString NikeName;CClientSocket();virtual CClientSocket();virtual void OnReceive(int nErrorCode);类实现代码如下:,CClientSocket:CClientSocket()NikeName=;myDlg=0;/设置套接字的当前窗口BOOL CClientSocket:SetDlg(CChatRoomClientDlg*tmp)myDlg=tmp;return true;void CClientSocket:OnReceive(int nErrorCode)myDlg-GetMessage();,3.添加设计对话框资源。客户端程序有两个窗口,一个是登录窗口,需要输入一些登录信息,另外就是聊天主窗口。聊天主窗口布局如下图所示:,控件类型及各自ID,利用ClassWizard,为列表控件CDC_LIST_CHATBOX添加控制变量m_IDC_LIST_CHARBOX,用于显示聊天信息。为静态文本控件IDC_STAIC_NIKENAME增加控制变量m_IDC_STAIC_NIKENAME,用于动态显示用户别名。为IDC_EDIT_MESSAGE控件增加成员变量m_IDC_EDIT_MESSAGE,记录用户的发言。,登录窗口是通过对话框资源添加进去的,其布局如下图所示。,登录窗口各控件类型及各自ID,登录窗口的类名为CConectDlg,利用“建立类向导”,为昵称编辑框控件添加CString类型的成员变量m_IDC_EDIT_NIKENAME。为服务器地址编辑框控件IDC_EDIT_ADDRESS添加CString类型的成员变量m_IDC_ADDRESS。,4.登录对话框的支持类CConectDlg,登录对话框类中要实现与服务器的连接。由于要完成与服务器的连接操作必然离不开Socket,而为了在登录对话框销毁后,能够继续使用与服务器连接的Socket,因此在CConectDlg类的声明里直接定义了Socket指针形参,以把Socket传回。类的声明如下:类的声明如下:class CConnectedDlg:public CDialogpublic:CConnectedDlg(CClientSocket*tmp,CWnd*pParent=NULL);CClientSocket*myServerSocket;类的实现如下:,CConnectedDlg:CConnectedDlg(CClientSocket*tmp,CWnd*pParent/*=NULL*/):CDialog(CConnectedDlg:IDD,pParent)myServerSocket=tmp;,而“登录”按钮的响应函数OnOK()的实现代码如下:void CConnectedDlg:OnOK()/TODO:Add extra validation hereUpdateData(TRUE);/控件-数据成员char*nikename,*address;int n;if(!myServerSocket-Create()myServerSocket-Close();AfxMessageBox(网络创建错误!);return;,n=m_IDC_EDIT_ADDRESS.GetLength();address=new char(n+1);/sprintf将内容格式化为字符串保存在address中sprintf(address,%s,m_IDC_EDIT_ADDRESS.GetBuffer(n);addressn=0;n=m_IDC_EDIT_NIKENAME.GetLength();nikename=new char(n+1);sprintf(nikename,%s,m_IDC_EDIT_NIKENAME.GetBuffer(n);nikenamen=0;/向服务器6767端口请求连接。if(!myServerSocket-Connect(address,6767)myServerSocket-Close();AfxMessageBox(网络连接错误!);return;myServerSocket-NikeName=nikename;CDialog:OnOK();,5.实现在主对话框启动登录对话框,为了在主窗口出现之前,先启动登录对话框窗口,需要在CChatRoomClientApp:InitInstance中添加代码,即在主对话框窗口构造之前先启动,如下所示:CClientSocket curSocket;/事先定义了客户端套接字变量BOOL CChatRoomClientApp:InitInstance()CConnectedDlg cdlg(if(nResponse=IDOK)else if(nResponse=IDCANCEL),5.在主对话框实现消息的发送,在主对话框的“发送”按钮响应函数中,添加代码实现向服务器发送用户消息,代码如下:void CChatRoomClientDlg:OnButtonSend()int n;char message1000;UpdateData(TRUE);/控件-数据成员m_IDC_EDIT_MESSAGE=myServerSocket-NikeName+:+m_IDC_EDIT_MESSAGE;n=m_IDC_EDIT_MESSAGE.GetLength();sprintf(message,%s,m_IDC_EDIT_MESSAGE.GetBuffer(n);messagen=0;if(myServerSocket-Send(message,n+1)m_IDC_EDIT_MESSAGE=;UpdateData(FALSE);/数据成员-控件else AfxMessageBox(网络传输错误!);,6.接收服务器消息的实现,本例中并没有直接采用CSocket类而是采用了一个CClientSocket类,它是自己重新定义的一个CSocket类的派生类,其中有一个很重要的成员函数,它实现了立即显示从服务器获得的聊天信息到聊天对话框中的功能。核心代码如下:void CClientSocket:OnReceive(int nErrorCode)myDlg-GetMessage();,它通过调用主对话框的成员函数GetMessage,显示聊天信息,代码如下:BOOL CChatRoomClientDlg:GetMessage()char buff1000;int count;/接收服务器发送来的聊天信息。count=myServerSocket-Receive(buff,1000);buffcount=0;m_IDC_LIST_CHATBOX_CONTROL.AddString(buff);return true;,

    注意事项

    本文(《VC++程序设计》第9讲_WINSOCK网络编程.ppt)为本站会员(laozhun)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开