2010-09-07 127 views
3

我的應用程序需要通過tcp套接字發送/接收xml數據。無法包含任何類型的包含消息長度的固定長度頭。據我瞭解,通過tcp傳輸的數據可以像這樣來到收件人。通過TCP套接字發送可變長度數據

  1. < MESSA

  2. GE > <內容

  3. >喜< /內容>

  4. < /消息>

但是不知何故,這種情況永遠不會發生,這意味着使用一個Send()操作發送的數據(假設它比套接字緩衝區的大小更短或等於)總是通過一個Receive()操作完全讀取。考慮到端點的套接字緩衝區足夠大並且從不超過,上述情況是否可能?

回答

1

這可以很容易地發生,如果之間有一個代理。如果我們假設沒有代理,則客戶端將收到與服務器發送的數據包相同的數據包。如果您發送的數據量小於鏈接的TCP MSS數量,則客戶端可能會一次性收到它。

但是,我不會依賴這個。通過查看關閉標記(</message>)很容易判斷XML消息的結束,因此從流中解析XML很容易。

+0

可以以任何想要的方式將分割數據代理爲塊?數據真的很小,10KB或更少.. – 2010-09-07 17:39:35

+1

這不僅僅是一個代理問題,它可以隨時發生。 TCP只是一個流,不是面向數據包的。例如如果網絡擁塞,你發送的東西真的很快,操作系統網絡緩衝區已滿。如果你碰巧用一個Receive獲得所有數據,那麼你很幸運 - 不應該依賴它。 – nos 2010-09-07 17:42:09

+0

@ user375487是的,代理可以以任何想要的方式拆分。另外,10K已經超過了TCP MSS,所以如果網絡足夠慢,接收器可能會收到更小的片斷。 – unbeli 2010-09-07 17:58:04

4

是的,這是可能的。

你真的不能假定一方的send()操作中的緩衝區邊界將與另一端的相應recv()所看到的緩衝區邊界相匹配,即使這看起來像是大多數情況下時間。

例如,如果您發送大量數據,接收操作系統可能會調用TCP流量控制,並且發送操作系統只能發送部分緩衝區。或者,也許底層網絡有一個數據包大小限制,需要分割的東西,或...

+0

數據真的很小。即使數據爲10 KB或更少,這些事情是否也會發生? – 2010-09-07 17:40:59

+0

是的,它可以。此外,如果您發送的郵件超過1條時間相對接近,您的接收可能會同時讀取它們,或者它可能會讀取下一條信息的前一半。如果在正確的時間出現虛假的網絡問題,「及時接近」可能需要幾分鐘時間。 – nos 2010-09-07 17:51:50

0

您可以在消息中包含消息長度。所有你需要做的是,當你發送xml msg時,你在前4個字節中加上msg長度,然後是xml msg。當你收到你的流的前4個字節作爲味精長度,然後讀取每個字節的xml msg

+0

我假設,因爲這個問題。 – 2010-09-07 17:45:24

+0

我的不好。因爲我雖然說過「沒有辦法包含任何類型的包含消息長度的固定長度標題」 – Cratylus 2010-09-07 17:59:32

+0

是的,這就是我所說的。只有xml數據必須傳輸,這是我無法改變的要求。你不能用任何你想要的數據預先加載http請求或電子郵件,除非你不想讓它們解析,對嗎?這是一個類似的情況。 – 2010-09-07 18:35:37

相關問題