diff --git a/examples/proto_debuger/tcp_server.lua b/examples/proto_debuger/tcp_server.lua index a1defaf0..d963c4a3 100644 --- a/examples/proto_debuger/tcp_server.lua +++ b/examples/proto_debuger/tcp_server.lua @@ -1 +1 @@ -require("string") local file = io.open("writetest.txt", "w+") function OnNewClient(ip,port) showdata("on new client from lua " .. ip..port) end function OnClientRecvData(data,ip,port) showdata("client recieve data from lua "..data.. ip..port) end function OnClientDisconnect(ip,port) showdata("client leave from lua " .. ip..port) end \ No newline at end of file +require("string") local file = io.open("writetest.txt", "w+") function OnNewClient(ip,port) showdata("on new client from lua " .. ip..port) end function OnClientRecvData(data,ip,port) showdata("client recieve 123 from lua "..data.. ip..port) end function OnClientDisconnect(ip,port) showdata("client leave from lua " .. ip..port) end \ No newline at end of file diff --git a/examples/proto_debuger/websocket_server.cpp b/examples/proto_debuger/websocket_server.cpp index 6bc9c7e3..95b06cee 100644 --- a/examples/proto_debuger/websocket_server.cpp +++ b/examples/proto_debuger/websocket_server.cpp @@ -33,6 +33,11 @@ void on_connection_close(WebsocketServer* s, websocketpp::connection_hdl hdl){ s->m_on_close(addr.to_string(), socket.remote_endpoint().port()); } +void on_connection_fail(WebsocketServer* s, websocketpp::connection_hdl hdl) +{ + std::cout << "on_connection_fail"; +} + // Define a callback to handle incoming messages void on_message(WebsocketServer* s, websocketpp::connection_hdl hdl, message_ptr msg) { std::cout << "on_message called with hdl: " << hdl.lock().get() @@ -49,21 +54,6 @@ void on_message(WebsocketServer* s, websocketpp::connection_hdl hdl, message_ptr if (s->m_on_message) s->m_on_message(addr.to_string(), socket.remote_endpoint().port(), msg->get_payload()); - // check for a special command to instruct the server to stop listening so - // it can be cleanly exited. - /* - if (msg->get_payload() == "stop-listening") { - s->m_server->stop_listening(); - return; - } - try { - s->m_server->send(hdl, msg->get_payload(), msg->get_opcode()); - - } catch (websocketpp::exception const & e) { - std::cout << "Echo failed because: " - << "(" << e.what() << ")" << std::endl; - } - */ } std::string WebsocketServer::Url() @@ -80,6 +70,8 @@ WebsocketServer::WebsocketServer(std::string server,uint32_t port){ m_port = port; m_url = server; m_server = new WsServer; + m_status = START_LISTEN; + m_thread = new std::thread([this](){ // Set logging settings m_server->set_access_channels(websocketpp::log::alevel::all); @@ -90,9 +82,29 @@ WebsocketServer::WebsocketServer(std::string server,uint32_t port){ m_server->set_open_handler(std::bind(&on_new_connection,this,::_1)); m_server->set_message_handler(std::bind(&on_message,this,::_1,::_2)); m_server->set_close_handler(std::bind(&on_connection_close,this,::_1)); - m_server->listen(m_port); + m_server->set_fail_handler(std::bind(&on_connection_fail, this, ::_1)); + websocketpp::lib::error_code ec; + m_server->listen(websocketpp::lib::asio::ip::tcp::v4(), + m_port, ec); + if (ec) { + std::cout << "listen failed because: " << ec.message() << std::endl; + this->m_status = WebsocketServer::FAIL; + return ; + } // Start the server accept loop - m_server->start_accept(); + try + { + m_server->start_accept(ec); + if (ec) { + std::cout << "start_accept failed because: " << ec.message() << std::endl; + this->m_status = WebsocketServer::FAIL; + return; + } + } + catch (const std::exception& e) + { + std::cout << e.what(); + } // Start the ASIO io_service run loop m_server->run(); }); diff --git a/examples/proto_debuger/websocket_server.h b/examples/proto_debuger/websocket_server.h index 5f5c08dc..2ead580f 100644 --- a/examples/proto_debuger/websocket_server.h +++ b/examples/proto_debuger/websocket_server.h @@ -18,6 +18,13 @@ typedef WsServer::message_ptr message_ptr; class WebsocketServer { public: + enum Status + { + STOP = 0, + START_LISTEN = 1, + LISTENING = 2, + FAIL = 3, + }; typedef std::function OnNewConnectionHanlder; typedef std::function OnConnectionCloseHanlder; @@ -30,6 +37,8 @@ public: friend void on_new_connection(WebsocketServer* s, websocketpp::connection_hdl hdl); friend void on_message(WebsocketServer* s, websocketpp::connection_hdl hdl, message_ptr msg); friend void on_connection_close(WebsocketServer* s, websocketpp::connection_hdl hdl); + friend void on_connection_fail(WebsocketServer* s, websocketpp::connection_hdl hdl); + int SendData(uint32_t,const char *data,int len,websocketpp::frame::opcode::value); int SendDataAllClient(const char *data,int len,websocketpp::frame::opcode::value); void SetOnNewConnectionHanlder(OnNewConnectionHanlder); @@ -45,6 +54,7 @@ private: OnConnectionCloseHanlder m_on_close; OnMessageHanlder m_on_message; std::map m_clients; + Status m_status; }; diff --git a/examples/proto_debuger/websocket_server_form.cpp b/examples/proto_debuger/websocket_server_form.cpp index 20d9a82c..65e4e460 100644 --- a/examples/proto_debuger/websocket_server_form.cpp +++ b/examples/proto_debuger/websocket_server_form.cpp @@ -30,7 +30,7 @@ WebsocketServerForm::~WebsocketServerForm() { std::cout << "~WebsocketServerForm\r\n"; std::cout << "~WebsocketServerForm\r\n"; - + delete m_server; } void WebsocketServerForm::Init()