加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 提升序列化 – 再次反序列化损坏的数据时没有archive_excep

发布时间:2020-12-16 06:57:09 所属栏目:百科 来源:网络整理
导读:几个月前,我实现了一个通过UDP网络接收数据的组件,通过Boost :: Serialization对其进行反序列化,并开始处理传入的对象. 在使用此组件一段时间后发生了随机崩溃,当我发现其他人正在向我的UDP端口发送数据时,我可以解决这个问题. 我通过在反序列化周围添加try
几个月前,我实现了一个通过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机器上再次使用该组件.
现在问题是,try / catch似乎不再过滤外来/损坏的数据.至于来自该代码的东西是传入的,我的应用程序崩溃没有任何错误消息.

我不可能改变我正在听的端口.除此之外,我想创建一个强大的应用程序,忽略数据,它无法使用而不是崩溃.

我现在想知道是否有人知道为什么会出现这种影响? Boost的稳健性是否越来越低?这是OS的问题吗?我不知道,并希望这是一个“更多进入Boost”的人可以回答的问题.

解决方法

我的答案与boost序列化没有直接关系,但在进入更深层逻辑之前,对来自网络的传入数据进行一些验证总是一个好主意.

在深入探讨提升序列化之前,我建议你:

>检查UDP数据包的大小
>如果您使用某种标头做一些验证
>无论什么似乎适合你的情况

然后尝试反序列化数据包.这样你就可以自己过滤外包,而不是依靠boost.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读