c# SocketAsyncEventArgs類的使用 IOCP服務器


要編寫高性能的Socket服務器,為每個接收的Socket分配獨立的處理線程的做法是不可取的,當連接數量很龐大時,服務器根本無法應付。要響應龐大的連接數量,需要使用IOCP(完成端口)來撤換並處理響應。

.net framework的System.Net.Sockets.Socket 類有一組xxxAsync方法是封裝了IOCP的處理,用於編寫高性能Socket應用程序,xxxAsync該組方法需要結合SocketAsyncEventArgs類來使用,下面是MSDN參考資料,里面有一個詳細的例子:

http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socketasynceventargs.aspx

Socket類xxxAsync的方法,使用起來比較復雜,需要時間消化上述的例子,結合實際編寫所需的操作。

web服務器編程過程中。需要使用異步技術。使用異步的地方:

1、監聽socket,需要等待客戶端接入。這是需要一個線程專門負責監聽(accept方法)

2、一旦客戶端連接,通信socket需要線程監聽緩沖區,以便與客戶端通信。包括接收和發送。

寫些自己的理解。

1、利用socket類中提供的異步方法:AcceptAsync。創建監聽方法

這個方法需要在回調函數中重復調用,以保證監聽。

        private void StartAccept(SocketAsyncEventArgs acceptEventArg)
        {
            if (acceptEventArg == null)  //初始化用
            {
                acceptEventArg = new SocketAsyncEventArgs();
                acceptEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(OnAcceptCompleted); //回調函數 實例化
            }
            else  //循環調用時 需要清理對象。將AcceptSocket屬性設置為null。等待新連接的接入
            {
                acceptEventArg.AcceptSocket = null;
            }
            bool bl = this.listenSocket.AcceptAsync(acceptEventArg); //該異步方法 每次只能接收一個連接。需要循環調用

            if (!bl)
            {
                this.ProcessAccept(acceptEventArg);
            }
        }

回調函數(有格式哦)這個e變量包含了好多的東東哦。

        private void OnAcceptCompleted(object sender, SocketAsyncEventArgs e)
        {
            Console.WriteLine("有一個客戶端連接上來了");
            StartAccept(e);  //非常重要,循環調用該方法。實現監聽
        }

2、在回調函數中。利用socket類提供的異步方法:ReceiveAsync和SendAsync。異步接收和發送數據

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM