您的位置:首页 > 其它

Windows IO模型-WSAAsynSelect模型(异步阻塞模型)

2017-09-08 13:40 337 查看
WSAAsyncSelect-异步选择模型()

异步选择(WSAAsyncSelect)模型:属于被动通知,基于消息机制,需要向Windows注册消息,当对应的网络事件发生时,向指定窗口发送指定消息。

缺点:(1)消息不安全,而且会慢,消息的过程比较复杂。(2)基于窗口,必须要有窗口,所以平台有限制。

  

1、向windows注册网络事件

█ WSAAsyncSelect的函数原型如下:

int WSAAsyncSelect(

  __in         SOCKET s,         //注册的socket

  __in         HWND hWnd,     //网络事件发生以后,想要收到通知消息的窗口

  __in         unsigned int wMsg,  //自定义的消息UM_MSG。

  __in         long lEvent        //指定一个位掩码,对应于一系列网络事件的组合

);

网络事件lEvent参数:

FD_READ       应用程序想要接收有关是否可读的通知,以便读入数据

FD_WRITE   应用程序想要接收有关是否可写的通知,以便写入数据

FD_ACCEPT    应用程序想接收与进入连接有关的通知

FD_CONNECT  应用程序想接收与一次连接完成的通知

FD_CLOSE     应用程序想接收与套接字关闭的通知

 

2、MFC中创建专门用来接收消息的窗口,

2.1、添加父类为CFramWnd的类CMyWnd

BOOL CWnd::Create(LPCTSTR lpszClassName,   //注册窗口类,通过注册得到的

 LPCTSTR lpszWindowName,   //
窗口标题

 DWORD dwStyle,             //窗口风格

    const RECT& rect,              //窗口矩形

                CWnd* pParentWnd, UINT nID,  

                CCreateContext* pContext)

 

BOOL CFrameWnd::Create(LPCTSTR lpszClassName,   //窗口的类名,通过注册得到的

 LPCTSTR lpszWindowName,   //窗口标题

 DWORD dwStyle= WS_OVERLAPPEDWINDOW,    //窗口风格

    const RECT& rect = rectDefault,              //窗口矩形

                CWnd* pParentWnd = NULL,

LPCTSTR lpszMenuName = NULL,   

                CCreateContext* pContext = NULL)

2.2、CMyWnd类中添加消息:

消息定义:LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);

消息映射:ON_MESSAGE(UM_MSG,&CMyWnd::OnMyMessage);

消息实现:LRESULT CMyWnd::OnMyMessage(WPARAM wParam, LPARAM lParam);

wParam 存放有事件发生的socket,lParam:存放发生网络事件的类型

2.2、在CMyWnd中使用单例模式,即在注册网络事件的类中不需要定义对象,在cpp中调用静态接口函数即可

CMyWnd::GetMyWnd()->Create(NULL,”Mywnd”);

获取窗口句柄:m_myWnd.m_hWnd  =》GetMyWnd()->m_hWnd.

2.3、CMyWnd将消息处理函数传进来的参数,socket和网络事件类型直接转发给网络注册所在类中,
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息