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

C# 非同步 TCP/IP 完成端口元件 - 客戶端與伺服器端完整實現

     編輯:關於C語言

架構概覽

基於 .NET Socket 非同步模式(底層 IOCP 完成端口),封裝為元件 MyTcpIpClient、MyTcpIpServer,支援訊息框架傳輸(長度前綴 + 資料流)。

通訊協定:訊息框架

  • 前 4 字節:總封包大小 (含頭部),大端序。
  • 次 4 字節:實際資料長度,大端序。
  • 後續:資料內容。
  • 接收端狀態機 (Cortrol 0-9) 解析頭部長度、資料長度、分包重組資料流。

客戶端 MyTcpIpClient 關鍵流程

  1. Conn():BeginConnect → ConnectCallback → BeginReceive 進入接收迴圈。
  2. Send(Stream):將 Stream 依緩衝區大小分塊,每塊加上 8 字節頭部,BeginSend 非同步發送。
  3. ReceiveCallback:狀態機解析頭部長度、資料長度,重組完整 MemoryStream 觸發 Incept 事件。

伺服器端 MyTcpIpServer 關鍵流程

  1. Listening():啟動專用執行緒跑 StartListening。
  2. StartListening:Bind/Listen → 迴圈 BeginAccept → AcceptCallback 建立 StateObject → BeginReceive。
  3. ReadCallback:同客戶端接收邏輯,重組資料流觸發 InceptServer 事件(攜帶 ServerSocket 與 MyTcpIpServer 參考以便回覆)。
  4. Send(Socket, Stream):指定目標 Socket 發送資料流。

狀態物件 StateObject

public class StateObject {
    public byte[] buffer;
    public Socket workSocket;
    public MemoryStream Datastream = new MemoryStream();
    public long residualSize, packSize;
    public int Cortrol; // 狀態機步驟 0-9
}

事件模型

  • 客戶端:Incept (收到資料)、Error (錯誤)。
  • 伺服器:InceptServer、ErrorServer。
  • 事件參數攜帶 Stream、Socket、Server 參考。

優勢

  • IOCP 非同步,高併發、高吞吐。
  • 訊息框架解決 TCP 黏包/拆包。
  • 元件化設計,易整合 WinForms/WPF/服務。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved