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和网络事件类型直接转发给网络注册所在类中,
异步选择(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和网络事件类型直接转发给网络注册所在类中,
相关文章推荐
- IO复用模型同步,异步,阻塞,非阻塞及实例详解
- linux基础编程:IO模型:阻塞/非阻塞/IO复用 同步/异步 Select/Epoll/AIO
- 网络IO模型(同步异步,阻塞非阻塞)
- Windows I/O模型、同步/异步、阻塞/非阻塞
- 同步异步,阻塞非阻塞 和nginx的IO模型
- IO模型 阻塞 非阻塞 同步 异步概念对比区分
- linux基础编程:IO模型:阻塞/非阻塞/IO复用 同步/异步 Select/Epoll/AIO
- IO模型介绍以及同步异步阻塞非阻塞的区别
- IO复用(模型/阻塞/同步/异步)
- 网络模型:阻塞IO,非阻塞IO,IO复用,信号驱动IO,异步IO
- Windows I/O模型、同步/异步、阻塞/非阻塞
- linux基础编程:IO模型:阻塞/非阻塞/IO复用 同步/异步 Select/Epoll/AIO
- 同步异步阻塞非阻塞网络IO模型select/epoll
- Windows I/O模型、同步/异步、阻塞/非阻塞
- Windows I/O模型、同步/异步、阻塞/非阻塞
- IO模型(阻塞、非阻塞、多路复用与异步)
- Unix中的IO模型:帮你弄清阻塞VS非阻塞、同步VS异步
- 同步异步 阻塞非阻塞 Linux网络io模型
- IO模型:同步、异步、阻塞、非阻塞
- IO模型之阻塞、非阻塞、IO多路复用、异步