diff --git a/protoDebuger/NetSelect.qml b/protoDebuger/NetSelect.qml index a18efad..f8f4242 100644 --- a/protoDebuger/NetSelect.qml +++ b/protoDebuger/NetSelect.qml @@ -224,7 +224,7 @@ Item { onClicked: { if(button_network.text == "正在监听"){ button_close.visible = false - DataWrap.closeNetwork(); + DataWrap.closeNetwork("tcpserver"); button_network.text = "打开网络" } } diff --git a/protoDebuger/network_controller.h b/protoDebuger/network_controller.h index d2eee4d..d8fe6b2 100644 --- a/protoDebuger/network_controller.h +++ b/protoDebuger/network_controller.h @@ -52,7 +52,6 @@ signals: void on_send_data(QByteArray); private: NetworkType _checkType(NetworkType); - NetworkType mType; QUdpSocket *mUDP; QTcpSocket *mTcp; diff --git a/protoDebuger/sharedata.cpp b/protoDebuger/sharedata.cpp index 761c533..51fd57f 100644 --- a/protoDebuger/sharedata.cpp +++ b/protoDebuger/sharedata.cpp @@ -117,9 +117,18 @@ int QmlShareData::openNetwork(QString ip, unsigned int port, bool is_ws,int type return -1; } -int QmlShareData::closeNetwork() +int QmlShareData::closeNetwork(QString type) { - m_network_->Close(); + if(type == "tcpserver"){ + if(nullptr != m_tcp_server){ + m_tcp_server->StopServer(); + delete m_tcp_server; + m_tcp_server = nullptr; + } + } + else + m_network_->Close(); + } int QmlShareData::closeSerial() diff --git a/protoDebuger/sharedata.h b/protoDebuger/sharedata.h index 66c2778..ca12165 100644 --- a/protoDebuger/sharedata.h +++ b/protoDebuger/sharedata.h @@ -40,7 +40,7 @@ public: Q_INVOKABLE int openUart(QString port,QString baudRate,QString dataBits,QString stopBits, QString flow); Q_INVOKABLE int openNetwork(QString ip,unsigned int port,bool is_ws,int type); - Q_INVOKABLE int closeNetwork(); + Q_INVOKABLE int closeNetwork(QString); Q_INVOKABLE int closeSerial(); Q_INVOKABLE int TestLua(); diff --git a/protoDebuger/tcp_server_libevent.cpp b/protoDebuger/tcp_server_libevent.cpp index 8376a5a..92dcc76 100644 --- a/protoDebuger/tcp_server_libevent.cpp +++ b/protoDebuger/tcp_server_libevent.cpp @@ -176,14 +176,12 @@ void cb_listener(struct evconnlistener *listener, evutil_socket_t fd, struct soc */ void server_run(TcpServerLibevent *p){ if(nullptr != p){ - if(p->m_status == TcpServerLibevent::STOP){ - p->m_status = TcpServerLibevent::RUNNING; - int ret =event_base_dispatch(p->m_event_base); + while(p->m_status == TcpServerLibevent::RUNNING){ + int ret =event_base_loop(p->m_event_base,EVLOOP_NONBLOCK); if(ret < 0){ - qDebug()<<"libevent ret is "<m_status = TcpServerLibevent::FAIL; + break; } - evconnlistener_free(p->m_event_listener); - event_base_free(p->m_event_base); } } } @@ -261,7 +259,7 @@ TcpServerLibevent::TcpServerLibevent(int port,string bindip) : m_event_listener = evconnlistener_new_bind(m_event_base, cb_listener, this, - LEV_OPT_CLOSE_ON_FREE|LEV_OPT_REUSEABLE, + LEV_OPT_CLOSE_ON_FREE|LEV_OPT_REUSEABLE|LEV_OPT_THREADSAFE, m_backlog, (struct sockaddr*)&m_server_addr, sizeof(m_server_addr)); @@ -279,10 +277,9 @@ TcpServerLibevent::TcpServerLibevent(int port,string bindip) : int TcpServerLibevent::StartServerSync(){ if(m_status == STOP){ m_status = RUNNING; - if( -1 == event_base_dispatch(m_event_base)){ + if(-1 == event_base_dispatch(m_event_base)){ qDebug()<<"error "; } - evconnlistener_free(m_event_listener); event_base_free(m_event_base); return 0; } @@ -301,11 +298,37 @@ int TcpServerLibevent::StartServerAsync(){ #ifdef linux evthread_use_pthreads(); #endif + m_status = RUNNING; + m_thread = new std::thread(server_run,this); m_thread->detach(); return 0; } - return -1; + return -1; +} + +int TcpServerLibevent::StopServer() +{ + struct timeval v; + v.tv_usec = 1000; + v.tv_sec = 0; + + if(m_status == RUNNING){ + int ret = event_base_loopexit(m_event_base,&v); + if (ret < 0){ + // todo write log + + } + evconnlistener_free(this->m_event_listener); + if(ret < 0){ + // todo write log + qDebug()<<"evconnlistener_disable"<m_status == RUNNING){ m_thread->detach(); - event_base_loopbreak(m_event_base); - this->m_status = STOP; + struct timeval v; + v.tv_usec = 1000; + v.tv_sec = 1; + + int ret = event_base_loopexit(m_event_base,&v); + this->m_status = STOP; } + if(nullptr != m_event_base){ + event_base_free(m_event_base); + delete m_event_base; + m_event_base = nullptr; + } + if(nullptr != m_event_listener){ + delete m_event_listener; + m_event_listener = nullptr; + } + } diff --git a/protoDebuger/tcp_server_libevent.h b/protoDebuger/tcp_server_libevent.h index 1b2dd58..34db0df 100644 --- a/protoDebuger/tcp_server_libevent.h +++ b/protoDebuger/tcp_server_libevent.h @@ -101,6 +101,7 @@ public: ~TcpServerLibevent(); int StartServerSync(); // 同步启动服务器 int StartServerAsync(); // 异步启动服务 + int StopServer(); int RemoveConnection(uint32_t ); int SetNewConnectionHandle(OnAccept ); friend void cb_listener(struct evconnlistener *listener, evutil_socket_t fd, struct sockaddr *addr, int len, void *ptr); @@ -108,7 +109,13 @@ public: friend void event_cb(struct bufferevent *bev, short events, void *arg); friend void write_cb(struct bufferevent *bev, void *arg); friend void server_run(TcpServerLibevent *p); - + +#ifdef Qt_Support +signals: + int on_onnected(string ip,uint sock); + int on_disconected(string ip,uint sock); + +#endif private: uint32_t m_port; // 监听端口号 string m_bind_ip; // 绑定端口号