WSAAsyncSelect和windows客户端异步IO模型

为什么要用WSAAsynSelect?
    服务端的IO模型,常见的是select、poll、epoll这种select模型,或是IOCP,AIO这种异步IO模型,这在服务器端无疑是合理的选择,那么客户端呢?用select或是AIO是否合理,或者是否有必要呢?考虑到客户端总是需要一个UI线程,如果需要用上面的解决方案,必然需要引入另外的线程来做这部分工作,线程之间的通信,同步资源,都是麻烦的东西。多线程的设计无疑使得程序变得复杂和难于调试,难道不能用单线程来实现整个客户端么?实际上是可以的,windows中提供的WSAAsynSelect就可以很方便的在一个线程中实现UI和异步IO的处理。WSAAsyncSelect 就是提供了一个最适合Windows自己运作模型的工作方式。它可以把socket的消息映射到线程的消息循环中。这符合:“别调用我,我会调用您”的 Windows 哲学。

 

如何使用WSAAsynSelect?
    具体的用法请参考MSDN:http://msdn.microsoft.com/en-us/library/ms741540
    简单来说,你通过这个API指定一个目标窗口,并且注册你需要关心的socket和IO事件,系统(Ws2_32.dll)就会在这个事件发生之后向你的窗口发送一个消息,WSAGETSELECTEVENT(lParam) 可以用来得到网络事件本身,而 wParam 则被用来传递 socket 的 handle 。然后,就可以主动调用 socket 函数来处理这些事件了。而windows 的应用程序的主体永远只需要一个简单的循环来处理和分发消息就够了。

 

关于CAsyncSocketEx
    这是一个对于WSAAsynSelect方法的封装类,并且可以很方便的加入SSL和proxy的支持。emule的大多数通讯类的基类就是它。它利用一个help window可以很方便的集成进入现有的项目,有兴趣可以看下http://www.codeproject.com/KB/IP/casyncsocketex.aspx。

posted @ 2011-01-03 14:24  hjtc  Views(1774)  Comments(0Edit  收藏  举报