2009-08-26 158 views
2

我應該如何設計我的消息協議,以便區分用戶數據和消息的終止。消息傳遞協議

例如,我從用戶那裏通過TCP/IP將它發送給客戶端,現在客戶端需要知道消息的長度,我認爲我使用某種終止方式來客戶端識別消息已達到?

我在C++中如何做到這一點。我使用的是Windows套接字

回答

3

面向特定應用的協議是,除了使用終止一個合理的共同戰略,該消息之前編碼信息的長度。所以前幾個字節(有多少個變量)指定了消息的長度,一些特殊的代碼(通常是全部或全部位)指定了需要延續的超長消息。

編輯:一個例子已要求。假設我們設計了協議,以便消息的最大大小爲255字節,並且我們希望發送字符串「hi」。我們的協議消息將由三個字節組成:2,104,105。第一個字節2告訴我們後面的消息的長度。第二個和第三個字節104105對於hi是ASCII。

+0

如何?請舉一個例子,因爲我無法輕易理解沒有例子:) – akif 2009-08-26 08:53:12

+0

看起來像一個這樣做對我來說類型問題 – ThePosey 2009-08-26 20:36:49

+1

- 不要忘記超過255的消息的計劃,即使你現在不需要它(或永遠)至少不會設計會使後面的添加變得困難的消息。 - 另外不要忘記防止說謊的消息。例如,我發送一個長度爲10的消息,但只發送5個。你是否鎖定(壞)?你能檢測到嗎?放棄連接?嘗試恢復? - 看你的緩衝器!不要超越他們! (經典安全漏洞) – Aardvark 2009-08-26 20:38:06

0

您可以發送消息塊,並將每個塊的長度預先加上。該流將以零長度的塊結束。 (如果流的長度事先不知道,這是HTTP執行的方式。)

1

您可以先傳送長度,然後傳送消息。

+0

如何?你能提供一個例子嗎? – akif 2009-08-26 08:52:19

+0

發送方將消息載荷中的字節數寫入導線,然後寫入消息載荷。接收方讀取字節數,然後知道有效負載的長度並讀取有效負載。 – sharptooth 2009-08-26 09:11:03

0

存在使用特殊標記,以確定消息的末尾許多計算機系統 - C使用\ 0上的字符數組,JPEG使用0xFF的作爲標記物,並且這樣的。

所有這些系統使我們得出的結論是,使用它們的長度前綴消息更加直接和強大。

TCP本身實際上是這樣做的。如果將兩個字節的用戶輸入寫入套接字,則另一端會有兩個字節可用,系統處理的TCP數據包會知道這一點,因爲它們會使用其有效負載長度標記每個數據包。

一旦你完成了發送的輸入,你可以從一個側面shutdown插座,另一側將被通知(如果他們啓用了這樣的通知)。

+0

如何給消息加上長度的前綴?如果第一次發送的時間長度不夠,該怎麼辦? – akif 2009-08-26 08:36:20

+0

始終保持閱讀,直到閱讀完整消息。因此,首先,繼續讀取,直到您有x個字節(長度),然後繼續讀取,直到收到所有字節根據長度。 – stefaanv 2009-08-26 08:41:03

+0

我如何知道我想讀取x個字節 – akif 2009-08-26 08:44:52

0

或者,您可以按照POP的示例使用「。」在空行的開始處。