第三章 MFC Winsock类编程

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#define FD_CLOSE
0x10
0x20
他们代表MFC套接字对象可以接受并处理的六种网 络事件,当事件发生时,套接字对象会收到相应的 通知消息,并自动执行套接字对象响应的事件处理 函数。
(1)FD_READ事件通知:通知有数据可读。 (2)FD_WRITE事件通知:通知可以写数据。
(3)FD_ACCEPT事件通知:通知监听套接字有 连接请求可以接受。
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消 息转换成回调函数。
typedef struct tagMSG { // msg HWND hwnd; //接收消息的窗口句柄 UINT message; //消息标识(ID) WPARAM wParam; //第一个消息参数 LPARAM lParam; //第二个消息参数 DWORD time; //消息产生的时间 POINT pt; //消息产生时鼠标的位置 } MSG;
1.六种套接字相关的事件与通知消息
参数Ievent可以选用的六个符号常量是在winsock.h 文件中定义的。 #define FD_READ #define FD_WRITE #define FD_OOB #define FD_ACCEPT 0x01 0x02 0x04 0x08
#define FD_CONNECT
第三章 MFC Winsock类编程
2011-03-31
主要内容
3.1 MFC简介 3.2 CAsyncSocket类 3.3 基于CAsyncSocket类的单点聊天程序 3.4 CSocket类 3.5 基于CSocket类的多点聊天程序
3.1 MFC简介
1. MFC编程框架
使用应用程序向导(AppWizard)生成应用程序 的骨架文件(代码和资源等); 使用资源编译器直观地设计用户接口; 使用类向导(ClassWizard)将代码添加到骨架 文件; 使用编译器可以通过类库实现应用程序特定的逻 辑。
3.2 CAsyncSocket类
使用CAsyncSocket类编程的一般步骤
序号 服务器(Server) 客户机(Client)
1
2Biblioteka Baidu
//构造一个套接字 CAsyncSocket sockSrvr;
//创建SOCKET句柄,绑定到指定的端 口 sockSrvr.Create(nPort);
//构造一个套接字 CAsyncSocket sockClient;
格 式 一 : BOOL Connect( lpszHostAddress, UINT nHostPort ); LPCTSTR
格 式 二 : BOOL lpSockAddr,
Connect( const
SOCKADDR*
int nSockAddrLen );
如 果 调 用 成 功 或 者 发 生 了 WSAEWOULDBLOCK错误,当调用结束返回 时,都会发生FD_CONNECT事件,MFC框架 会自动调用客户端套接字的OnConnect()事 件处理函数,并将错误代码作为参数传送给它。 它的原型调用格式如下,
virtual void OnConnect( int nErrorCode );
3.2.4 服务器接受客户机的连接请求
在服务器端,使用CAsyncSocket流式套接字 对象,一般按照以下步骤来接收客户端套接字 对象的连接请求。 (1)服务器应用程序必须首先创建一个 CAsyncSocket流式套接字对象,并调用它的 Create成员函数创建底层套接字句柄。这个套 接字对象专门用来监听来自客户机的连接请求, 所以称它为监听套接字对象。
3.1 MFC简介
3. 消息映射的实现
Windows应用程序的输入由Windows系统以消 息的形式发送给应用程序的窗口。这些窗口通 过窗口过程来接收和处理消息,然后把控制返 还给Windows ① 消息的分类:
队列消息和非队列消息 系统消息和应用程序消息
3.1 MFC简介
② MSG消息结构和消息处理 消息结构:
//创建SOCKET句柄,使用默认参数 sockClient.Create();
3
4 5
//启动监听,时刻准备接受连接请求 sockSrvr.Listen();
//请求连接到服务器 sockClient.Connect(strAddr.nport); //构造一个新的空的套接字来接受连接 CAsyncSocket sockRecv; sockSrvr.Accept(sockRecv); //接收数据 sockRecv.Receive(pBuf, nLen); //发送数据 sockRecv.Send(pBuf, nLen); //关闭套接字对象 sockRecv.Close(); //发送数据 sockClient.Send(pBuf, nLen); //接收数据 sockClient.Receive(pBuf, nLen); //关闭套接字对象 sockClient.Close();
3.1 MFC简介
④ MFC消息映射的定义和实现 MFC处理的三类消息:
Windows消息,前缀以“WM_”打头,WM_COMMAND例外。 控制通知消息,是控制子窗口送给父窗口的WM_COMMAND 通知消息。 命令消息,这是来自菜单、工具条按钮、加速键等用户接口 对象的WM_COMMAND通知消息,属于应用程序自己定义的 消息。
该结构包括了六个成员,用来描述消息的有关 属性:
3.1 MFC简介
③ 消息处理
所有的MFC窗口都使用同一窗口过程,程序员不必去 设计和实现自己的窗口过程,而是通过MFC提供的一 套消息映射机制来处理消息。 所谓消息映射,简单地讲,就是让程序员指定要某个 MFC类(有消息处理能力的类)处理某个消息。 MFC提供了工具ClassWizard来帮助实现消息映射, 在处理消息的类中添加一些有关消息映射的内容和处 理消息的成员函数。程序员将完成消息处理函数,实 现所希望的消息处理能力。
3.重载套接字对象的回调函数 如果你从CAsyncSocket类派生了自己的套接 字类,你必须重载你的应用程序所感兴趣的那 些网络事件所对应的通知函数。
MFC框架自动调用通知函数,使得你可以在套 接字被通知的时候来优化套接字的行为。
3.2.4 客户端套接字对象请求连接到服务器 端套接字对象
在服务器端套接字对象已经进入监听状态 之 后 , 客 户 应 用 程 序 可 以 调 用 CAsyncSocket 类 的 Connect() 成 员 函 数 , 向服务器发出一个连接请求,
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 );
3.1 MFC简介
2. MFC对象和Windows对象的关系
应用的数据结构不同
MFC对象是相应C++类的实例,由MFC或者编程者定义 Windows对象是Windows操作系统内部结构的实例,通 过句柄来引用
所处的层次不同
MFC对象是高层的 Windows对象是低层的
创建的机制不同
virtual void OnClose(int nErrorCode); FD_CLOSE事件
对应
virtual void OnOutOfBandData(int nErrorCode); 对 应 FD_OOB事件
当某个网络事件发生时,MFC框架会自动 调用套接字对象的对应的事件处理函数。这 就相当给了套接字对象一个通知,告诉它某 个重要的事件已经发生。所以也称之为套接 字类的通知函数(notification functions) 或回调函数(callback functions)。
6 7 8
3.2.2 创建CasyncSocket类对象
本书将CAsyncSocket类对象称为异步套接 字对象。创建异步套接字对象一般分为两个步 骤,首先构造一个CAsyncSocket对象,再创 建该对象的底层的SOCKET句柄。
1.创建空的异步套接字对象
通过调用CAsyncSocket类的构造函数,创 建一个新的空CAsyncSocket类套接字对象, 构造函数不带参数。然后必须调用它的Create 成员函数,来创建底层的套接字数据结构,并 绑定它的地址。
MFC对象是由程序通过调用类的构造函数直接创建 Windows对象是由相应的SDK函数创建的
3.1 MFC简介
2. MFC对象和Windows对象的关系
二者转换的方式不同
使用的范围不同
MFC对象只服务于创建它的进城,对系统的其他进城 来说是不可见、不可用的
销毁的方法不同
MFC对象随着析构函数的调用而消失 Windows对象必须由相应的Windows操作系统函数销 毁
举例:创建一个使用27端口的流式异步套接 字对象。
CAsyncSocket* pSocket = new CAsyncSocket;
int nPort = 27;
pSocket->Create( nPort, SOCK_STREAM );
3.2.3 关于CAsyncSocket类可以接受并处理的 消息事件
有两种使用方法,会在不同的位置创建。
(1)如:CAsyncSocket aa; aa.Create(。。。。。。); (2)如: CAsyncSocket* Pa; Pa = new CAsyncSocket;
Pa->Create(。。。。。。);
2.创建异步套接字对象的底层套接字句柄
通过调用CAsyncSocket类的Create()成员函数, 创建该对象的底层套接字句柄,决定套接字对象的具 体特性。调用格式为:
MFC消息映射的实现方法
MFC使用ClassWizard帮助实现消息映射,它在源码中添加一 些消息映射的内容,并声明和实现消息处理函数。
3.1 MFC简介
4. MFC应用程序的执行过程
MFC程序的启动
第一、AFX内部初始化,包括应用程序对象状态初始 化和主线程初始化 第二、执行由MFC框架提供的标准函数WinMain() 第三、调用CWinApp类的虚函数InitInstance(),初始化 应用程序的当前实例 第四、调用CWinApp的Run()函数,运行消息循环和 空闲处理 第五、当收到WM_QUIT消息,调用ExitInstance()函 数,退出消息循环,并做应用程序退出时的清理工作
(4)FD_CONNECT事件通知:通知请求连接的 套接字,连接的要求已被处理。 (5)FD_CLOSE事件通知:通知套接字已关闭。
(6)FD_OOB事件通知:通知将有带外数据到达。
2.MFC框架对于六个网络事件的处理 当上述的网络事件发生时,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事件 对应 对应 对应 对应
相关文档
最新文档