我應該如何設計我的消息協議,以便區分用戶數據和消息的終止。消息傳遞協議
例如,我從用戶那裏通過TCP/IP將它發送給客戶端,現在客戶端需要知道消息的長度,我認爲我使用某種終止方式來客戶端識別消息已達到?
我在C++中如何做到這一點。我使用的是Windows套接字
我應該如何設計我的消息協議,以便區分用戶數據和消息的終止。消息傳遞協議
例如,我從用戶那裏通過TCP/IP將它發送給客戶端,現在客戶端需要知道消息的長度,我認爲我使用某種終止方式來客戶端識別消息已達到?
我在C++中如何做到這一點。我使用的是Windows套接字
面向特定應用的協議是,除了使用終止一個合理的共同戰略,該消息之前編碼信息的長度。所以前幾個字節(有多少個變量)指定了消息的長度,一些特殊的代碼(通常是全部或全部位)指定了需要延續的超長消息。
編輯:一個例子已要求。假設我們設計了協議,以便消息的最大大小爲255字節,並且我們希望發送字符串「hi」。我們的協議消息將由三個字節組成:2
,104
,105
。第一個字節2
告訴我們後面的消息的長度。第二個和第三個字節104
和105
對於h
和i
是ASCII。
您可以發送消息塊,並將每個塊的長度預先加上。該流將以零長度的塊結束。 (如果流的長度事先不知道,這是HTTP執行的方式。)
您可以先傳送長度,然後傳送消息。
如何?你能提供一個例子嗎? – akif 2009-08-26 08:52:19
發送方將消息載荷中的字節數寫入導線,然後寫入消息載荷。接收方讀取字節數,然後知道有效負載的長度並讀取有效負載。 – sharptooth 2009-08-26 09:11:03
存在使用特殊標記,以確定消息的末尾許多計算機系統 - C使用\ 0上的字符數組,JPEG使用0xFF的作爲標記物,並且這樣的。
所有這些系統使我們得出的結論是,使用它們的長度前綴消息更加直接和強大。
TCP本身實際上是這樣做的。如果將兩個字節的用戶輸入寫入套接字,則另一端會有兩個字節可用,系統處理的TCP數據包會知道這一點,因爲它們會使用其有效負載長度標記每個數據包。
一旦你完成了發送的輸入,你可以從一個側面shutdown插座,另一側將被通知(如果他們啓用了這樣的通知)。
或者,您可以按照POP的示例使用「。」在空行的開始處。
如何?請舉一個例子,因爲我無法輕易理解沒有例子:) – akif 2009-08-26 08:53:12
看起來像一個這樣做對我來說類型問題 – ThePosey 2009-08-26 20:36:49
- 不要忘記超過255的消息的計劃,即使你現在不需要它(或永遠)至少不會設計會使後面的添加變得困難的消息。 - 另外不要忘記防止說謊的消息。例如,我發送一個長度爲10的消息,但只發送5個。你是否鎖定(壞)?你能檢測到嗎?放棄連接?嘗試恢復? - 看你的緩衝器!不要超越他們! (經典安全漏洞) – Aardvark 2009-08-26 20:38:06