C# IOCP完成端口模型(简单实用高效)
生活随笔
收集整理的這篇文章主要介紹了
C# IOCP完成端口模型(简单实用高效)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
1、在C#中,不用去面對完成端口的操作系統內核對象,Microsoft已經為我們提供了SocketAsyncEventArgs類,它封裝了IOCP的使用。請參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socketasynceventargs.aspx?cs-save-lang=1&cs-lang=cpp#code-snippet-1。2、我的SocketAsyncEventArgsPool類使用List對象來存儲對客戶端來通信的SocketAsyncEventArgs對象,它相當于直接使用內核對象時的IoContext。我這樣設計比用堆棧來實現的好處理是,我可以在SocketAsyncEventArgsPool池中找到任何一個與服務器連接的客戶,主動向它發信息。而用堆棧來實現的話,要主動給客戶發信息,則還要設計一個結構來存儲已連接上服務器的客戶。3、對每一個客戶端不管還發送還是接收,我使用同一個SocketAsyncEventArgs對象,對每一個客戶端來說,通信是同步進行的,也就是說服務器高度保證同一個客戶連接上要么在投遞發送請求,并等待;或者是在投遞接收請求,等待中。本例只做echo服務器,還未考慮由服務器主動向客戶發送信息。4、SocketAsyncEventArgs的UserToken被直接設定為被接受的客戶端Socket。5、沒有使用BufferManager 類,因為我在初始化時給每一個SocketAsyncEventArgsPool中的對象分配一個緩沖區,發送時使用Arrary.Copy來進行字符拷貝,不去改變緩沖區的位置,只改變使用的長度,因此在下次投遞接收請求時恢復緩沖區長度就可以了!如果要主動給客戶發信息的話,可以new一個SocketAsyncEventArgs對象,或者在初始化中建立幾個來專門用于主動發送信息,因為這種需求一般是進行信息群發,建立一個對象可以用于很多次信息發送,總體來看,這種花銷不大,還減去了字符拷貝和消耗。demo下載地址:http://files.cnblogs.com/files/airtcp/IocpServer.zip
?
轉載于:https://www.cnblogs.com/airtcp/p/5230342.html
總結
以上是生活随笔為你收集整理的C# IOCP完成端口模型(简单实用高效)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 理解Linux中断 (3)【转】
- 下一篇: C#基础 类