zhouchaoya142526 2019-05-14 11:52 采纳率: 0%
浏览 1322

使用websocketpp搭建服务器,在服务器端向客户端推送消息报错

0x000007FEFCFA940D 处(位于 QuoteWS.exe 中)引发的异常: Microsoft C++ 异常: websocketpp::exception,位于内存位置 0x000000000230E9C0 处

class broadcast_server{
public:
    broadcast_server() {
        m_server.clear_access_channels(websocketpp::log::alevel::all);
        m_server.set_access_channels(websocketpp::log::alevel::access_core);
        m_server.set_access_channels(websocketpp::log::alevel::app);

        // Initialize Asio Transport
        m_server.init_asio();

        // Register handler callbacks
        m_server.set_open_handler(bind(&broadcast_server::on_open, this, ::_1));
        m_server.set_close_handler(bind(&broadcast_server::on_close, this, ::_1));
        //m_server.set_message_handler(bind(&broadcast_server::on_message, this, ::_1, ::_2));
    }
    ~broadcast_server() {
        m_server.stop();
    }
    void run(uint16_t port) {
        // listen on specified port
        m_server.listen(port);

        // Start the server accept loop
        m_server.start_accept();

        // Start the ASIO io_service run loop
        try {
            m_server.run();
        }
        catch (const std::exception & e) {
            std::cout << e.what() << std::endl;
        }
    }

    void on_open(connection_hdl hdl) {
        {
            lock_guard<mutex> guard(m_connection_lock);
            m_connections.insert(hdl);
            m_server.send(hdl, strmsg, websocketpp::frame::opcode::text);
        }
    }

    void on_close(connection_hdl hdl) {
        {
        lock_guard<mutex> guard(m_action_lock);
            int count = m_connections.size();
            m_connections.erase(hdl);

            cout << "m_connections size:  " << m_connections.size() << endl;
        }
    }
    void send_messages() 
    {
        clock_t ends = 0;
        clock_t start = 0;
        while (1) {
            unique_lock<mutex> lock(noticemutex);
            while (!IsUpdata) {
                noticedone.wait(lock);
            }
            lock.unlock();
            ends = clock();
            if (IsUpdata && (ends - start) > CLOCKS_PER_SEC)
            {
                //针对大量连接的时候很难保证
                unique_lock<mutex> slock(m_action_lock);
                con_list::iterator it;
                for (it = m_connections.begin(); it != m_connections.end(); it++) 
                {
                    try {
                    ************************************************************
                        m_server.send(*it, "1233", websocketpp::frame::opcode::text);
                        ******************************************
                    }
                    catch (websocketpp::exception const & e) {
                        std::cout <<"error" << e.what() << std::endl;
                    }
                }
                IsUpdata = false;
                start = ends;
                clock_t tmptime = clock();
                slock.unlock();
            }
            else
            {
                Sleep(10);
            }

        }   
    }
    void process_messages() {
#if 0
        while (1) {
            unique_lock<mutex> lock(m_action_lock);
            while (m_actions.empty()) {
                m_action_cond.wait(lock);
            }
            action a = m_actions.front();

            m_actions.pop();
            lock.unlock();

            if (a.type == SUBSCRIBE) {
                lock_guard<mutex> guard(m_connection_lock);
                m_connections.insert(a.hdl);
                m_server.send(a.hdl, strmsg, websocketpp::frame::opcode::text);
            }
            else if (a.type == UNSUBSCRIBE) {
                lock_guard<mutex> guard(m_connection_lock);
                m_connections.erase(a.hdl);
            }
            else {
                // undefined.
            }

        }
#endif
    }
private:
    typedef std::set<connection_hdl, std::owner_less<connection_hdl> > con_list;

    server m_server;
    con_list m_connections;
    std::queue<action> m_actions;

    mutex m_action_lock;
    mutex m_connection_lock;
    mutex m_send_lock;
    condition_variable m_action_cond;

};

在send_message函数中的send函数旧奔溃了

  • 写回答

1条回答 默认 最新

  • 十一夜飞天 2019-05-14 15:14
    关注

    把代码发出来,不然无法分析问题。

    评论

报告相同问题?

悬赏问题

  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?
  • ¥15 乘性高斯噪声在深度学习网络中的应用
  • ¥15 运筹学排序问题中的在线排序
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败