WinSock类的编程课件

上传人:我*** 文档编号:143667973 上传时间:2020-09-01 格式:PPT 页数:68 大小:984.50KB
返回 下载 相关 举报
WinSock类的编程课件_第1页
第1页 / 共68页
WinSock类的编程课件_第2页
第2页 / 共68页
WinSock类的编程课件_第3页
第3页 / 共68页
WinSock类的编程课件_第4页
第4页 / 共68页
WinSock类的编程课件_第5页
第5页 / 共68页
点击查看更多>>
资源描述

《WinSock类的编程课件》由会员分享,可在线阅读,更多相关《WinSock类的编程课件(68页珍藏版)》请在金锄头文库上搜索。

1、第五章 MFC WinSock类的编程,第五章 MFC WinSock类的编程,为简化套接字网络编程,更方便地利用Windows 的消息驱动机制,微软的 MFC提供了两个套接字类,在不同的层次上对Win Socket API函数进行了封装,为编写网络通信程序,提供了两种编程模式。,CAsyncSocket类,异步套节字类 在低层次上对Win Sockets API进行了封装。 特点: 它的成员函数和Windows Sockets API的函数调用直接对应。 一个CAsyncSocket对象代表了一个Windows套接字,它是网络通信的端点; 将那些与套接字相关的Windows消息变为该类的回调

2、函数。,CSocket类,从CAsyncSocket类派生,是对Win Sockets API的高级封装。继承了CAsyncSocket类的许多成员函数。CSocket类的高级表现在三个方面: CSocket结合archive类来使用套接字。 CSocket管理了通信的许多方面,如字节顺序问题和字符串转换问题。 CSocket类为Windows消息的后台处理提供了阻塞的工作模式。,CSocket类,在MFC中,有一个名为afxSock.h的包含文件,在这个文件中定义了CAsyncSocket,CSocket,和CSocketFile这三个套接字类。,5.1 CasyncSocket类,CAsy

3、ncSocket类从Cobject类派生而来:,图5.1 CAsyncSocket类的派生关系,5.1.1 使用CAsyncSocket类的一般步骤,5.1.1 使用CAsyncSocket类的一般步骤,注意几个问题: 阻塞处理:不支持 字节顺序的转换,5.1.2 创建CasyncSocket类对象,CAsyncSocket类对象称为异步套接字对象。创建异步套接字对象分为两个步骤: 构造一个CAsyncSocket对象: CAsyncSocket aa; 创建该对象的底层的SOCKET句柄: aa.Create(),5.1.2 创建CasyncSocket类对象,Create函数创建底层套接字

4、句柄 通过调用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 );,5.1.2 创建CasyncSocket类对象,举例: 创建一个使用27端口的流式异步套接字对象。 CAsyncS

5、ocket* pSocket = new CAsyncSocket; int nPort = 27; pSocket-Create( nPort, SOCK_STREAM );,5.1.3 CAsyncSocket类的消息事件,1六种套接字相关的事件与通知消息 Create函数的参数Ievent为可以选用的符号常量,是在winsock.h文件中定义的: #define FD_READ 0 x01 可以Recv #define FD_WRITE0 x02可以Send #define FD_OOB 0 x04有带外数据到达 #define FD_ACCEPT0 x08有连接请求 #define F

6、D_CONNECT0 x10连接请求已处理 #define FD_CLOSE0 x20套接字已关闭,5.1.3 CAsyncSocket类的消息事件,他们代表MFC 套接字对象可以接受并处理的六种网络事件,当事件发生时,套接字对象会收到相应的通知消息,并自动执行套接字对象响应的事件处理函数。 FD_READ事件:通知有数据可读。 FD_WRITE事件:通知可以写数据。 FD_ACCEPT事件:通知监听套接字有连接请求可以接受。 FD_CONNECT事件:通知请求连接的套接字,连接的要求已被处理。 FD_CLOSE事件:通知套接字已关闭。 FD_OOB事件:通知将有带外数据到达。,5.1.3 C

7、AsyncSocket类的消息事件,2MFC框架对于六个网络事件的处理 按照Windows的消息驱动机制,MFC框架应当把消息发送给相应的套接字对象,并调用作为该对象成员函数的事件处理函数。事件与处理函数是一一映射的。,5.1.3 CAsyncSocket类的消息事件,在afxSock.h文件的CAsyncSocket类的声明中,定义了与这六个网络事件对应的事件处理函数: virtual void OnReceive(int nErrorCode); 对应 FD_READ事件 virtual void OnSend(int nErrorCode); 对应 FD_WRITE事件 virtual

8、void OnAccept(int nErrorCode); 对应 FD_ACCEPT事件 virtual void OnConnect(int nErrorCode); 对应 FD_CONNECT事件,5.1.3 CAsyncSocket类的消息事件,virtual void OnClose(int nErrorCode); 对应 FD_CLOSE 事件 virtual void OnOutOfBandData(int nErrorCode); 对应 FD_OOB 事件 当某个网络事件发生时,MFC 自动调用套接字对象对应的事件处理函数。这相当于给了套接字对象一个通知,告诉它某个重要的事件已

9、经发生。所以也称之为套接字类的通知函数或回调函数。,5.1.3 CAsyncSocket类的消息事件,3重载套接字对象的回调函数 如果从CAsyncSocket 类上派生了自己的套接字类, 你必须重载应用程序所感兴趣的那些网络事件所对应的通知函数。 MFC框架自动调用通知函数,这样可以在套接字被通知的时候来优化套接字的行为。,5.1.4 客户端请求连接到服务器端,服务器端套接字对象已经进入监听状态后,客户应用程序可以调用CAsyncSocket类的Connect()成员函数,向服务器发出一个连接请求: 格式一: BOOL Connect( LPCTSTR lpszHostAddress, UI

10、NT nHostPort ); 格式二: BOOL Connect( const SOCKADDR* lpSockAddr, int nSockAddrLen );,5.1.4 客户端请求连接到服务器端,如果调用成功或者发生了错误,当调用结束返回时,都会发生FD_CONNECT事件,MFC框架会自动调用客户端套接字的OnConnect()事件处理函数,并将错误代码作为参数传送给它。它的原型调用格式如下, void OnConnect( int nErrorCode ); nErrorCode=0时 连接成功,5.1.5 服务器接受客户机的连接请求,服务器端使用CAsyncSocket流式套接字

11、对象,按以下步骤来接收客户端的连接请求: 1)服务器程序必须首先创建一个CAsyncSocket流式套接字对象,并调用它的Create 成员函数创建底层套接字句柄(监听专用)。 2)调用监听套接字对象的Listen成员函数。调用格式是: BOOL Listen( int nConnectionBacklog=5);,5.1.5 服务器接受客户机的连接请求,当Listen 函数确认并接纳了一个来自客户端的连接请求后,会触发FD_ACCEPT事件,监听套接字会收到通知,表示监听套接子已经接纳了一个客户的连接请求,MFC框架会自动调用OnAccept事件处理函数,原型如下: void OnAccep

12、t( int nErrorCode ); 应重载此函数,在其中调用监听套接字对象的Accept函数,来接收客户端的连接请求。,5.1.5 服务器接受客户机的连接请求,3)创建一个新的空的套接字对象。这个套接字专门用来与客户端连接,并进行数据的传输。称为连接套接字。 4)调用监听套接字对象的Accept成员函数,调用格式为: virtual BOOL Accept( CAsyncSocket ,5.1.6 发送与接收流式数据,对于流式套接字对象: 则使用CAsyncSocket类的Send 成员函数向流式套接字发送数据 使用Receive成员函数从流式套接字接收数据。,5.1.6 发送与接收流式

13、数据,1用Send成员函数发送数据 格式:virtual int Send( const void* lpBuf, int nBufLen, int nFlags = 0); 对于一个CAsyncSocket套接字对象,当它的发送缓冲区腾空时,会激发FD_WRITE事件,套接字会得到通知,MFC 框架会自动调用这个套接字对象的OnSend 事件处理函数。 应重载这个函数,在其中调用Send成员函数来发送数据。,5.1.6 发送与接收流式数据,2用Receive成员函数接收数据 格式:int Receive( Void* lpBuf, Int nBufLen, Int nFlags = 0);

14、对于一个CAsyncSocket 套接字对象,当有数据到达它的接收队列时,会激发FD_READ事件,套接字会得到已经有数据到达的通知,MFC框架会自动调用这个套接字对象的 OnReceive事 件处理函数。应重载这个函数,调用Receive成员函数来接收数据。,5.1.7 关闭套接字,1使用CAsyncSocket类的Close成员函数 格式:void Close( ); 2使用CAsyncSocket类的ShutDown()成员函数 使用ShutDown()成员函数,可以选择关闭套接字的方式。将套接字置为不能发送数据,或不能接收数据,或二者均不能的状态。 格式:BOOL ShutDown(i

15、nt nHow=sends); receives、both,5.1.8 错误处理,调用CAsyncSocket对象的成员函数后,返回一个逻辑型的值: 执行成功,返回TRUE; 失败,返回FALSE。 调用CAsyncSocket对象的GetLastError()成员函数,来获取更详细的错误代码,并进行相应的处理。 格式:int GetLastError( );,5.1.9 其它的成员函数,1关于套接字属性的函数 SetSocketOpt:设置底层套接字的属性; GetSocketOpt:获取套接字的设置信息; IOCtl:控制套接字的工作模式;,5.1.9 其它的成员函数,2发送和接收数据 如

16、果创建的是数据报类型的套接字: 用SendTo()成员函数来向指定的地址发送数据,事先不需要建立发送端和接收端之间的连接 用ReceiveFrom()成员函数可以从某个指定的网络地址接收数据。,5.1.9 其它的成员函数,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);,5.1.9 其它的成员函数,ReceiveFrom也有两种重载的形式: int ReceiveFrom( void* lpBuf, int nBufLen, CString,5.2 CSocket类,CSocket类是从CAsyncSocket类派生而来的,它们的派生关系如图5.2

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号