网络编程WSAasyselect模型.ppt_第1页
网络编程WSAasyselect模型.ppt_第2页
网络编程WSAasyselect模型.ppt_第3页
网络编程WSAasyselect模型.ppt_第4页
网络编程WSAasyselect模型.ppt_第5页
免费预览已结束,剩余23页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、WSAAsyncSelect模型,WSAAsyncSelect模型是Windows Sockets的一个I/O模型,利用该模型应用程序可以在一个套接字上,接收以Windows消息为基础的网络事件。 Windows Sockets应用程序在创建套接字后,调用WSAAsyncSelect函数注册感兴趣的网络事件。当该事件发生时Windows窗口收到消息,然后应用程序就可以对接收到的网络事件进行处理。 WSAAsyncSelect模型是非阻塞的。,与Selcect模型的比较,相同点: 都可以对Windows套接字应用程序所使用的多个套接字进行有效的管理。 不同点: WSAAsynselcet模型是异

2、步的,在应用程序中调用WSAAsynselcet()函数,通知系统感兴趣的网络事件,该函数立刻返回,应用程序继续运行。 在发生网络事件时,应用程序得到的通知方式不同,select返回时,会利用FD_ISSET判断套接字是否存在于可读可写集合中。WSAAsynselcet模型则是由操作系统向应用程序发送消息。 WSAAsynselcet模型应用在基于消息的Windows环境下,使用该模型必须创建窗口,而Select模型则广泛用于Unix和Windows系统,不需要创建窗口。 应用程序调用WSAAsynselcet()函数后,自动将套接字设置为非阻塞模式,而应用程序调用Select()函数后,并不

3、能改变该套接字的工作方式。,WSAAsyncSelect模型的实现,WSAAsyncSelect()函数 是模型的核心 创建窗口和窗口例程 模型应用在基于消息的Windows应用程序中,WSAAsyncSelect()是Winsock提供的一个适合于Windows编程使用的函数。 若在一个套接口上发生特定的网络事件,它给Windows网络应用程序(窗口或对话框)发送一个消息(事件通知)。 函数成功调用后,当指定的网络事件发生时,会自动执行该窗口对应的窗口回调例程。并将网络事件通知,以及Windows消息的相关信息,传递给该例程的入口参数,用户可以在该例程中添加自己的代码,针对不同的网络事件进行

4、响应,从而实现有序的套接字输入和输出。,1函数格式,int WSAAsyncSelect( SOCKET s, HWND hWnd, unsigned int wMsg, long lEvent );,2函数参数说明 s:传入参数,标识一个需要事件通知的套接口。 hWnd:传入参数,标识一个在网络事件发生时想要收到消息的窗口或对话框的句柄。 wMsg:传入参数,在网络事件发生时要接收的消息,该消息会投递到hWnd句柄指定的窗口或对话框。,When one of the nominated network events occurs on the specified socket s, the

5、applications window hWnd receives message wMsg. The wParam parameter identifies the socket on which a network event has occurred. The low word of lParam specifies the network event that has occurred. The high word of lParam contains any error code. The error code be any error as defined in Winsock2.

6、h.,表8-5 WSAAsyncSelect()函数常用的网络事件,lEvent:传入参数,位掩码,用于指明应用程序感兴趣的一系列网络事件集合。若对多个网络事件感兴趣,只需对多种类型进行“或”操作。 例如:WSAAsyncSelect(s, hWnd, wMsg, FD_READ|FD_WRITE);,3函数返回信息 若应用程序感兴趣的网络事件声明成功,则返回0; 如果声明失败,则返回SOCKET_ERROR错误信息。可进一步通过调用WSAGetLastError()函数返回特定错误代码。,4函数使用说明 (1) 若应用程序对一个套接口s调用了WSAAsyncSelect()函数,那么套接口s

7、的模式会自动从阻塞模式变成非阻塞模式。 (2) 如果应用程序同时对多个网络事件感兴趣,那么只需对各种类型的网络事件执行按位或(OR)的运算即可。 (3) 特别要注意的是,进行一次WSAAsyncSelect()调用,将使为同一个套接口启动的所有以前的WSAAsyncSelect()调用作废。,FD_READ和FD_WRITE调用WSAAsyncSelect(): rc=WSAAsyncSelect(s, hWnd, wMsg, FD_READ|FD_WRITE); 而不能使用如下的调用方式,因为第二次调用将会使第一次调用的作用失效: rc=WSAAsyncSelect(s, hWnd, wMs

8、g1, FD_READ); rc=WSAAsyncSelect(s, hWnd, wMsg2, FD_WRITE);,(4) 如果要取消所有的通知,也就是指出Windows Sockets的实现不再在套接口上发送任何和网络事件相关的消息,则把lEvent字段置为0,然后调用WSAAsyncSelect()。格式如下: rc=WSAAsyncSelect(s, hWnd, 0, 0); (5) 当某一套接口s上发生了一个已命名的网络事件时,应用程序窗口hWnd会接收到消息wMsg。 应用程序窗口例程的wParam参数标识网络事件发生的套接口。 lParam参数的低位字指明发生的网络事件; lPa

9、ram参数的高位字包含一个错误代码,该错误代码可以是Winsock2.h中定义的任何错误。,错误代码和事件可以通过WSAGETSELECTERROR和WSAGETSELECTEVENT宏从lParam中取出,宏的定义如下: #define WSAGETSELECTERROR(lParam) HIWORD(lParam) #define WSAGETSELECTEVENT(lParam) LOWORD(lParam) 若应用程序发现套接口上没有产生任何错误,接着便应检查lParam的低位字,以弄清到底是哪个网络事件类型造成了这条Windows消息的触发。,WSAAsyncSelect()与窗口,

10、若使用WSAAsyncSelect(),首先必须用CreateWindows函数创建一个窗口或对话框,并为该窗口/对话框提供一个回调例程。 设置好窗口框架后,就可以创建socket,并调用WSAAsyncSelect(),在该函数中,指定关注的socket、窗口句柄、打算接收的消息,以及程序感兴趣的套接口事件。 成功执行WSAAsyncSelect()之后,就等于打开了窗口的消息通知,并注册了事件。 WSAAsyncSelect()执行时,当注册的套接口事件之一发生时,指定的窗口就会收到指定的消息,并自动执行该窗口的回调例程,用户可在窗口回调例程中添加自己的代码,处理相应的事件。,窗口回调例程

11、,用户可以在回调例程中添加自己的代码,处理不同的网络事件。 窗口回调例程的定义 LRESULT CALLBACK WindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); hWnd:标识一个窗口句柄对窗口例程的调用正是由该窗口发出的。 uMsg:指示引发调用此函数的消息。可能是Windows的标准消息,也可能是WSAAsyncSelect()调用中用户定义的消息。 wParam参数标识发生网络事件的套接口。 lParam参数的低位字指明发生的网络事件; lParam参数的高位字包含一个错误代码。,窗口回调例程举例,网络消

12、息事件到达一个窗口例程后,窗口例程首先检查lParam的高位字,以判断是否发生了套接口错误。 若没有发送任何错误,接着就判断到底发生了那个网络事件类型才导致这条消息的触发。 下面是一个服务器程序,说明如何使用WSAAsyncSelect()来实现窗口消息的管理。 程序着重强调了开发一个基本服务器应用所涉及到的基本步骤,忽略了开发一个完整的应用程序所涉及的大量编程细节。,#define WM_SOCKET WM_USER+1 #include /程序主函数 int WinMain(HINSTANCE hInstance, /应用程序当前实例句柄 HINSTANCE hPrevInstance,

13、/应用程序其它实例句柄 LPSTR lpCmdLine, /应用程序命令行参数的指针 int nCmdShow /应用程序开始执行时窗口显示方式的整数值标识 ) SOCKET Listen; /监听套接口 HWND Windows; /窗口句柄 SOCKADDR InternetAddr; /定义地址结构变量 /创建窗口,并将ServerWinProc回调例程分配在该窗口下 Windows=CreateWindow();,/初始化WinSock,并创建套接口 WSAStatup(); Listen=Socket(); InternetAddr.family=AF_INET; InternetA

14、ddr .sin_addr.s_addr=htonl(INADDR_ANY); /将套接口绑定到5150端口 InternetAddr.sin_port=htons(5050); Bind(Listen,(PSOCKADDR) /翻译并发送Windows消息,直到应用程序终止。 /end WinMain,/创建窗口的回调例程,通常由一个或多个switch语句构成 LRESULT CALLBACK ServerWndProc(HWND hDlg, WORD wMsg, WORD wPara, DWORD lPara) SOCKET Accept; switch (wMsg) case WM_PA

15、INT: /处理Windows Paint消息 break; case WM_SOCKET: /使用宏判断套接口上是否发生错误 if ( WSAGETSELECTERROR(lPara) /显示错误信息且关闭套接口 closesocket(wPara); break; /下面判断该套接口上出现了什么事件,switch(WSAGETSELECTEVENT(lParam) ) case FD_ACCEPT: /在监听套接口接收连接请求,产生响应套接口 Accept=accept(wPara,NULL,NULL); /为响应套接口注册r/w/close事件,启动消息通知 WSAAsyncSelect

16、(Accept,hWnd,WM_SOCKET, FD_READ|FD_write|FD_CLOSE); break; case FD_READ:/数据已到,可从wPara中的套接口接收数据 break; case FD_WRITE:/wPara中的套接口已经准备好发送数据 break; case FD_CLOSE: /连接已经关闭,可以关闭套接口 closesocket(wPara); break; /end case WM_SOCKET break; /end switch(wMsg) return TRUE; /end ServerWinProc,8.5.5 取消正在执行的阻塞调用WSAC

17、ancelBlockingCall() 如果在应用程序中想取消正在执行的阻塞调用,就要使用WSACancelBlockingCall()函数。 在Winsock 2的实现规范中已经不包括该函数。 1函数格式 int WSACancelBlockingCall( void ); 2函数返回信息 如果阻塞操作被成功地取消,则函数返回0; 否则返回SOCKET_ERROR错误信息,可通过WSAGetLastError()获得错误代码。,3函数使用说明 本函数取消任何本任务中尚未完成的阻塞操作。通常用于以下两种情况: 在一个阻塞调用进行时,应用程序也在处理接收到的消息,这时,WSAIsBlocking

18、()返回True。 中止Windows消息调度,将控制转移到Windows Sockets的阻塞例程中。 (2) 一个阻塞调用在进行时,Windows Sockets已经回调了应用程序的“阻塞钩子”函数(如WSASetBlockingHook()。 阻塞调用将在阻塞钩子函数完成时中止。 这两种情况,原来的阻塞调用将尽快中止,并产生错误码WSAEINTR。,在进行阻塞的connect()操作的情况下,WinSock的实现将尽可能中止阻塞调用,但在连接完成(已经复位)或超时之前,它不可能释放套接口资源。 同样值得注意的是,在应用程序立即尝试打开一个新的套接口(若没有可用的套接口),或试图连接(connect()同一个套接口时。取消一个accept()或select()调用不会迫使套接口经过这些调用。 取消任何除accept()和select()之外的操作,可能会导致套接口进入非终结状态。,如果一个应用程序取消了一个套接口上的阻塞操作,应用程序唯一可以在套接口上操作的函数调用就是CloseSocket()。尽管其它一些操作可以在一些Windows Sockets实现上运作。 如果一个应用程序想获得最大的可移植性,它必须注意不要在取

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论