当前位置:
首页
文章
移动端
详情

Socket工作模式之WSAAsyncSelect模型

WSAAsyncSelect(异步选择)模型

①WSAAsyncSelect(异步选择)模型介绍

Windows Sockets为了支持Windows消息驱动机制,使开发者能够方便地处理网络通信,它对网络事件采用基于消息的异步存取策略。该异步策略主要是通过异步选择函数WSAAsyncSelect()来实现的,该函数提供了消息机制的网络事件选择,当使用它登记的网络事件发生时,Windows应用程序相应的窗口函数收发消息,消息中指示了发生的网络事件,以及与事件相关的一些信息。

基于Windows消息机制的异步I/O模型。当有注册的消息机制到达时,系统进行通知,窗口对此消息进行处理。实际上是基于Windows消息机制的一种模型。

应用程序调用WSAAsyncSelect函数后自动将套接字设为非阻塞模式。而在使用select()函数时,并没有改变套接字工作方式。

②相应函数

int WSAAsyncSelect(SOCKET s, HWND hWnd, unsigned int wMsg, long IEvent);

功能:对套接字检测IEvent指定的网络时间,如果有事件发生,则给窗口hWnd发送消息wMsg。如指定了监测FD_READ事件,当读数据时不管是否读到数据都马上返回,如果返回一个错误信息表示还在等待,而在等待的数据到达后,就会发送消息wMsg给窗口hWnd,应用程序处理该消息读取网络数据。

参数:

s:要绑定的socket。

hWnd:是处理消息的窗口句柄。

wMsg:当网络事件发生时给窗口的消息,这个消息需要自己定义。

IEvent:要处理的网络事件。

启动WSAAsyncSelect()将使为同一个套接字启动的所有先前的WSAAsyncSelect()作废,如果接收读写通知WSAAyncSelect(s, hWnd, wMdg, FD_READ|FD_WRITE);而对不同的事件区分不同的消息是错误的(对同一个套接字针对不同的网络事件以不同的消息通知是不能的,因为在同一个套接字上消息是要一致的),如

WSAAsyncSelect(s, hWnd, wMsg1, FD_READ);

WSAAsyncSelect(s, hWnd, wMsg2, FD_WRITE);

定义后只有最后一次使用的有效,即只有FD_WRITE会通过wMsg2消息通知到,也就是如果要通知多个事件可以用或的形式将多个事件名称写在一起。另外如果要取消所有通知则:WSAAsyncSelect(s, hWnd, 0, 0);

大概流程:

SOCKET s;

HWND hWnd;

#define WM_NET_MSG WM_USER+1

int iRet=WSAAsyncSelect(s, this, WM_NET_MSG, FD_READ|FD_WRITE|FD_ACCEPT);

if(iRet !=0)

GetLastError();

免责申明:本站发布的内容(图片、视频和文字)以转载和分享为主,文章观点不代表本站立场,如涉及侵权请联系站长邮箱:xbc-online@qq.com进行反馈,一经查实,将立刻删除涉嫌侵权内容。