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

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     应用程序想接收与套接字关闭的通知

 

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

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.2CMyWnd类中添加消息:

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

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

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

wParam 存放有事件发生的socketlParam:存放发生网络事件的类型

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

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

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

2.3CMyWnd将消息处理函数传进来的参数,socket和网络事件类型直接转发给网络注册所在类中,

你可能感兴趣的:(c)