WSAAsyncSelect模型.ppt
《WSAAsyncSelect模型.ppt》由会员分享,可在线阅读,更多相关《WSAAsyncSelect模型.ppt(64页珍藏版)》请在三一办公上搜索。
1、WSASsyncSelect模型,前面学习的Windows Sockets select模型。在应用程序中调用select()函数时,会发生阻塞现象。开发人员可以通过select()函数的timeout参数,设置函数调用的阻塞时间,在设定时间内,线程保持等待,直到其中的一个或者多个套接字满足可读或者可写的条件,该函数才返回。,WSAAsyncSelect模型是非阻塞的。如图所示,Windows Sockets 应用程序在调用recv()函数接收数据前,调用WSAAsyncselect()函数注册网络事件。WSAAsyncselect()函数立即返回,线程继续运行。当系统中数据准备好时,向应用程
2、序发送消息。应用程序接收到这个消息后,调用recv()函数接收数据。,与select模型比较,WSAAsyncSelect模型与Select模型的相同点:都可以对Windows套接字应用程序所使用的多个套接字进行有效的管理。WSAAsyncSeelect模型与Select模型相比存在以下不同:WSAAsyncSelet模型是异步的。在应用程序中调用WSAAsyncSelect()函数,通知系统感兴趣的网络事件,该函数立即返回,应用程序继续运行。,发生网络事件时,应用程序得到通知的方式不同。Select()函数返回时,说明某个或者某些套接字满足可读可写的条件,应用程序需要使用FD_ISSET宏,
3、判断套接字是否存在于可读可写集合中。而对于WSAAsyncSelect模型来说,当网络事件发生时,系统向应用程序发送消息。,WSAAsyncSelect模型应用在基于消息的Windows环境下,使用该模型时必须创建窗口。而Slelect模型广泛应用在Unix系统和Windows系统,使用模型不需要创建窗口。应用程序中调用WSAAsyncSelect()函数后,自动将套接字设置为非阻塞模式。而应用程序中调用select()函数后,并不能改变该套接字的工作方式。,套接字WSAAsyncSelect模型实现,WSAAsyncSelect模型核心是WSAAsyncSelect()函数,该函数使得Win
4、dows应用程序能够接收网络事件消息。在应用程序窗口例程中对接收到的网络事件进行处理。由于WSAAsyncSelect模型应用在基于消息的Windows应用程序中,所以本节还将讲解窗口例程和如何创建窗口等内容。,WSAAsynSelect()函数,int WSAAsyncSelect(SOCKET s,HWND hWnd,unsigned int wMsg,long lEvent),s:需要事件通知的套接字。hWnd:当网络事件发生时接收消息的窗口句柄。wWsg:当网络事件发生时窗口收到的消息。lEvent:应用程序感兴趣的网络事件集合。应当用程序中调用该函数后,自动将套接字设置为非阻塞模式。
5、通常,应用程序声明的消息要比Windows的WM_USER值大,以避免该消息与Windows预定消息发生混淆。,注册哪种网络事件,取决于实际的需要。如果应用程序同时对多个网络事件感兴趣。需要对网络事件类型执行按位OR(或)运算。然后将它们分配给lEvent参数。例如,应用程序希望在套接字上接收有关连接完成、数据可读和套接字关闭的网络事件。那么在应用程序中,调用WSAAsyncSelect()函数如下所示:WSAAsyncSelect(s,hWnd,WM_SOCKET,FD_CONNECT|FD_READ|FD_CLOSE);,当该套接字连接完成、有数据可读或者套接字关闭的网络事件事件发生时,就
6、会有WM_SOCKET消息发送给窗口句柄为hWnd窗口。,窗口例程,当调用WSAAsyncselect()函数后,应用程序会在hWnd窗口例程,以消息形式接收网络事件通知。窗口例程是回调函数,当成功创建窗口后由系统调用。窗口例程声明如下:LRESULT CALLBACK WindowProc(HWND hWnd,/窗口句柄UINT uMsg,/消息WPARAM wParam,/消息参数 LPARAM lParam,/消息参数);,hWnd:窗口句柄。uMsg消息。对Windows Sockets应用程序来说感兴趣的是在 WSAAsyncSelect()函数中,由应用程序定义的消息。wParam
7、:消息参数。在 Windows Sockets应用程序中,该参数指明发生网络事件的套接字。lParam:消息参数。在 Windows sockets 应用程序中,该参数低字节指明已经发生的网络事件。高字节包含可能出现的错误代码。,在Windows sockets 应用程序中,当WindowProc()函数接收到网络事件消息时,在该函数内执行下面步骤:(1)读取lParam参数高字节,判断是否发生了一个网络错误事件。可以使用 WSAGETSELECTERROR宏。(2)如果应用程序发现套接字上没有发生任何错误,则读取Iparam低字节,检查到底是发生了什么网络事件。可以使用WSAGETSELEC
8、TEVENT宏。,WSAGETSELECTERROR和WSAGETSELECTEVENT宏声明如下:#define WSAGETSELECTEVENT(lParam)LOWORD(lParam)#define WSAGETSELECTERROR(lParam)HIWORD(lParam),WSAAsyncSelect模型示例程序,下面讲解一个服务器程序。该程序是Win32 Application。在该程序中使用WSAAsyncSelect模型管理接受的客户端套接字。该程序是示例程序,忽略主许多细节。程序设计如图所示,按照下面步骤编码。,1.声明自定义消息。在程序中声明自定义消息WM_SOCKE
9、T。2.声明窗口例程。3.调用MyRegisterClass()函数注册窗口类。4.调用InitInstance()函数创建并显示窗口。因为WSAAsyncSelect()函数的第一个参数是窗口句柄,所以要在调用该函数之前创建窗口。5.初始化套接字动态库,创建套接字。6.调用WSAAsyncSelect()函数注册感兴趣网络事件。该示例程序中,服务器监听套接字,感兴趣的网络事件有FD_ACCEPT和FD_CLOSE.7.绑定套接字,开始监听。8.消息循环。9.释放套接字和申请的其他资源。,1.声明自定义消息,在应用程序中,通常要声明一个比WM_USER值要大的自定义消息,以免与Windows定
10、义的消息冲突。除了声明自定义消息外,在示例程序中还要声明最大字符串长度、服务器端口、数据缓冲区长度。#define MAX_LOADSTRING100/最大字符串长度#define WM_SOCKETWM_USER+1/套接字消息#define PORT5150/服务器端口#define MAX_SIZE_BUF 1024/数据缓冲区长度,2.声明窗口例程,窗口例程是由Windows系统调用的函数,通常将该函数的定义放在主函数之后,将声明放在主函数之前。在示例程序中为了使主程序结构清晰,将注册窗口类、创建和显示窗口的过程都设计为函数,并提前声明。声明HandleSocketMsg()函数用于对
11、Windows网络事件消息进行处理。ATOM MyRegisterClass(HINSTANCE hInstance);/注册窗口BOOL InitInstance(HINSTANCE,int);/初始化实例/窗口例程LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);/处理WM_SOCKET消息void HandleSocketMsg(WPARM wParam,LPARAM lParam);,3.注册窗口类,调用MyRegisterClass()函数注册窗口类。,4.创建和显示窗口,调用InitInstance()函数创建、显示窗口。此时,窗口
12、例程开始接收Windows消息。,5.创建套接字,调用WSAStartup()函数初始化套接字动态库,调用socket()函数创建套接字。,6.注册感兴趣的网络事件,以窗口名柄hWnd和WM_SOCKET为第2、第3个参数调用WSAAsyncSelect()函数。同时注册FD_ACCRPT和FD_CLOSE网络事件。请求系统当FD_ACCEPT和FD_CLOSE网络事件发生时,给hWnd窗口发送WM_SOCKET消息。,WSAAsyncSelect(sListen,hWnd,WM_SOCKET,FD_READ|FD_CLOSE);,7.绑定套接字,调用bind()函数绑定套接字。,8.开始监听
13、,调用listen()函数套接字开始监听。,9.消息循环,在while循环语句中,GetMessage()函数不断从线程消息队列中取出消息。当FD_ACCEPT或者FD_CLOSE网络事件发生时,WM_SOCKET消息被投递到线程消息队列中,GetMessage()函数负责将该消息从线程消息队列中取出,DispatchMessage()函数再将消息发送到窗口例程。,10.程序退出,当GetMessage()函数接收到WM_QUIT消息时,while循环结束,释放资源,程序退出。,11.窗口例程,当创建窗口成功后WndProc()窗口例程便开始接收Windows消息。在该函数中需要处理许多消息。
14、例如,当关闭窗口时发送WM_DESTROY消息,在窗口例程中调用PostQuitMessage()函数向线程消息队列投递WM_QUITI消息,GetMessage()函数接收到该消息后,程序退出。,应用程序不感兴趣的消息交给DefWindowProc()函数处理。当FD_ACCEPT或者FD_CLOSE网络事件发生时,窗口例程接收到WM_SOCKET消息。在窗口例程中调用HandleSocketMsg()函数对触发WM_SOCKET消息的网络事件进行处理。,/窗口例程LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARA
15、M lParam)switch(message)case WM_SOCKET:/网络事件发生时发送给该窗口的消息 HandleSocketMsg(wParam,lParam);/处理该消息 break;case WM_PAINT:/画客户区/break;case WM_DESTROY:PostQuitMessage(0);break;/消息处理default:return DefWindowProc(hWnd,message,wParam,lParam);return 0;,12.CClient类,在程序中声明Cclient类管理服务器接受客户端的新建套接字。该类构造函数的参数为服务器接受客户
16、端的新建套接字。在析构函数中将套接字关闭。在该类中声明RecvData()函数接收数据,SendData()函数发送数据,GetSocket()函数返回套接字。,#define MAX_SIZE_BUF1024/数据缓冲区长度class CClient public:CClient(SOCKET s);/构造函数 virtual CClient();/析构函数 public:void RecvData(void);/接收数据 void SendData(void);/发送数据 SOCKET GetSocket(void);/获取套接字private:SOCKET m_s;/套接字 char m
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- WSAAsyncSelect 模型

链接地址:https://www.31ppt.com/p-6523986.html