當由Socket.BeginReceive()分配的回調獲取一些字節時,知道我擁有整個消息的最佳方式是什麼?我應該發送每封郵件的前4個字節,以保留郵件的長度嗎?Socket.BeginReceive回調 - 消息分隔符
我在每條消息中發送一個XML文件,所以沒有可用作消息分隔符的唯一字符。
當由Socket.BeginReceive()分配的回調獲取一些字節時,知道我擁有整個消息的最佳方式是什麼?我應該發送每封郵件的前4個字節,以保留郵件的長度嗎?Socket.BeginReceive回調 - 消息分隔符
我在每條消息中發送一個XML文件,所以沒有可用作消息分隔符的唯一字符。
我會使用包含兩個整數(每個4字節)的頭。第一個表示協議版本,第二個表示消息長度。使用標題長度而不是分隔符的好處是您可以在開始解析之前爲整個消息分配一個緩衝區。
使用版本integer作爲第一個頭讓我們在協議的任何更新版本中更改其餘的頭和主體。
更新在回覆評論
之間存在版本號的頭和一個實際的消息中的差異。消息版本用於文檔,但標題版本用於協議本身。通過使用協議版本,您可以將消息傳輸從XML切換到Protobuf或其他消息。您還可以添加標識實際消息目標的標題。
對版本號真的很好的建議。然而,我們在我們的消息(根節點的屬性)中有這個,所以我們不需要它。但如果我們不這樣做,那麼這將是一個很好的處理方法。謝謝。 –
閱讀我的更新。 – jgauffin
好點。我們的用途是一次性活動,但即使在這種情況下也不會受到傷害。 –
遵循所用協議的規範。如果它是一個原始的協議,寫一個規範。這是一些額外的工作,但它非常值得。
在該規範中,您可以指定消息長度。您還可以禁止有效負載中的特定字節(您可以是用戶零),並將其用作消息分隔符。由於您使用的是XML,因此您可以簡單地定義一個指示消息的標籤 - 該標籤的關閉會指示完整的消息。
這取決於你。但花時間詳細說明你的協議。我向你保證它會得到回報。
我不認爲零將工作,因爲XML可以有CDATA [[]]與零。我想到了一個標籤,但是接下來我需要解析XML來找到最終結果,這在計算上會很昂貴。 –
你不需要解析XML嗎? –
一旦完成,我需要解析XML。但是如果這6個區塊到達,我寧願在第6個和最後一個區塊時解析它。 –
是的,首先發送長度是簡單的解決方案。 –