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

    MFCWinsock类编程.ppt

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

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

    MFCWinsock类编程.ppt

    第三章 MFC Winsock类编程,20110331,主要内容,3.1 MFC简介 3.2 CAsyncSocket类3.3 基于CAsyncSocket类的单点聊天程序3.4 CSocket类3.5 基于CSocket类的多点聊天程序,3.1 MFC简介,1.MFC编程框架使用应用程序向导(AppWizard)生成应用程序的骨架文件(代码和资源等);使用资源编译器直观地设计用户接口;使用类向导(ClassWizard)将代码添加到骨架文件;使用编译器可以通过类库实现应用程序特定的逻辑。,3.1 MFC简介,2.MFC对象和Windows对象的关系应用的数据结构不同MFC对象是相应C+类的实例,由MFC或者编程者定义Windows对象是Windows操作系统内部结构的实例,通过句柄来引用所处的层次不同MFC对象是高层的Windows对象是低层的创建的机制不同MFC对象是由程序通过调用类的构造函数直接创建Windows对象是由相应的SDK函数创建的,3.1 MFC简介,2.MFC对象和Windows对象的关系二者转换的方式不同使用的范围不同MFC对象只服务于创建它的进城,对系统的其他进城来说是不可见、不可用的销毁的方法不同MFC对象随着析构函数的调用而消失Windows对象必须由相应的Windows操作系统函数销毁,3.1 MFC简介,3.消息映射的实现Windows应用程序的输入由Windows系统以消息的形式发送给应用程序的窗口。这些窗口通过窗口过程来接收和处理消息,然后把控制返还给Windows 消息的分类:队列消息和非队列消息系统消息和应用程序消息,3.1 MFC简介,MSG消息结构和消息处理消息结构:该结构包括了六个成员,用来描述消息的有关属性:,typedef struct tagMSG/msg HWND hwnd;/接收消息的窗口句柄UINT message;/消息标识(ID)WPARAM wParam;/第一个消息参数LPARAM lParam;/第二个消息参数DWORD time;/消息产生的时间POINT pt;/消息产生时鼠标的位置 MSG;,3.1 MFC简介,消息处理 所有的MFC窗口都使用同一窗口过程,程序员不必去设计和实现自己的窗口过程,而是通过MFC提供的一套消息映射机制来处理消息。所谓消息映射,简单地讲,就是让程序员指定要某个MFC类(有消息处理能力的类)处理某个消息。MFC提供了工具ClassWizard来帮助实现消息映射,在处理消息的类中添加一些有关消息映射的内容和处理消息的成员函数。程序员将完成消息处理函数,实现所希望的消息处理能力。,3.1 MFC简介,MFC消息映射的定义和实现MFC处理的三类消息:Windows消息,前缀以“WM_”打头,WM_COMMAND例外。控制通知消息,是控制子窗口送给父窗口的WM_COMMAND通知消息。命令消息,这是来自菜单、工具条按钮、加速键等用户接口对象的WM_COMMAND通知消息,属于应用程序自己定义的消息。MFC消息映射的实现方法MFC使用ClassWizard帮助实现消息映射,它在源码中添加一些消息映射的内容,并声明和实现消息处理函数。,3.1 MFC简介,4.MFC应用程序的执行过程MFC程序的启动第一、AFX内部初始化,包括应用程序对象状态初始化和主线程初始化第二、执行由MFC框架提供的标准函数WinMain()第三、调用CWinApp类的虚函数InitInstance(),初始化应用程序的当前实例第四、调用CWinApp的Run()函数,运行消息循环和空闲处理第五、当收到WM_QUIT消息,调用ExitInstance()函数,退出消息循环,并做应用程序退出时的清理工作,3.1 MFC简介,4.MFC应用程序的执行过程MFC程序的退出用户单击主窗口的“关闭”按钮,发送MFC标准命令消息ID_APP_EXIT。主窗口处理WM_CLOSE消息。收到WM_QUIT消息后,退出消息循环,进而退出整个应用程序,3.2 CAsyncSocket类,MFC用类CAsyncSocket封装了Windows Sockets API,它主要是为网络程序设计人员提供的,想直接利用Windows Sockets API的灵活性,但是又想利用回调函数的方式来方便地处理网络事件。在C+中,除了将插口封装成面向对象的形式外,所做的唯一抽象是:将与插口相关的Windows消息转换成回调函数。,3.2 CAsyncSocket类,使用CAsyncSocket类编程的一般步骤,3.2.2 创建CasyncSocket类对象 本书将CAsyncSocket类对象称为异步套接字对象。创建异步套接字对象一般分为两个步骤,首先构造一个CAsyncSocket对象,再创建该对象的底层的SOCKET句柄。1创建空的异步套接字对象 通过调用CAsyncSocket类的构造函数,创建一个新的空CAsyncSocket类套接字对象,构造函数不带参数。然后必须调用它的Create成员函数,来创建底层的套接字数据结构,并绑定它的地址。,有两种使用方法,会在不同的位置创建。(1)如:CAsyncSocket aa;aa.Create(。);(2)如:CAsyncSocket*Pa;Pa=new CAsyncSocket;Pa-Create(。);,2创建异步套接字对象的底层套接字句柄通过调用CAsyncSocket类的Create()成员函数,创建该对象的底层套接字句柄,决定套接字对象的具体特性。调用格式为:BOOL Create(UINT nSocketPort=0,Int nSocketType=SOCK_STREAM,Long Ievent=FD_READ|FD_WRITE|FD_OOB|FD_ACCEPT|FD_CONNECT|FD_CLOSE,LPCTSTR lpszSocketAddress=NULL);,举例:创建一个使用27端口的流式异步套接字对象。CAsyncSocket*pSocket=new CAsyncSocket;int nPort=27;pSocket-Create(nPort,SOCK_STREAM);,3.2.3 关于CAsyncSocket类可以接受并处理的消息事件1六种套接字相关的事件与通知消息参数Ievent可以选用的六个符号常量是在winsock.h文件中定义的。#define FD_READ 0 x01#define FD_WRITE 0 x02#define FD_OOB 0 x04#define FD_ACCEPT 0 x08#define FD_CONNECT 0 x10#define FD_CLOSE 0 x20,他们代表MFC套接字对象可以接受并处理的六种网络事件,当事件发生时,套接字对象会收到相应的通知消息,并自动执行套接字对象响应的事件处理函数。(1)FD_READ事件通知:通知有数据可读。(2)FD_WRITE事件通知:通知可以写数据。(3)FD_ACCEPT事件通知:通知监听套接字有连接请求可以接受。(4)FD_CONNECT事件通知:通知请求连接的套接字,连接的要求已被处理。(5)FD_CLOSE事件通知:通知套接字已关闭。(6)FD_OOB事件通知:通知将有带外数据到达。,2MFC框架对于六个网络事件的处理当上述的网络事件发生时,MFC框架作何处理呢?按照Windows的消息驱动机制,MFC框架应当把消息发送给相应的套接字对象,并调用作为该对象成员函数的事件处理函数。事件与处理函数是一一映射的。,在afxSock.h文件中的CAsyncSocket类的声明中,定义了与这六个网络事件对应的事件处理函数。virtual void OnReceive(int nErrorCode);对应 FD_READ事件virtual void OnSend(int nErrorCode);对应 FD_WRITE事件virtual void OnAccept(int nErrorCode);对应 FD_ACCEPT事件virtual void OnConnect(int nErrorCode);对应 FD_CONNECT事件,virtual void OnClose(int nErrorCode);对应 FD_CLOSE事件virtual void OnOutOfBandData(int nErrorCode);对应 FD_OOB事件 当某个网络事件发生时,MFC框架会自动调用套接字对象的对应的事件处理函数。这就相当给了套接字对象一个通知,告诉它某个重要的事件已经发生。所以也称之为套接字类的通知函数(notification functions)或回调函数(callback functions)。,3重载套接字对象的回调函数如果你从CAsyncSocket类派生了自己的套接字类,你必须重载你的应用程序所感兴趣的那些网络事件所对应的通知函数。MFC框架自动调用通知函数,使得你可以在套接字被通知的时候来优化套接字的行为。,3.2.4 客户端套接字对象请求连接到服务器端套接字对象 在服务器端套接字对象已经进入监听状态之后,客户应用程序可以调用CAsyncSocket类的Connect()成员函数,向服务器发出一个连接请求,格式一:BOOL Connect(LPCTSTR lpszHostAddress,UINT nHostPort);格式二:BOOL Connect(const SOCKADDR*lpSockAddr,int nSockAddrLen);,如果调用成功或者发生了WSAEWOULDBLOCK错误,当调用结束返回时,都会发生FD_CONNECT事件,MFC框架会自动调用客户端套接字的OnConnect()事件处理函数,并将错误代码作为参数传送给它。它的原型调用格式如下,virtual void OnConnect(int nErrorCode);,3.2.4 服务器接受客户机的连接请求在服务器端,使用CAsyncSocket流式套接字对象,一般按照以下步骤来接收客户端套接字对象的连接请求。(1)服务器应用程序必须首先创建一个CAsyncSocket流式套接字对象,并调用它的Create成员函数创建底层套接字句柄。这个套接字对象专门用来监听来自客户机的连接请求,所以称它为监听套接字对象。,(2)调用监听套接字对象的Listen成员函数,使监听套接字对象开始监听来自客户端的连接请求。此函数的调用格式是:BOOL Listen(int nConnectionBacklog=5);当Listen函数确认并接纳了一个来自客户端的连接请求后,会触发FD_ACCEPT事件,监听套接字会收到通知,表示监听套接子已经接纳了一个客户的连接请求,MFC框架会自动调用监听套接字的OnAccept事件处理函数,它的原型调用格式如下,virtual void OnAccept(int nErrorCode);编程者一般应重载此函数,在其中调用监听套接字对象的Accept函数,来接收客户端的连接请求。,(3)创建一个新的空的套接字对象,不需要使用它的Create函数来创建底层套接字句柄。这个套接字专门用来与客户端连接,并进行数据的传输。一般称它为连接套接字,并作为参数传递给下一步的Accept成员函数。(4)调用监听套接字对象的Accept成员函数,调用格式为:virtual BOOL Accept(CAsyncSocket,3.2.4 发送与接收流式数据。当服务器和客户机建立了连接以后,就可以在服务器端的连接套接字对象和客户端的套接字对象之间传输数据了。对于流式套接字对象,使用CAsyncSocket类的Send成员函数向流式套接字发送数据,使用Receive成员函数从流式套接字接收数据。,1用Send成员函数发送数据格式:virtual int Send(const void*lpBuf,int nBufLen,int nFlags=0);对于一个CAsyncSocket套接字对象,当它的发送缓冲区腾空时,会激发FD_WRITE事件,套接字会得到通知,MFC框架会自动调用这个套接字对象的OnSend事件处理函数。一般编程者会重载这个函数,在其中调用Send成员函数来发送数据。,2用Receive成员函数接收数据格式:Virtual int Receive(Void*lpBuf,Int nBufLen,Int nFlags=0);对于一个CAsyncSocket套接字对象,当有数据到达它的接收队列时,会激发FD_READ事件,套接字会得到已经有数据到达的通知,MFC框架会自动调用这个套接字对象的OnReceive事件处理函数。一般编程者会重载这个函数,在其中调用Receive成员函数来接收数据。在应用程序将数据取走之前,套接字接收的数据将一直保留在套接字的缓冲区中。,3.2.6 关闭套接字1使用CAsyncSocket类的Close成员函数格式:virtual void Close();2使用CAsyncSocket类的ShutDown()成员函数 使用CAsyncSocket类的ShutDown()成员函数,可以选择关闭套接字的方式。将套接字置为不能发送数据,或不能接收数据,或二者均不能的状态。格式:BOOL ShutDown(int nHow=sends);,错误处理 一般说来,调用CAsyncSocket对象的成员函数后,返回一个逻辑型的值,如果成员函数执行成功,返回TRUE;如果失败,返回FALSE。究竟是什么原因造成错误呢?这时,可以进一步调用CAsyncSocket对象的GetLastError()成员函数,来获取更详细的错误代码,并进行相应的处理。格式:static int GetLastError();返回值是一个错误码,针对刚刚执行的CAsyncSocket成员函数。,3.2.7 其它的成员函数1关于套接字属性的函数要设置底层套接字对象的属性,可以调用SetSocketOpt()成员函数;要获取套接字的设置信息,可调用GetSocketOpt()成员函数;要控制套接字的工作模式,可调用IOCtl()成员函数,选择合适的参数,可以将套接字设置在阻塞模式(Blocking mode)下工作。,2发送和接收数据如果创建的是数据报类型的套接字,用SendTo()成员函数来向指定的地址发送数据,事先不需要建立发送端和接收端之间的连接,用ReceiveFrom()成员函数可以从某个指定的网络地址接收数据。,发送数据SendTo的调用格式,有两种重载的形式,区别在于参数不同:int SendTo(const void*lpBuf,int nBufLen,UINT nHostPort,LPCTSTR lpszHostAddress=NULL,int nFlags=0);int SendTo(const void*lpBuf,int nBufLen,const SOCKADDR*lpSockAddr,int nSockAddrLen,int nFlags=0);,2发送和接收数据,接收数据ReceiveFrom的调用格式,也有两种重载的形式,区别在于参数不同:int ReceiveFrom(void*lpBuf,int nBufLen,CString,2发送和接收数据,3.3 基于CAsyncSocket类的单点聊天程序,1.实现目标应用实例是一个简单的聊天室程序,采用客户/服务器模式,分为客户端程序和服务器端程序。由于服务器只能支持一个客户,实际是一个点对点通信的程序。客户端程序和服务器程序通过网络交换聊天的字符串内容,并在窗口的列表框中显示。,3.3 基于CAsyncSocket类的单点聊天程序,实例程序的技术要点是:如何从CAsyncSocket类派生出自己的WinSock类。理解WinSock类与应用程序框架的关系。重点学习流式套接字对象的使用。处理网络事件的方法。,3.2.2 创建客户端应用程序1使用MFC AppWizard创建客户端应用程序框架。(1)在New对话框中,选择Projects卡,如图3.1所示。从左边的列表框中选择MFC AppWizard(exe)条目,在右边的Project Name处填入工程名Talkc,在Location处选定存放此工程的目录。然后点击OK按钮。,(2)出现MFC AppWizard设置的第一步对话框(MFC AppWizard Step 1),如图3.2所示。从中选择Dialog based的应用程序类型,语言支持选择中文(中国),使此工程能够正确地进行中文的输入、输出、显示及处理。然后点击NEXT按钮。,(3)出现MFC AppWizard设置的第二步对话框(MFC AppWizards Step 2 of 4),如图3.3所示,在Windows Sockets复选框上打上选择标记,表示应用程序将支持WinSock套接字。接受其它的默认设置。跳过后面的步骤,直接点击Finsh按钮。,(4)出现新工程信息对话框(New Project Information),说明了所创建的骨架工程的有关信息。如图5.6所示。,从中可以看出,所创建的程序是一个基于对话框的Win32应用程序,将自动创建两个类,应用程序类CTalkcApp,对应的文件是talkc.h和talkc.cpp;对话框类CTalkcDlg,对应的文件是talkcDlg.h和talkcDlg.cpp。支持Windows Socket,使用共享的DLL实现MFC42.DLL。,2为对话框界面添加控件对象在创建了应用程序骨架之后,可以布置程序的主对话框。在MFC界面左方的工作区(workspace)中选择resourceView卡,从中选择Dialog,双击IDD_TALKC_DIALOG,右边会出现对话框,左边会出现控件面板,利用控件面板可以方便地在程序的主对话框界面中添加相应的可视控件对象,如图3.7所示。,图3-7 在主对话框中添加控件,完成的对话框如图3.8所示,然后按照表3-4修改控件的属性。,图3-9 Talkc程序的主对话框,表3-4 Talkc程序主对话框中的控件属性,3为对话框中的控件对象定义相应的成员变量在窗口菜单中点查看/建立类向导,进入类向导(Class Wizard)对话框,如图3.9。,选择成员变量卡(Member Variables),用类向导为对话框中的控件对象定义相应的成员变量。确认Class Name是CTalkcDlg,在左边的列表框中选择一个控件,然后点“Add Variable”按钮,会弹出”Add Member Variable”对话框,如图3.10所示,然后按照表3.5输入即可。,图3.10 增加控件成员变量的对话框,表3.5 客户端程序对话框中的控件对象对应的成员变量,4创建从CAsyncSocket类继承的派生类(1)为了能够捕获并响应socket事件,应创建用户自己的套接字类,它应当从CAsyncSocket类派生,还能将套接字事件传递给对话框,以便执行用户自己的事件处理函数。选择菜单“插入/新建类”,进入“New Class”对话框,如图3.11所示。,图3.11 添加自己的套接字类,选择或输入以下信息:Class Type:选择MFC ClassClass Infoumation下的Name:输入CMySocketClass Infoumation下的Base class:选择CAsyncSocket点击“OK”按钮,系统会自动生成CMySocket类对应的包含文件MySocket.h和MySocket.cpp文件,在VC界面的Class View中就可以看到这个类。,(2)利用类向导ClassWizard为这个套接字类添加响应消息的事件处理成员函数。点菜单View/ClassWizard.,进入类向导对话框,选择Message Maps(消息映射)卡,确认Class name是CMySocket,从Messages(消息)栏中选择事件消息,然后点击Add Function按钮,就会看到在Member Function栏中添加了相应的事件处理函数。如图3.12所示,此程序中需要添加OnConnect,OnClose和OnReceive三个函数。这一步会在CMySocket类的MySocket.h中自动生成这些函数的声明,在MySocket.cpp中生成这些函数的框架,以及消息映射的相关代码。可参看后面的程序清单。,图3.12 为套接字类添加响应消息的事件处理成员函数,(3)为套接字类添加一般的成员函数和成员变量在VC+的界面中,在工作区窗口选择ClassView卡,用右键单击CMySocket类,会弹出快捷菜单,选择其中的Add Member Function 可以为该类添加成员函数;选择Add Member Variable可以为该类添加成员变量。如图3.13所示。图3.14和图3.15是添加操作的对话框。,对这个套接字类,添加一个私有的成员变量,是一个对话框类的指针。private:CTalkcDlg*m_pDlg;,图3.14 为套接字类添加一般的成员变量,再添加一个成员函数:void SetParent(CTalkcDlg*pDlg);,图3.13 为套接字类添加一般的成员函数这一步同样会在MySocket.h中生成变量或函数的声明,在MySocket.cpp中生成函数的框架代码。如果熟悉的话,这一步的代码也可以直接手工添加。,(4)手工添加其他代码在VC+的界面中,在工作区窗口选择FileView卡,双击要编辑的文件,在右面的窗口中就会展示该文件的代码,可以编辑添加。对于MySocket.h,应在文件开头,添加对于此应用程序对话框类的声明。class CTalkcDlg;,对于MySocket.cpp,有四处添加:应在文件开头,添加包含文件说明。这是因为此套接字类用到了对话框类的变量。#include“TalkcDlg.h”在构造函数中,添加对于对话框指针成员变量的初始化代码:CMySocket:CMySocket()m_pDlg=NULL;在析构函数中,添加对于对话框指针成员变量的初始化代码:CMySocket:CMySocket()m_pDlg=NULL;为成员函数setParent和事件处理函数OnConnect,OnClose和OnReceive添加代码。详见后面的程序清单。,5为对话框类添加控件对象事件的响应函数按照表3.6,用类向导(Class Wizard)为对话框中的控件对象添加事件响应函数。主要是对于三个按钮的单击事件的处理函数,如图3.15所示。其他函数是原有的。表3.6 为对话框中的控件对象添加事件响应函数,图3.15 为对话框类添加控件事件的处理函数这一步会在talkcDlg.h中自动添加这三个事件处理函数的声明,在talkcDlg.cpp中生成消息映射的代码,和这三个函数的框架代码。,6为CTalkcDlg对话框类添加其它的成员函数和成员变量成员变量:CMySocket m_sConnectSocket;/用来与服务器端连接的套接字。成员函数:void OnClose();/用来处理与服务器端的通信。void OnConnect();void OnReceive();,7手工添加的代码在CTalkcDlg对话框类的talkcDlg.h中添加对于MySocket.h的包含命令,来获得对于套接字支持:#include“MySocket.h”在CTalkcDlg对话框类的talkcDlg.cpp中添加对于控件变量的初始化代码:/TODO:Add extra initialization here/用户添加的控件变量的初始化代码BOOL CTalkcDlg:OnInitDialog()m_strServName=localhost;/服务器名=localhostm_nServPort=1000;/服务端口=1000UpdateData(FALSE);/更新用户界面/设置套接字类的对话框指针成员变量m_sConnectSocket.SetParent(this);,8添加事件函数和成员函数的代码主要在CTalkcDlg对话框类的talkcDlg.cpp中和CMySocket类的Mysocket.cpp中,添加用户自己的事件函数和成员函数的代码,要注意,这些函数的框架已经在前面的步骤中,由VC+的向导生成,只要将用户自己的代码填入其中即可。9进行测试。测试应分步进行,在上面的步骤中,每作一步,都可以试着编译执行。,3.3.3 客户端程序的类与消息驱动图5.18说明了点对点交谈的客户端程序的类与消息驱动关系,,图5.18 Talkc客户端程序的类与消息驱动的关系,3.3.4 客户端程序的主要功能的代码和分析1应用程序类CTalkcApp对应的文件应用程序类CTalkcApp,对应的文件是talkc.h和talkc.cpp;talkc.h定义了CTalkcApp类,talkc.cpp是该类的实现代码,完全由VC+自动创建,用户不必作任何改动。2派生的套接字类CMySocket对应的文件CMySocket类对应MySocket.h头文件和MySocket.CPP文件,,3对话框类CTalkcDlg对应的文件对话框类CTalkcDlg,对应的文件是talkcDlg.h和talkcDlg.cpp。4其他文件对于VC+为talkc工程创建的其他文件,如stdafx.h和stdafx.cpp,以及Resource.h和talkc.rc都不需要作任何处理。,3.3.5 创建服务器端程序同样利用可视化语言的集成开发环境(IDE)来创建服务器端应用程序框架。步骤是:1使用MFC AppWizard创建服务器端应用程序框架。2为对话框界面添加控件对象3为对话框中的控件对象定义相应的成员变量4创建从CAsyncSocket类继承的派生类5为对话框类添加控件对象事件的响应函数6为CTalksDlg对话框类添加其它的成员函数和成员变量7手工添加的代码8添加事件函数和成员函数的代码 9进行测试。,3.3.6 服务器端程序的流程和消息驱动,图5.20 Talks服务器端程序的类与消息驱动的关系,3.3.7 点对点交谈的服务器端程序的主要功能的代码和分析1CTalksApp类对应的文件talks.h和talks.cpp不需要做任何改动2CMySocket类对应的文件(1)MYSOCKET.H文件(2)MySocket.cpp文件3CTalksDlg类对应的文件(1)talksDlg.h(2)talksDlg.cpp文件4其它的文件不必改动,CSocket类的派生关系,CSocket类是从CAsyncSocket类派生而来的,它们的派生关系如下图:,3.4 CSocket类,CSocket类的编程模型下面给出针对流式套接字的CSocket类的编程模型。分为服务器端和客户端。1服务器端(1)CSocket sockServ;/创建空的服务器端监听套接字对象。/用众所周知的端口,创建监听套接字对象的底层套接字句柄。(2)sockServ.Create(nPort);(3)sockServ.Listen();/启动对于客户端连接请求的监听。(4)CSocket sockRecv;/创建空的服务器端连接套接字对象。,/接收客户端的连接请求,并将其他的任务转交给连接套接字对象。sockServ.Accept(sockRecv);(5)CSockFile*file;file=new CSockFile(/创建用于输出的归档对象。/归档对象必须关联到文件对象。,(7)arIn dwValue;/进行数据输入。adOut dwValue;/进行数据输出。输入或输出可以反复进行。(8)sockRecv.Close();sockServ.Close();/传输完毕,关闭套接字对象。,2客户端(1)CSocket sockClient;/创建空的客户机端套接字对象。(2)sockClient.Create();/创建套接字对象的底层套接字。(3)sockClient.Connect(strAddr,nPort);/请求连接到服务器。(4)CSockFile*file;file=new CSockFile(/创建文件对象,并关联到套接字对象。,(5)CArchive*arIn,arOut;arIn=CArchive(/传输完毕,关闭套接字对象。,3.4.2 创建CSocket对象分为两个步骤:(1)调用CSocket类的构造函数,创建一个空的CSocket对象。(2)调用此CSocket对象的Create()成员函数,创建对象的底层套接字。调用格式是:BOOL Create(UINT nSocketPort=端口号,Int nSocketPort=SOCK_STREAM|SOCK_DGRAM,LPCTSTR lpszSocketAddress=套接字所用的网络地址);如果打算使用CArchive对象和套接字一起进行数据传输工作,必须使用流式套接字。,3.4.3 建立连接 CSocket类使用基类CAsyncSocket的同名成员函数Connect()、Listen()、Accept()来建立服务器和客户机套接字之间的连接,使用方法相同。不同的是:CSocket类的Connect()和Accept()支持阻塞调用。比如:在调用Connect()函数时会发生阻塞,直到成功地建立了连接或有错误发生才返回,在多线程的应用程序中,一个线程发生阻塞,其他的线程仍能处理Windows事件。CSocket对象从不调用OnConnect()事件处理函数。,3.4.4 发送和接收数据。在创建CSocket类对象后,对于数据报套接字,直接使用CSocket类的SendTo()、ReceiveFrom()成员函数来发送和接收数据。对于流式套接字,首先在服务器和客户机之间建立连接,然后使用CSocket类的Send()、Receive()成员函数来发送和接收数据,它们的调用方式与CAsyncSocket类相同。不同的是:CSocket类的这些函数工作在阻塞的模式。比如,一旦调用了Send()函数,在所有的数据发送之前,程序或线程将处于阻塞的状态。一般将CSocket类与CArchive类和CSocketFile类结合,来发送和接收数据,这将使编程更为简单。CSocket对象从不调用OnSend()事件处理函数。,3.4.5 CSocket类与CArchive类和CSocketFile类使用CSocket类的最大优点在于,应用程序可以在连接的两端通过CArchive对象来进行数据传输。具体做法是:(1)创建CSocket类对象(2)创建一个基于CSocketFile类的文件对象,并把它的指针传给上面的已创建的CSocket对象。(3)分别创建用于输入和输出的CArchive对象,并将它们与这个CSocketFile文件对象连接。(4)利用CArchive对象来发送和接收数据。,下面是一段示例代码:CSocket exSocket;/创建一个空的CSocket对象。CSocketFile*pExFile;/定义一个CSocketFile对象指针。CArchive*pCArchiveIn;/定义一个用于输入的Carchive对象指针。CArchive*pCArchiveOut;/定义一个用于输出的Carchive对象指针。exSocket.Create();/创建Csocket对象的底层套接字。,/创建CSocketFile对象,并将CSocket对象的指针传递给它。pExFile=new CSocketFile(&exSocket,TRUE);/创建用于输入的CArchive对象pCArchiveIn=new CArchive(pExFile,CArchive:load);/创建用于输出的CArchive对象。pCArchiveOut=new CArchive(pExFile,CArchive:store);,CSocket、CArchive和CSocketFile类在传输数据时的作用,3.4.5 关闭套接字和清除相关的对象,在使用完CSocket对象以后,应用程序应调用它的Close()成员函数来释放套接字占用的系统资源,也可以调用它的ShutDown()成员函数来禁止套接字读写。而对于相应的CArchive对象、CSocketFile对象和CSocket对象,可以将它们销毁;也可以不作处理,因为当应用程序终止时,会自动调用这些对象的析构函数,从而释放这些对象占用的资源。,

    注意事项

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

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




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开