Pages

2011-10-24

TCP/IP Server的實作議題

在.NET下如何建立TCP Server,基本的概念如以下文章程式碼:
Building a TCP/IP server using C# | Martijn's C# Programming Blog
http://www.dijksterhuis.org/building-a-tcpip-server-using-c/

文章中提到建立TCP Server的三種程式版本,Version1是使用內建的TcpListener及TcpClient類別
它們是高階包裝物件,雖然使用簡單,但本質還是使用底下的Socket類別在實作。
微軟為何謙虛稱其為「TcpListener」而非「TcpServer」,等你實作多人連線時就會發現,
事情絕不是想像中般簡單。

網路程式大部分工作就是在Read()/Write()封包,為了提高效能,Version2就是使用純Socket類別作範例
為了減少等待及多執行緒管理,Version3提供非同步方式來處理Client的連入及資料傳送工作。

要真正實作一個名副其實的TcpServer,文章中的程式內容還不足以擔任此重責,
TCP Server最大的技術門檻不在於Socket資料傳送,而是在處理多連線的非常規中斷
例如Server端或Client端的網路Cable突然出了問題(ex.斷電),或者是基於流程必須強制中斷
身為TcpServer得去捕捉這樣千奇百怪的例外錯誤。

鑽研至底層Socket控制,又有區分Graceful及Linger等斷線的方式,各有不同的效果。
完成Session管理後,傳輸指令的Command封包資料格式也需要兩造定義
(此部分可參考此Packet封包結構與解析文章)

資料接收完成後,倘若是大量的視訊資料,UI可能會來不及消耗這些資料封包,也必須實作緩衝Buffering及快取Cache技術
這些都是實作TcpServer的實務技術課題,新的WCF架構被創造的動機,即是用來解決及簡化這些連線問題。
但WCF目前無法相容異質平台,其大量傳輸的效能也可能備受質疑 (出了很多Metadata資訊)

我以多年的Socket實作經驗,實作了一個技術還堪用的TcpServer類別:
image

配合Packet封包結構協助類別PacketFrame,提供較高質量的安全網絡傳輸行為。

No comments: