WSAAsyncSelect和windows用戶端非同步IO模型

來源:互聯網
上載者:User

為什麼要用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。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.