首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 異步 Socket 編程(三):連接成功回調與數據接收循環

     編輯:關於C語言

異步 Socket 核心流程:BeginConnect → OnConnect → BeginReceive → OnReceivedData → 再次 BeginReceive 形成接收循環。本文詳細解析兩個回調方法的實現細節。

OnConnect:連接成功後啟動接收

public void OnConnect(IAsyncResult ar)
{
    Socket sock = (Socket)ar.AsyncState;
    try
    {
        sock.EndConnect(ar);
        if (sock.Connected)
        {
            AsyncCallback receiveCB = new AsyncCallback(OnReceivedData);
            sock.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, receiveCB, sock);
        }
        else
        {
            Console.WriteLine("連接失敗");
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine("連接異常: " + ex.Message);
    }
}

OnReceivedData:數據到達處理與循環接收

public void OnReceivedData(IAsyncResult ar)
{
    Socket sock = (Socket)ar.AsyncState;
    try
    {
        int bytesRead = sock.EndReceive(ar);
        if (bytesRead > 0)
        {
            string msg = Encoding.ASCII.GetString(buffer, 0, bytesRead);
            ParseMessage(sock, msg);           // 業務解析
            SetupReceiveCallback(sock);        // 重新掛接接收
        }
        else
        {
            // 對端關閉
            sock.Shutdown(SocketShutdown.Both);
            sock.Close();
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine("接收異常: " + ex.Message);
    }
}

void SetupReceiveCallback(Socket sock)
{
    sock.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(OnReceivedData), sock);
}

流程圖解

異步 Socket 事件觸發流程圖

主線程完全不阻塞,所有網絡 I/O 由線程池完成端口(IOCP)驅動,適合高併發場景。

P2P 擴展提示

示例中每個節點同時作為 Client 與 Server,可在此基礎上實現節點發現、NAT 穿透、消息路由等 P2P 功能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved