2011-08-17 44 views
0

我有一個客戶端/服務器體系結構(C#.Net 4.0),它將數據的命令包作爲字節數組發送。任何命令中都有可變數量的參數,每個參數的長度都是可變的。正因爲如此,我使用分隔符來結束參數和整個命令。操作數總是2個字節,兩種分隔符都是1個字節。最後一個parameter_delmiter是冗餘的,因爲command_delmiter提供了相同的功能。TCP/IP客戶端/服務器命令數據

的命令結構如下:

FIELD     SIZE(BYTES) 
operand    2 
parameter1    x 
parameter_delmiter  1 
parameter2    x 
parameter_delmiter  1 
parameterN    x 
............. 
............. 
command_delmiter  1 

參數是從許多不同類型的來源,即,整數,字符串等所有編碼成字節數組。

我遇到的問題是,有時編碼到字節數組中的參數包含的字節與分隔符的值相同。例如command_delmiter = 255 ..並且一個參數可以在其中包含那個字節。

有3種方式我能想到定影此的:

1)進行編碼的參數不同,使得它們不能是相同的值作爲分隔符(255和254)模量?這將意味着參數將變大,即Int16將會超過2個字節等。

2)根本不要使用分隔符,在命令結構的開始處使用計數和長度值。

3)使用別的東西。

據我所知,該方式TCP/IP緩衝器工作是某種定界符的必須被用來單獨「命令」或「數據包」作爲緩衝液可以包含多個命令,或命令可能跨越多個緩衝區..因此,這個數組似乎是一個明顯的候選人,唯一的問題是字節數​​組可能包含多個命令(帶有參數)。所以字節數組仍然必須被切碎才能感覺到BinaryReader。

建議?

謝謝。

回答

1

執行此操作的標準方法是將郵件的長度設置爲郵件的(固定)前幾個字節。所以你可以用前4個字節來表示消息的長度,讀取消息內容的那些字節。接下來的4個字節將是下一條消息的長度。長度爲0可能表示消息結束。或者你可以使用帶有消息計數的標題。另外,記住TCP是一個字節流,所以不要指望每次從套接字讀取數據時都會有一個完整的消息可用。您可以在任何時候收到任意數量的字節。

+0

是的,我已經保留了一個獨立的'累積'緩衝區,我也附加了所有傳入的數據。我檢查這個二級緩衝區是否有任何有效和完整的數據「塊」並對其進行處理。所以你建議使用長度而不是分隔符。感謝您驗證我認爲是正確的道路。 –