Несколько месяцев назад я реализовал компонент, который получает данные через UDP-сеть, десериализует их с помощью Boost :: Serialization и начинает работать с входящими объектами.
После некоторого времени использования этого компонента происходят случайные сбои, которыеЯ мог бы решить, узнав, что кто-то еще отправляет данные на мой UDP-порт.
Я решил эту проблему, просто добавив попытку / ловушку вокруг десериализации:
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;
}
Вышекод сортировал любые посторонние / поврежденные данные, поступающие через сеть, и просто десериализировал данные, которые должны были быть.
Тогда я работал с более старой Boost-версией (я не очень хорошо знаю, 1,44, 1,42).?) на Linux-машине.
В настоящее время я должен снова использовать компонент на машине с Windows XP с довольно новым Boost 1.46.1.Теперь проблема в том, что try / catch больше не фильтрует внешние / поврежденные данные.Когда что-то из этого кода поступает, мое приложение падает без какого-либо сообщения об ошибке.
Я не могу изменить порт, который слушаю.Кроме того, я хочу создать надежное приложение, которое игнорирует данные, с которыми оно не может работать, вместо того, чтобы аварийно завершать работу.
Теперь мне интересно, есть ли у кого-нибудь идея, почему возникает этот эффект?Повышение становится менее крепким?Это что-то с ОС?Я понятия не имею и надеюсь, что на этот вопрос может ответить кто-то, кто «больше любит».