一、在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。 二、個人SocketAsyncEventArgsPool類使用List對象來存儲對客戶端來通訊的SocketAsyncEventArgs對象,它至關於直接使用內核對象時的IoContext。我這樣設計比用堆棧來實現的好處理是,我能夠在SocketAsyncEventArgsPool池中找到任何一個與服務器鏈接的客戶,主動向它發信息。而用堆棧來實現的話,要主動給客戶發信息,則還要設計一個結構來存儲已鏈接上服務器的客戶。 三、對每個客戶端無論還發送仍是接收,我使用同一個SocketAsyncEventArgs對象,對每個客戶端來講,通訊是同步進行的,也就是說服務器高度保證同一個客戶鏈接上要麼在投遞發送請求,並等待;或者是在投遞接收請求,等待中。本例只作echo服務器,還未考慮由服務器主動向客戶發送信息。 四、SocketAsyncEventArgs的UserToken被直接設定爲被接受的客戶端Socket。 五、沒有使用BufferManager 類,由於我在初始化時給每個SocketAsyncEventArgsPool中的對象分配一個緩衝區,發送時使用Arrary.Copy來進行字符拷貝,不去改變緩衝區的位置,只改變使用的長度,所以在下次投遞接收請求時恢復緩衝區長度就能夠了!若是要主動給客戶發信息的話,能夠new一個SocketAsyncEventArgs對象,或者在初始化中創建幾個來專門用於主動發送信息,由於這種需求通常是進行信息羣發,創建一個對象能夠用於不少次信息發送,整體來看,這種花銷不大,還減去了字符拷貝和消耗。
demo下載地址:http://files.cnblogs.com/files/airtcp/IocpServer.zip