c – 提升序列化 – 再次反序列化损坏的数据时没有archive_excep
几个月前,我实现了一个通过UDP网络接收数据的组件,通过Boost :: Serialization对其进行反序列化,并开始处理传入的对象.
在使用此组件一段时间后发生了随机崩溃,当我发现其他人正在向我的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?). 目前,我必须在具有相当新的Boost 1.46.1的Windows XP机器上再次使用该组件. 我不可能改变我正在听的端口.除此之外,我想创建一个强大的应用程序,忽略数据,它无法使用而不是崩溃. 我现在想知道是否有人知道为什么会出现这种影响? Boost的稳健性是否越来越低?这是OS的问题吗?我不知道,并希望这是一个“更多进入Boost”的人可以回答的问题. 解决方法
我的答案与boost序列化没有直接关系,但在进入更深层逻辑之前,对来自网络的传入数据进行一些验证总是一个好主意.
在深入探讨提升序列化之前,我建议你: >检查UDP数据包的大小 然后尝试反序列化数据包.这样你就可以自己过滤外包,而不是依靠boost. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |