2010-09-17 57 views
0

我會寫一個TCP服務器,客戶端發送我的XML消息,我想知道如果下面的條件會發生,以及如何避免:TCP服務器:如何避免信息重疊

1)客戶端發送<cmd ...></cmd> 2)服務器正在忙於處理某些 3)客戶端發送<cmd ...></cmd> 4)服務器在執行的recv(),並把字符串緩衝

將緩衝區充滿<cmd ...></cmd><cmd ...></cmd>甚至更​​糟<cmd ...></cmd><cmd ...如果我的緩衝區並不大足夠?

我想要的是TCP堆棧將消息劃分爲與客戶端發送消息相同的部分。

它可行嗎?

+0

你是否擔心緩衝區溢出? – aaronasterling 2010-09-17 07:23:05

+1

這就是TCP所要做的:確保從發送方傳輸的有序,有序,可靠的數據。 http://en.wikipedia.org/wiki/Transmission_Control_Protocol – msw 2010-09-17 07:23:47

回答

0

您經常以複數形式編寫客戶端:是否有多個客戶端連接到您的服務器?在這種情況下,每個客戶端都應該使用自己的TCP流,並且您所描述的問題永遠不會發生。

如果各種命令是從單個客戶端發送的,那麼您應該編寫客戶端代碼,以便在發出下一個命令之前等待命令的答案。

+1

這是垃圾;)你只需要確保你的服務器正確處理消息幀。 TCP是一個字節流,每次讀取可以返回1和等待處理的總字節數,所有TCP代碼都應該處理這個。如果你在TCP之上有一條消息而不是基於流的協議,那麼你需要實現某種形式的消息成幀,以便將傳入的流分割成你理解的消息。絕對沒有必要將協議限制爲嚴格的單個消息響應序列。即使你限制你的客戶,你也必須處理不完整的'消息'。 – 2010-09-17 08:08:44

+0

我承認。第二段是過度簡化。但第一段回答了OP的一個重要問題。 – 2010-09-17 08:39:50

+0

「第二段是過度簡化」?怎麼會這樣?這是一個常見的協議。例如,這就是HTTP的作用。 – 2010-09-17 10:00:25

4

這是不可能保證在TCP層面,因爲它只知道流。

根據您使用的XML解析器,您應該能夠爲其提供流並讓它告訴您它何時具有完整的對象,並將第二個<cmd...保留在其緩衝區中,直到它還被關閉。

+0

你在說什麼?由於每個客戶端都有獨立的套接字,因此所描述的場景不會發生。 – 2010-09-17 10:01:14

+0

我可能誤解了這個問題,但我認爲這個場景是一個單一的客戶端,並詢問一個調用send()是否直接映射到一個調用recv() – Knio 2010-09-17 10:33:40

+0

是的,我認爲這正是OP所要求的。 – caf 2010-09-19 12:21:38

3

您需要一個更高階的協議來根據需要劃定消息邊界。還有plenty to choose from包括你自己發明的。

+0

實際上,問題不是數據序列化格式問題,因爲看起來OP已經在使用XML這樣的東西了(XML是該鏈接提出的格式之一),問題是數據傳輸問題:如何知道文檔何時完成。 HTTP是一種可能的解決方案(不包括在你的鏈接中,實際上鍊接中的大多數格式都假設通過HTTP傳輸,而不是原始TCP)。 – slebetman 2010-09-17 08:23:34