2011-08-04 78 views
4

幾個月前,我實現了一個通過UDP網絡接收數據的組件,通過Boost :: Serialization將其反序列化,並開始使用傳入對象。Boost Serialization - 在反序列化已損壞的數據時沒有archive_exception?

經過一段時間的使用這個組件後發生隨機崩潰,當我發現有人正在向我的UDP端口發送數據時我可以解決這個問題。

我通過簡單地增加一個try/catch圍繞反序列化解決了這個問題:

try 
{ 
    boost::archive::text_iarchive inputArchive(incomingData); 
    inputArchive >> givenElements; //the actual deserialization, here the exception has been thrown in the past 
} 
catch(boost::archive::archive_exception& ex) 
{ 
    std::cout << "Archive Exception during deserializing:" << std::endl; 
    std::cout << ex.what() << std::endl; 
    std::cout << "Incoming data had the following content:" << std::endl; 
    std::cout << dataStream.str() << std::endl; 
} 

上面的代碼整理出任何外國/損壞的數據通過網絡進來的,只是反序列化它的意思是什麼數據。

那時我在一臺Linux機器上使用了較舊的Boost版本(我不太清楚,1.44,1.42?)。

目前我必須在Windows XP機器上再次使用該組件,並使用相當新的Boost 1.46.1。 現在的問題是,try/catch似乎不再過濾外部/損壞的數據。至於來自該代碼的內容傳入,我的應用程序崩潰,沒有任何錯誤消息。

我無法更改正在監聽的端口。除此之外,我想創建一個忽略數據的健壯應用程序,它不能使用而不是崩潰。

我現在想知道是否有人有一個想法,爲什麼會出現這種效應? Boost已經變得越來越不穩健?這是什麼與操作系統?我不知道並希望這是一個問題,可以回答「進入Boost」。

回答

1

我的答案與boost序列化沒有直接關係,但在進入更深的邏輯之前,對來自網絡的傳入數據進行一些驗證總是一個好主意。

潛水到升壓序列化之前,我建議你:

  1. 檢查UDP數據包的大小
  2. 如果您正在使用某種形式的頭做一些驗證
  3. 不管你的情況下
  4. 似乎是恰當的

然後嘗試反序列化數據包。通過這種方式,您可以自己過濾掉外部數據包,而不是*依賴進行提升。

+0

你說得對。也許我應該在Boost數據前添加自己的頭文件。這樣我可以發送一些散列,大小信息等數據,並確保一切按預期工作。 – MOnsDaR

+0

這實際上並不是我的問題的正確答案,但它告訴我們如何解決潛在的問題。如果對這個問題有更多的答案,我會改變「正確答案」 - 標誌。謝謝! – MOnsDaR

相關問題