0

下面是一个在运行时引发访问冲突的小片段。我正在使用 Visual Studio 2015 和 boost 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);"

异常是“ConsoleApplication4.exe 中 0x000007FEFD598A2F (KernelBase.dll) 处的未处理异常: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;

}

4

1 回答 1

0

好吧,在四处挖掘之后,我发现这个问题只发生在 x64 调试中,所有其他配置都很好。所以我认为我的设置或库可能有其他问题。在尝试了最新的 boost 1_63_0 并发现错误消失后,我回溯了版本,直到错误再次出现,然后去检查最后一个工作副本的发行说明。我发现以下https://svn.boost.org/trac/boost/ticket/12215与我遇到的问题相同。使用 boost 1_62_0 或更高版本可以解决此问题。

于 2017-04-18T04:05:37.237 回答