Нарушение сокета Boost Async_Connect

ниже приведен небольшой фрагмент кода, который выдает нарушение прав доступа при запуске. Я использую Visual Studio 2015 и повысить 1.60.0 и при звонке

m_socket.async_connect(end_point, yieldw[ec]);

нарушение прав доступа происходит в файле надстройки «socket_ops.ipp» в строке

"socket_type s = error_wrapper(::WSASocketW(af, type, protocol, 0, 0,WSA_FLAG_OVERLAPPED),ec);"

Исключением является «Необработанное исключение в 0x000007FEFD598A2F (KernelBase.dll) в ConsoleApplication4.exe: 0xC0000005: Место чтения нарушения доступа 0xFFFFFFFFFFFFFFFF.»

#include "stdafx.h"#include <memory>
#include <boost/asio/io_service.hpp>
#include <boost/asio/ip/tcp.hpp>
#include <boost/asio/spawn.hpp>
#include <boost/asio/write.hpp>
#include <cassert>
#include <thread>
#include <chrono>

int main()
{

boost::asio::io_service m_io_service;
//boost::asio::io_service::strand m_socket_strand{ m_io_service };
boost::asio::io_service::work m_work(m_io_service);
boost::asio::ip::tcp::socket m_socket(m_io_service);

std::thread thread([&]() {
m_io_service.run();
});

boost::asio::ip::tcp protocol_family{ boost::asio::ip::tcp::v4() };
boost::asio::ip::tcp::resolver::query query(protocol_family, "localhost", std::to_string(2101));

boost::asio::ip::tcp::resolver resolver(m_io_service);

boost::asio::ip::tcp::resolver::iterator iterator{ resolver.resolve(query) }; // Hosts can have multiple addresses.
/*boost::asio::ip::tcp::resolver::iterator end_iterator{ iterator };
end_iterator++;
boost::asio::ip::tcp::resolver::iterator end;

if (end_iterator != end)
{
std::ostringstream endpoint_descripiton;
}*/

assert(iterator != boost::asio::ip::tcp::resolver::iterator());

auto end_point = iterator->endpoint();

boost::asio::spawn(m_io_service, [&, end_point](boost::asio::yield_context yieldw)
{
boost::system::error_code ec;

m_socket.async_connect(end_point, yieldw[ec]);

if (ec != boost::system::errc::success)
{
std::this_thread::sleep_for(std::chrono::seconds(5));
}
else
{
}

});std::this_thread::sleep_for(std::chrono::seconds(20));
return 0;

}

0

Решение

Хорошо, покопавшись, я обнаружил, что эта проблема возникла только у меня в отладке x64, все остальные конфигурации были в порядке. Поэтому я решил, что, возможно, что-то еще не так с моей настройкой или библиотеками. Попробовав последнюю версию boost 1_63_0 и обнаружив, что ошибка исчезла, я снова отслеживал версии, пока ошибка не появлялась снова, и затем пошел, чтобы проверить примечания к выпуску последней рабочей копии. Я нашел следующее https://svn.boost.org/trac/boost/ticket/12215 у которого те же проблемы, что и у меня. Использование boost 1_62_0 или более поздней версии решает проблему.

0

Другие решения

Других решений пока нет …