第5 MFC WInS0ck类的编程 51 CAsyncSocke类 52CS0ckt类 53CS0cket类的编程模型 54用 CAsyncSocke类实现聊天室程序 55用 CSocket类实现聊天室程序
第5章 MFC WinSock类的编程 5.1 CAsyncSocket类 5.2 CSocket类 5.3 CSocket类的编程模型 5.4 用CAsyncSocket类实现聊天室程序 5.5 用CSocket类实现聊天室程序
第5章 MFC Winsock类的编程 为简化套接字网络编程,更方便地利用 Windows 的消息驱动机制,微软的基础类库( Microsoft Foundation Class Libary,简称MFC),提供了 两个套接字类,在不同的层次上对 Windows socket API函数进行了封装,为编写 Windows socket网络 通信程序,提供了两种编程模式
为简化套接字网络编程,更方便地利用Windows 的消息驱动机制,微软的基础类库(Microsoft Foundation Class Libary,简称MFC),提供了 两个套接字类,在不同的层次上对Windows Socket API函数进行了封装,为编写Windows Socket网络 通信程序,提供了两种编程模式。 第5章 MFC Winsock类的编程
第5章 MFC Winsock类的编程 CAsyncSocket类,在很低的层次上对 Windows sockets AP进行了封装。 它的成员函数和 Windows Sockets APl的函数调用直接对 应。一个 CAsyncSocke对象代表了一个 Windows套接字。它是 网络通信的端点。除了把套接字封装成C+的面向对象的形式 供程序员使用以外,这个类唯一所增加的抽象就是将那些与套 接字相关的 Windows消息变为 CAsyncSocket类的回调函数。 如果你对网络通信的细节很熟悉,可以利用 Windows Sockets ap编程的灵活性。但是要自己解决阻塞问题、字节顺 序问题、字符串转换问题
CAsyncSocket类,在很低的层次上对Windows Sockets API进行了封装。 它的成员函数和Windows Sockets API的函数调用直接对 应。一个CAsyncSocket对象代表了一个Windows套接字。它是 网络通信的端点。除了把套接字封装成C++的面向对象的形式 供程序员使用以外,这个类唯一所增加的抽象就是将那些与套 接字相关的Windows消息变为CAsyncSocket类的回调函数。 如果你对网络通信的细节很熟悉,可以利用Windows Sockets API编程的灵活性。但是要自己解决阻塞问题、字节顺 序问题、字符串转换问题。 第5章 MFC Winsock类的编程
第5章 MFC Winsock类的编程 CSocket类,从 CAsyncSocket类派生,是对 Windows Sockets apl的高级封装。 CSocket类继承了 CASyncSocket类的 许多成员函数,用法一致。 CSocket类的高级表现在三个方面: (1) CSocket结合 Archive类来使用套接字。 (2) CSocket管理了通信的许多方面,如字节顺序问题和 字符串转换问题。 (3) CSocket类为 Windows消息的后合处理提供了阻塞的 工作模式( Blocking)
CSocket类,从CAsyncSocket类派生,是对Windows Sockets API的高级封装。CSocket类继承了CAsyncSocket类的 许多成员函数,用法一致。CSocket类的高级表现在三个方面: (1)CSocket结合Archive类来使用套接字。 (2)CSocket管理了通信的许多方面,如字节顺序问题和 字符串转换问题。 (3)CSocket类为Windows消息的后台处理提供了阻塞的 工作模式(Blocking)。 第5章 MFC Winsock类的编程
第5章 MFC Winsock类的编程 这两个类提供了事件处理函数,编程者通过对事件处 理函数进行重载,可方便地对套接字发送数据、接收数据 等事件进行处理。同时,可以结合MFC的其它类来使用这 两个套接字类,并利用MFC的各种可视化向导,从而大大 简化了编程。 在MFC中,有一个名为 afx h的包含文件, C: Program Files\microsoft Visual Studio 11.0lvc latlmfc include lafxsock h。在这个文件中定义了 CAsyncSocket, CSocket,和 CSocketFile这三个套接字类 class CasyncSocket: public Obiect class CSocket public CAsyncSocket class CsocketFile public cfile
这两个类提供了事件处理函数,编程者通过对事件处 理函数进行重载,可方便地对套接字发送数据、接收数据 等事件进行处理。同时,可以结合MFC的其它类来使用这 两个套接字类,并利用MFC的各种可视化向导,从而大大 简化了编程。 在MFC中,有一个名为afxSock.h的包含文件, C:\Program Files\Microsoft Visual Studio 11.0\VC \atlmfc \include \afxsock.h 。在这个文件中定义了CAsyncSocket, CSocket,和CSocketFile这三个套接字类。 class CAsyncSocket : public Cobject class CSocket : public CAsyncSocket class CSocketFile : public CFile 第5章 MFC Winsock类的编程
5 I CasyncSocket类P110 CASyncSocket类从 Cobject类派生而来,如下图所示 cobject CAsyncSocket 使用 CAsyncSocket类进行网络编程,方便处理各种网络 事件,方便构造用户界面,具有较大的灵活性
CAsyncSocket类从Cobject类派生而来,如下图所示: 5.1 CasyncSocket类 P110 使用CAsyncSocket类进行网络编程,方便处理各种网络 事件,方便构造用户界面,具有较大的灵活性
5.1.1使用 CAsyncSocke类的一般步骤P110 网络应用程序一般采用客户服务器模式,它们使用 CAsyncSocket类编程的 步骤有所不同,参表51 序号 服务器( Server) 客户机( Client) //构造一个套接字 //构造一个套接字 CAsyncSocket sock Srvr; CAsync Socket sockClient //刨建 SOCKET句柄,绑定到指定的端口|//刨建 SOCKET旬柄,使用默认参数 sockSrvr. Create(nPort) sockClient. Create 3 //启动监听,时刻准备接受连接请求 sockSrvr. Listen(; //请求连接到服务器 sockClient. Connect(strAddr npor //构造一个新的空的套接字 CAsyncSocket sockRecv //接收连接请求 sockSrvr. Accept( ockRecv) //接收数据 //发送数据 sockRecv. Receive(pBuf, nLen) sockClient. Send(pBuf, nLen 7 //发送数据 //接收数据 sockRecv. Send(pBuf, nLen sockClient. ReceivelpBuf, nLen) 8 //关闭套接字对象 //关闭套接字对象 sockRecv. Close sockClient. Close()
网络应用程序一般采用客户/服务器模式,它们使用CAsyncSocket类编程的 步骤有所不同,参表5.1。 5.1.1 使用CAsyncSocket类的一般步骤 P110 序 号 服务器(Server) 客户机(Client) 1 //构造一个套接字 CAsyncSocket sockSrvr; //构造一个套接字 CAsyncSocket sockClient; 2 //创建SOCKET句柄,绑定到指定的端口 sockSrvr.Create(nPort); //创建SOCKET句柄,使用默认参数 sockClient.Create( ); 3 //启动监听,时刻准备接受连接请求 sockSrvr.Listen( ); 4 //请求连接到服务器 sockClient.Connect(strAddr, nport); 5 //构造一个新的空的套接字CAsyncSocket sockRecv; //接收连接请求sockSrvr.Accept(sockRecv); 6 //接收数据 sockRecv.Receive(pBuf, nLen); //发送数据 sockClient.Send(pBuf, nLen); 7 //发送数据 sockRecv. Send(pBuf, nLen); //接收数据 sockClient.Receive(pBuf, nLen); 8 //关闭套接字对象 sockRecv.Close( ); //关闭套接字对象 sockClient.Close( );
5.1.1使用 CAsyncSocket类的一般步骤P110 (1)客户机与服务器端都要首先构建一个 CASyncSocke对象, 然后使用该对象的 Creat成员函数来创建底层的 SOCKET句柄。 服务器端一定要绑定到特定的端口 2)服务器端的套接字对象应使用 CAsyncSocket: Listen成员 函数启动监听,当收到来自客户端的连接请求,就调用 CASyncSocket: Accept成员函数来接收,此时建立一个新的空 的 CAsyncSocket对象用于数据交换;客户端的套接字对象应使 用 CASyncSocket: Connect成员函数连接到服务器的套接字对象。 连接建立以后,双方可以进行数据交换。 (3)调用 CAsyncSocket的Send和 Receive对象与通信对方交换 数据。这些成员函数与 Windows socket api用法基本相同。 (4)关闭并销毁 CAsyncSocket对象
(1)客户机与服务器端都要首先构建一个CAsyncSocket对象, 然后使用该对象的Creaet成员函数来创建底层的SOCKET句柄。 服务器端一定要绑定到特定的端口。 (2)服务器端的套接字对象应使用CAsyncSocket::Listen成员 函数启动监听,当收到来自客户端的连接请求,就调用 CAsyncSocket::Accept成员函数来接收,此时建立一个新的空 的CAsyncSocket 对象用于数据交换;客户端的套接字对象应使 用CAsyncSocket::Connect成员函数连接到服务器的套接字对象。 连接建立以后,双方可以进行数据交换。 (3) 调用CAsyncSocket的Send和Receive对象与通信对方交换 数据。这些成员函数与Windows Socket API用法基本相同。 (4)关闭并销毁CAsyncSocket对象。 5.1.1 使用CAsyncSocket类的一般步骤 P110
5.1.1使用 CAsyncSocket类的一般步骤P110 使用 CASyncSocket类进行网络编程,具有较大的灵活性, 但编程者必须解决好以下3个问题: (1)阻塞问题。 CAsyncSocket类不支持阻塞工作模式。 (2)字节顺序的转换。用户程序需要自己对不同的字节进 行转换。 (3)字符串转换。用户程序需要自己解决如 Unicode和 multibyte set字符串之间的转换
使用CAsyncSocket类进行网络编程,具有较大的灵活性, 但编程者必须解决好以下3个问题: (1)阻塞问题。CAsyncSocket类不支持阻塞工作模式。 (2)字节顺序的转换。用户程序需要自己对不同的字节进 行转换。 (3)字符串转换。用户程序需要自己解决如Unicode和 multibyte set字符串之间的转换。 5.1.1 使用CAsyncSocket类的一般步骤 P110
5.12创建 CAsyncSocket类对象P111 这里将 CAsyncSocket类对象称为异步套接字对象。创建异 步套接字对象一般分为两个步骤,首先构造一个 CAsyncSocket 对象,再创建该对象的底层的 SOCKET句柄。 1.创建空的异步套接字对象 通过调用 CAsyncSocket类的构造函数,创建一个新的空 CASyncSocket类套接字对象,构造函数不带参数。然后必须调 用它的 Create成员函数,来创建底层的套接字数据结构,并绑 定它的地址
这里将CAsyncSocket类对象称为异步套接字对象。创建异 步套接字对象一般分为两个步骤,首先构造一个CAsyncSocket 对象,再创建该对象的底层的SOCKET句柄。 1.创建空的异步套接字对象 通过调用CAsyncSocket类的构造函数,创建一个新的空 CAsyncSocket类套接字对象,构造函数不带参数。然后必须调 用它的Create成员函数,来创建底层的套接字数据结构,并绑 定它的地址。 5.1.2 创建CAsyncSocket类对象 P111