使用socketio-client-c ++和boost asio时的访问冲突异常io_service

时间:2016-09-27 12:49:20

标签: c++ boost websocket socket.io boost-asio

我正在尝试使用来自boost asio库(1.61)的io_service和socketio-client-c ++,但是我的代码抛出了访问冲突异常,经过数小时的调试后我无法弄清楚原因是什么。在win_mutex.hpp中的以下位置抛出异常:

void lock()
{
 -> ::EnterCriticalSection(&crit_section_);
}

代码非常简单:

int main(int argc, char* argv[]) {
    boost::asio::io_service io_service;
    auto io_service_work = std::make_shared<boost::asio::io_service::work>      (io_service);

    sio::client client_;
    client_.connect("http://localhost:1337");

    // io_service.run();
}

我想从main使用io_service,而socketio也在内部使用io_service,这可能是导致问题的原因。

您可以下载包含socketio source 和二进制的完整项目:http://stackoverflow-sehe.s3.amazonaws.com/7f1afa6a-883f-4941-8371-31ccbd8514a5/socket-io.zip¹

有什么建议吗?

¹链接编辑;链接(88M,现在443k)

2 个答案:

答案 0 :(得分:1)

因为该行只是使用地址来调用公共Win32 API,所以可能导致这种情况发生的是当this指向随机某事时(例如,被破坏的{{ 1}},其他东西,受保护的内存甚至是nullptr)。

这表示Undefined Behaviour。 UB有很多可能的来源,你的代码不足以得出任何结论。但是在Asio中,99%的时间是因为没有将对象保持足够长的时间以使其上的异步操作完成。

答案 1 :(得分:1)

我已将socketio项目转换为Dll,关闭了boost auto链接,并手动添加了libboost_system-vc140-mt-gd-1_61.lib作为附加依赖项。然后代码按预期工作。

但是,如果我将socketio项目切换回静态库,则会出现问题中描述的相同症状。

请在此处查看基于Dll的项目文件: http://ginf.hu/socketio/socketiotest.zip