求助一個關于socket tcp訊息丟失的問題:
服務器和客戶端訊息處理通過訊息佇列,結構體訊息通過boost序列化,再和訊息ID 長度等資訊構造成智能指標物件。將該物件放到發送訊息佇列。發送訊息執行緒,每隔5MS從佇列中取出一個物件,獲取物件中序列化后的字串,再拼接序列化的訊息頭、分割字串等,構造成完整的訊息字串,然后呼叫send發送該字串。序列化后的每個訊息都能從字串中獲取到訊息ID的關鍵字字串。
問題是,通過send函式的回傳值,大概可以確定發送了規定數量的訊息,但是從recv接收到的字串中 查找關鍵字訊息ID,數量卻與發送的數量不一致。
由于公司代碼不能拿到外網,所以我大概用偽代碼描述下:
Pack(shared_ptr pMessage)
{
序列化訊息頭(MessageHeadStruct)+
分割字串+
pMessage->GetMessageBuffer();\\訊息結構體序列化后的字串
return 完整buffer
}
send(buffer,length)
求大神幫幫忙
uj5u.com熱心網友回復:
你的網路是實時以太網嗎?不是的話,你怎末能保證資料包發送和接受的同步實時性?即使是無VLAN的局域網用直ping的ping包也無法保證這樣的精度。uj5u.com熱心網友回復:
發發送頻率降一降,看看在多少發送頻率下能達到穩定接收,然后在不同網路條件下測驗這個頻率閾值,最后根據閾值的分布情況來決定程式的性能指標或對網路條件的要求uj5u.com熱心網友回復:
tcp丟包會提示錯誤,是你程式沒有把包接收完整。你需要拼接包。uj5u.com熱心網友回復:
應該就像傳圖片一樣,圖一快固然可以形成畫面,但是緩沖和網速有一個跟不上就會出現撕裂。所以看能不能壓縮,或者減慢傳送程序降低緩沖和網速的壓力。
uj5u.com熱心網友回復:
我曾經也懷疑過TCP丟包,后來發現都是代碼不完善。比如接收滯后、粘包,或者一此控制符與普通資料雷同,都可能出現問題。uj5u.com熱心網友回復:
首先確定下,tcp是具有可靠性,不會丟包。其次你這種情況,應當是邏輯上出了問題,比如發送時候會不會因為網路原因,完成發送時候資料堆積,業務層直接丟棄了部分包,或者也可能是接收方,接受的包太多了,處理速度慢,接收方業務層丟棄了部分包。因為有時候視頻傳輸中會用到丟包的當時來處理,畢竟丟部分包并不影響畫面的顯示,同事可以緩解網路以及性能造成的問題,具體要看你的代碼中怎么處理的。思路僅供參考。uj5u.com熱心網友回復:
tcp是具有可靠性,不會丟包。uj5u.com熱心網友回復:
TCP不會丟包 UDP才會丟創建接識訓沖區,訊息頭肯定會攜帶長度,識別到完整包長度再進行解包處理
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/25810.html
標籤:網絡及通訊開發
上一篇:【亡羊補牢】JS靈魂之問 第12期 你知道offset家族嗎?
下一篇:局域網和外網切換使用問題求教
