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和网络事件类型直接转发给网络注册所在类中,