2016-11-10 94 views
1

我想通過TCP發送巨大的緩衝區(從100MB到1GB)數據。我通過將緩衝區分成較小(大約1MB緩衝區)並通過socket.send()發送來解決這個問題。每次調用socket.send()方法,發送部分數據(較小的緩衝區)打包在特定結構中:[開始字節(1B),時間戳(4B),命令(4B),數據長度(4B),發送數據(?B),CRC(1B),結束字節(1B)]。一切正常,只有一個巨大的緩衝區是由特定端口發送的。但是,當我嘗試使用相同的TCP端口在同一時間緩衝區中發送另一個數據(非常小,例如20個字節)時,TCP就會將數據混合到緩衝區中,並且無法再解碼緩衝區。緩衝區中的「開始字節」和「結束字節」對於查找緩衝區的開始和結束沒有用處,因爲這些字節很可能出現在數據中。C#通過套接字和TCP發送巨大和小的數據緩衝區

編輯:問題不會影響軟件包之間的順序或ID,而是影響軟件包中的字節。在開始時一切正常,每個緩衝區都被正確解碼。一段時間後,不能解碼緩衝區,因爲它包含不正確的數據。它看起來像緩衝區中的字節被移動或更改。緩衝區開始處的字段(時間戳,命令,長度)包含不可能的值。所以當我想獲得發送數據的長度時,值爲-1534501133而不是1048556(1048556是一個包中發送數據的正確最大大小)。它隨機發生,但始終與發送較小的獨立緩衝區的時刻連接。附加信息是,較小的緩衝區是使用定時器重複發送的,並且問題發生在隨機時刻。有時甚至有可能發送整個數據(例如300 MB)而沒有問題,但它很少發生。

我希望我已經清楚了。

你有什麼建議如何避免這個問題?

+0

*緩衝區中的'起始字節'和'結束字節'對於查找緩衝區的開始和結束沒有用處,因爲這些字節很可能出現在數據中。你在那裏編碼長度。目前尚不清楚問題是什麼。 –

回答

0

用唯一的ID標記數據,以便知道數據與什麼消息相關。另外,將數據包標頭與數據包有效載荷分開。

所以,你的第一個要求是[ID] [PACKETTYPE] [時間] [COMMAND] [長度] [CRC]

其次是[ID] [PACKETTYPE] [數據]

你然後可以將這些ID與分組類型進行匹配。因此,數據包類型將是'HEADER'或'PAYLOAD',頭部將包含有效載荷的元數據,以確保它不會與其他數據混淆。

+0

感謝您的回答,但它不能解決我的問題。我向我的帖子中添加了一些信息以更多地解釋它。 – Matis4

相關問題