2011-08-04 10 views
4

私はUDPネットワーク経由でデータを受信し、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-Machine上で古いBoost-Version(1.44、1.42?)を使っていました。

現在、かなり新しいBoost 1.46.1を搭載したWindows XPマシンでこのコンポーネントを再度使用する必要があります。 問題はtry/catchが外部/壊れたデータをもうフィルターしていないように見えることです。そのコードから何かが入ってくる限り、私のアプリケーションはエラーメッセージなしでクラッシュします。

私が聞いているポートを変更することはできません。それ以外にも、クラッシュする代わりに使えないデータを無視する堅牢なアプリケーションを作成したいと考えています。

私は今、誰かがこの効果がなぜ起こるのか考えているのだろうかと疑問に思っていますか?ブーストの耐久性は低下していますか?これはOSとは何か?私はまったく考えていないし、これは質問のようなものだと思う。

答えて

1

私の答えは、ブーストシリアル化には直接関係しませんが、より深いロジックに入る前に、ネットワークからの受信データに対する検証を行うことをお勧めします。

は深いブーストのシリアル化に入る前に、私はあなたをお勧め:

  1. チェックUDPパケットのサイズ
  2. あなたはケース
  3. をするために適切と思われるものは何でもいくつかの検証
  4. を行うヘッダのいくつかの種類を使用している場合

パケットをデシリアライズしてみます。この方法では、ブーストにを依存させる代わりに、自分で外部パケットを除外することができます。

+0

あなたはそうです。おそらく、Boost-dataの前に自分のヘッダを追加するべきでしょう。このようにして、ある種のハッシュ、サイズ情報などをデータとともに送信し、すべてが期待どおりに動作することを確認することができます。 – MOnsDaR

+0

これは実際に私の質問に対する正解ではありませんが、根本的な問題を解決する方法を示しています。より多くの質問に答える別の答えがある場合は、「正解」フラグを変更します。ありがとう! – MOnsDaR

関連する問題