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 我这模型写的不对吗?为什么lingo解出来的下面影子价格这一溜少一个变量
  • ¥50 树莓派安卓APK系统签名
  • ¥15 maple软件,用solve求反函数出现rootof,怎么办?
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题
  • ¥20 求一个html代码,有偿
  • ¥100 关于使用MATLAB中copularnd函数的问题
  • ¥20 在虚拟机的pycharm上
  • ¥15 jupyterthemes 设置完毕后没有效果
  • ¥15 matlab图像高斯低通滤波