2016-12-22 6 views
0

Это сводит меня с ума. В основном потому, что это происходит в 90% случаев, но иногда я могу справиться с этим.Создание boost :: asio :: ip :: udp :: socket сбой в LIB после обновления с 1_55 до 1_62 на Windows

Итак, вот предыстория. Я скомпилировал boost 1_55, используя MSVC++ 2012, и мы использовали его довольно долгое время. Мы переходим к toolchain 2013 года, и мне поручено обновить все.

Я решил захватить последний импульс 1_62 и перекомпилировать 32-битный набор инструментов 2013 года. Проблема, с которой я сталкиваюсь, заключается в том, что теперь, когда я перекомпилировал, я получаю сбой при создании сокета udp.

Итак, у меня есть библиотека, которую мы разработали, которую мы связываем статически. Я наследую эту библиотеку и вызываю метод, который открывает порт UDP.

Ради примера я изменил мой код, чтобы лучше illistrate этот момент:

В конструкторе класса я имею следующее:

 boost::asio::io_service test; 
     boost::asio::ip::udp::socket socket(test); 

     this->StartListen(); 

Это работает просто отлично. В StartListen, я называю Init я следующее:

 boost::asio::ip::udp::endpoint listen_endpoint(
     boost::asio::ip::address::from_string(m_bindAddress), m_usPort); 
    m_mcast_endpoint.reset(new boost::asio::ip::udp::endpoint(
     boost::asio::ip::address::from_string(m_sendAddress), m_usPort)); 
    m_socket.reset(new boost::asio::ip::udp::socket(m_ioservice)); 

Это взрывает на m_socket.reset с этим:

Unhandled exception at 0x77D798C1 (ntdll.dll) in program.exe: 0xC0000374: A heap has been corrupted (parameters: 0x77DAC8D0). 

достаточно занятно, когда я изменил пример, чтобы быть сразу в начале слушать, как это:

void Multicast::StartListen() 
{ 
    boost::asio::io_service take2; 
    boost::asio::ip::udp::socket socket_test(take2); 

я получаю это:

Unhandled exception at 0x6384D4A1 in program.exe: 0xC00001A5: An invalid exception handler routine has been detected (parameters: 0x00000003). 

Я действительно не знаю, что здесь происходит. Я построил подталкивание с

b2.exe --build типа = полная --stagedir = Bin32 адресно-модель = 32 ступени

и все кажется правильным. Что мне не хватает?

Ну, я добился большего прогресса. Проблема возникает, когда вы создаете сокет UDP для повышения производительности в библиотеке и создаете ускоряющий UDP-сокет в коде, вызывающем библиотеку.

So: 
Main 
| 
| Create UDP Socket 
| 
CALL LIBRARY 
| 
| 
| Create UDP SOCKET <--- Heap corruption 

ответ

0

Проблема была с Boost.Asio и использовать его из двух отдельных проектов. Установка BOOST_ASIO_DISABLE_IOCP в обоих свойствах проекта устраняет проблему. Вероятно, существует «лучший способ» использования IOCP, но это решило его в будущем.

1

Может быть, вы собираете с заголовками 1_55, но связь с LIBS из 1_62

+0

Думал об этом, я переименовал каталог, в котором находились заголовки 1_55. Который я думал, исправил его, поскольку он работал после перекомпиляции. Однажды, затем нажмите ошибку в следующий раз. Это настоящий головной скребок. – PhilD

+0

Нет, я сдул старые заголовки и библиотеки 1_55, все равно получаю тот же результат. Я собрал небольшое тестовое приложение, пытающееся его воссоздать, и оно не проявляет такого же поведения. Мне придется медленно отрезать часть моего приложения, пока я не выясню, что это такое. – PhilD

+0

У меня нет других идей по этой проблеме, скажите, почему, если вы решите проблему,^_^ – ERWIN

 Смежные вопросы

  • Нет связанных вопросов^_^