几个月前,我实现了一个通过UDP-network接收数据的组件,通过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计算机上再次使用该组件。 现在问题是,try / catch似乎不再过滤外来/损坏的数据。至于来自该代码的东西是传入的,我的应用程序崩溃而没有任何错误消息。
我无法更改我正在收听的端口。除此之外,我想创建一个强大的应用程序,忽略数据,它无法使用而不是崩溃。
我现在想知道是否有人知道为什么会出现这种影响? Boost的稳健性是否越来越低?这是OS的问题吗?我不知道,并希望这是一个“更多人可以回答”的问题。
答案 0 :(得分:1)
我的答案与提升序列化没有直接关系,但在进入更深层逻辑之前,对来自网络的传入数据进行一些验证总是一个好主意。
在深入探讨提升序列化之前,我建议你:
然后尝试反序列化数据包。通过这种方式,您可以自己过滤掉外来数据包,而不是依靠<依赖进行提升。