diff --git a/utils/TcpModule/src/TcpClientImpl.cpp b/utils/TcpModule/src/TcpClientImpl.cpp index a7c2b6fa..a210ddf2 100644 --- a/utils/TcpModule/src/TcpClientImpl.cpp +++ b/utils/TcpModule/src/TcpClientImpl.cpp @@ -62,16 +62,14 @@ void TcpClientImpl::Init(void) } void TcpClientImpl::UnInit(void) { - if (nullptr != mLoop) { - LogInfo("Stop loop.\n"); - hloop_stop(mLoop); + if (nullptr != mIo) { + LogInfo("Close io.\n"); + hio_close(mIo); + mIo = nullptr; } if (mTcpClientThread.joinable()) { mTcpClientThread.join(); } - hloop_free(&mLoop); - mLoop = nullptr; - mIo = nullptr; } void TcpClientImpl::Readed(const void *data, size_t length) { @@ -93,9 +91,11 @@ void TcpClientImpl::Closed(void) { if (nullptr != mParam.mClosedFunc) { mParam.mClosedFunc(mObjectThis); - return; } - LogWarning("mParam.mClosedFunc is null\n"); + if (nullptr != mLoop) { + LogInfo("Stop loop.\n"); + hloop_stop(mLoop); + } } void TcpClientImpl::Loop(void) { @@ -104,6 +104,8 @@ void TcpClientImpl::Loop(void) return; } hloop_run(mLoop); + hloop_free(&mLoop); + mLoop = nullptr; } std::shared_ptr *NewTcpClient(const TcpClientParam ¶m) { diff --git a/utils/TcpModule/src/TcpServerImpl.cpp b/utils/TcpModule/src/TcpServerImpl.cpp index 9212f481..b67b5618 100644 --- a/utils/TcpModule/src/TcpServerImpl.cpp +++ b/utils/TcpModule/src/TcpServerImpl.cpp @@ -21,6 +21,12 @@ static void on_close(hio_t *io) TcpServerImpl *server = (TcpServerImpl *)hevent_userdata(io); server->RemoveClient(io); } +static void server_on_close(hio_t *io) +{ + LogInfo("server_on_close fd=%d error=%d\n", hio_fd(io), hio_error(io)); + TcpServerImpl *server = (TcpServerImpl *)hevent_userdata(io); + server->Closed(); +} static void on_recv(hio_t *io, void *buf, int readbytes) { LogInfo("on_recv fd=%d readbytes=%d\n", hio_fd(io), readbytes); @@ -104,6 +110,7 @@ void TcpServerImpl::Init(void) LogInfo("listenfd=%d\n", hio_fd(listenio)); hevent_set_userdata(listenio, this); mIo = listenio; + hio_setcb_close(mIo, server_on_close); std::shared_ptr server = shared_from_this(); std::shared_ptr impl = std::dynamic_pointer_cast(server); auto recvThread = [](std::shared_ptr tcpServer) { @@ -115,16 +122,13 @@ void TcpServerImpl::UnInit(void) { LogInfo("UnInit TcpServerImpl\n"); FreeClients(); - if (nullptr != mLoop) { - LogInfo("Stop loop.\n"); - hloop_stop(mLoop); + if (nullptr != mIo) { + hio_close(mIo); + mIo = nullptr; } if (mTcpServerThread.joinable()) { mTcpServerThread.join(); } - hloop_free(&mLoop); - mLoop = nullptr; - mIo = nullptr; } void TcpServerImpl::Loop(void) { @@ -133,6 +137,8 @@ void TcpServerImpl::Loop(void) return; } hloop_run(mLoop); + hloop_free(&mLoop); + mLoop = nullptr; } void TcpServerImpl::AddClient(hio_t *io) { @@ -200,6 +206,13 @@ void TcpServerImpl::FreeClients(void) } mClients.clear(); } +void TcpServerImpl::Closed(void) +{ + if (nullptr != mLoop) { + LogInfo("Stop loop.\n"); + hloop_stop(mLoop); + } +} std::shared_ptr *NewTcpServer(const TcpServerParam ¶m) { LogInfo("Create tcp server object.\n"); diff --git a/utils/TcpModule/src/TcpServerImpl.h b/utils/TcpModule/src/TcpServerImpl.h index c5e1a3cb..68e85ac9 100644 --- a/utils/TcpModule/src/TcpServerImpl.h +++ b/utils/TcpModule/src/TcpServerImpl.h @@ -49,6 +49,7 @@ public: std::shared_ptr *GetClient(hio_t *io); void RemoveClient(hio_t *io); void FreeClients(void); + void Closed(void); private: std::mutex mMutex;