diff --git a/examples/proto_debuger/new_monitor_form.cpp b/examples/proto_debuger/new_monitor_form.cpp index 8506657e..2b2e9cb5 100644 --- a/examples/proto_debuger/new_monitor_form.cpp +++ b/examples/proto_debuger/new_monitor_form.cpp @@ -137,12 +137,13 @@ void NewMonitorForm::InitWindow() int port = atoi(wstring2string(m_port_select->GetText()).c_str()); m_tcp_client = new TcpClientLibevent(wstring2string(m_ip_select->GetText()), port,nullptr); if (m_tcp_client->Connected()) { - printf("连接成功\r\n"); TcpClientInfo* p = new TcpClientInfo; p->ip = m_port_select->GetText(); p->port = port; p->socket_fd = m_tcp_client->SocketFd(); + printf("连接成功 %d \r\n", p->socket_fd); + auto succ = ::PostMessage(m_parent->GetHWND(), WM_ADD_TCPCLIENT_MONITOR, (WPARAM)p, (LPARAM)m_tcp_client); if (!succ) { diff --git a/examples/proto_debuger/tcp_client.cpp b/examples/proto_debuger/tcp_client.cpp index 122ebc64..c76e9841 100644 --- a/examples/proto_debuger/tcp_client.cpp +++ b/examples/proto_debuger/tcp_client.cpp @@ -7,6 +7,9 @@ #include #include #include +#include + +using namespace std::chrono; static void conn_writecb(struct bufferevent *, void *); static void conn_readcb(struct bufferevent *, void *); @@ -26,9 +29,10 @@ int ThreadRun(TcpClientLibevent *p) { int ret = p->Dispatch(); if (0 > ret){ } - while ((p->mStatus != TcpClientLibevent::UNCONNECTED )) + while ((p->mStatus != TcpClientLibevent::STOP)) { - if (p->mStatus == TcpClientLibevent::FAIL) { //杩炴帴澶辫触,濡傛灉鏈夎缃嚜鍔ㄩ噸杩炲氨涓鐩撮噸杩 + if ((p->mStatus == TcpClientLibevent::FAIL) || + (p->mStatus == TcpClientLibevent::UNCONNECTED)){ //杩炴帴澶辫触,濡傛灉鏈夎缃嚜鍔ㄩ噸杩炲氨涓鐩撮噸杩 p->ConnectServer(); #ifdef _WIN32 Sleep(100); @@ -39,7 +43,6 @@ int ThreadRun(TcpClientLibevent *p) { ret = p->Dispatch(); } } - p->mStatus = TcpClientLibevent::UNCONNECTED; return 0; } @@ -82,11 +85,10 @@ void conn_eventcb(struct bufferevent *bev, short events, void *user_data) } else if (events & BEV_EVENT_CONNECTED) { p->mSocketFD = (uint64_t)event_get_fd(&(bev->ev_read)); - printf("Connect succeed %d %d \n", p->mSocketFD, event_get_fd(&(bev->ev_write))); //瀹㈡埛绔摼鎺ユ垚鍔熷悗锛岀粰鏈嶅姟鍣ㄥ彂閫佺涓鏉℃秷鎭 if (nullptr != p->mObserver) p->mObserver->OnConnected(); - p->mStatus = TcpClientLibevent::UNCONNECTED; + p->mStatus = TcpClientLibevent::CONNECTED; return; } bufferevent_free(bev); @@ -103,8 +105,8 @@ bool TcpClientLibevent::Connected() { } TcpClientLibevent::TcpClientLibevent(std::string addrinfo, int port, TcpClientLibevent::TcpClientObserver *p) : - mStatus(UNCONNECTED), - mObserver(nullptr) + mStatus(UNCONNECTED), + mObserver(nullptr) { memset(&mSrv, 0, sizeof(mSrv)); #ifdef linux @@ -127,33 +129,71 @@ TcpClientLibevent::TcpClientLibevent(std::string addrinfo, int port, TcpClientLi #else evthread_use_pthreads(); #endif - ConnectServer(); this->mThread = new thread(ThreadRun,this); this->mObserver = p; mByteRecv = 0; mByteSend = 0; + + ConnectServerSync(); } int TcpClientLibevent::ConnectServer() { printf("server conecting...\r\n"); evthread_make_base_notifiable(mBase); - bev = bufferevent_socket_new(mBase, -1, + mBev = bufferevent_socket_new(mBase, -1, BEV_OPT_CLOSE_ON_FREE | BEV_OPT_THREADSAFE); - if (nullptr == bev) { + if (nullptr == mBev) { this->mStatus = TcpClientLibevent::FAIL; return - 1; } - bufferevent_setcb(bev, conn_readcb, conn_writecb, conn_eventcb, this); - int flag = bufferevent_socket_connect(bev, (struct sockaddr *)&mSrv, sizeof(mSrv)); - bufferevent_enable(bev, EV_READ | EV_WRITE); + bufferevent_setcb(mBev, conn_readcb, conn_writecb, conn_eventcb, this); + int flag = bufferevent_socket_connect(mBev, (struct sockaddr *)&mSrv, sizeof(mSrv)); + bufferevent_enable(mBev, EV_READ | EV_WRITE); if (-1 == flag) { this->mStatus = TcpClientLibevent::FAIL; - bufferevent_free(bev); - bev = nullptr; + bufferevent_free(mBev); + mBev = nullptr; printf("Connect failed\n"); return -1; } - this->mStatus = TcpClientLibevent::CONNECTED; + this->mStatus = TcpClientLibevent::CONNECTING; + return 0; +} + +int TcpClientLibevent::ConnectServerSync() +{ + evthread_make_base_notifiable(mBase); + if (nullptr != mBev) + { + delete mBev; + } + mBev = bufferevent_socket_new(mBase, -1, + BEV_OPT_CLOSE_ON_FREE | BEV_OPT_THREADSAFE); + if (nullptr == mBev) { + this->mStatus = TcpClientLibevent::FAIL; + return -1; + } + bufferevent_setcb(mBev, conn_readcb, conn_writecb, conn_eventcb, this); + int flag = bufferevent_socket_connect(mBev, (struct sockaddr*)&mSrv, sizeof(mSrv)); + bufferevent_enable(mBev, EV_READ | EV_WRITE); + if (-1 == flag) { + this->mStatus = TcpClientLibevent::FAIL; + bufferevent_free(mBev); + mBev = nullptr; + printf("Connect failed\n"); + return -1; + } + + this->mStatus = TcpClientLibevent::CONNECTING; + auto start = system_clock::to_time_t(system_clock::now()); + while (this->mStatus != TcpClientLibevent::CONNECTED) { + auto end = system_clock::to_time_t(system_clock::now()); + + if ((end - start) > 2) { + this->mStatus = TcpClientLibevent::FAIL; + break; + } + } return 0; } diff --git a/examples/proto_debuger/tcp_client.h b/examples/proto_debuger/tcp_client.h index 2acdcf82..710ebf90 100644 --- a/examples/proto_debuger/tcp_client.h +++ b/examples/proto_debuger/tcp_client.h @@ -40,8 +40,10 @@ class TcpClientLibevent { public: typedef enum { UNCONNECTED, // 鏈繛鎺 + CONNECTING, //宸茬粡杩炴帴 CONNECTED, //宸茬粡杩炴帴 FAIL, // 杩炴帴澶辫触 + STOP, // 鍒濆鐘舵 }Status; class TcpClientObserver { @@ -61,12 +63,15 @@ public: friend void conn_eventcb(struct bufferevent*, short, void*); int ConnectServer(); + int ConnectServerSync(); + bool Connected(); int Dispatch(); int OnTCPPackage(uint8_t*, uint16_t); int SetReconnect(bool); int SetObserver(TcpClientObserver*); int Close(); + uint64_t SocketFd(); Status mStatus; @@ -75,7 +80,7 @@ private: bool mReConnect = false; int sendData(void*, size_t); struct event_base* mBase; - struct bufferevent* bev; + struct bufferevent* mBev; struct sockaddr_in mSrv; std::thread* mThread; mutex mLock; // 浜掓枼閿 diff --git a/examples/proto_debuger/tcp_client_form.cpp b/examples/proto_debuger/tcp_client_form.cpp index 88f616f1..4592c106 100644 --- a/examples/proto_debuger/tcp_client_form.cpp +++ b/examples/proto_debuger/tcp_client_form.cpp @@ -24,6 +24,7 @@ void TcpClientForm::Init() } + void TcpClientForm::HandleMessage(ui::EventArgs& msg) { } diff --git a/third_party/cef_wrapper/libcef_dll_wrapper.vcxproj b/third_party/cef_wrapper/libcef_dll_wrapper.vcxproj index 24f9ab63..b76430af 100644 --- a/third_party/cef_wrapper/libcef_dll_wrapper.vcxproj +++ b/third_party/cef_wrapper/libcef_dll_wrapper.vcxproj @@ -36,7 +36,7 @@ StaticLibrary false Unicode - v120_xp + v142 StaticLibrary diff --git a/ui_components/ui_components.vcxproj b/ui_components/ui_components.vcxproj index 7c7902da..3b423c54 100644 --- a/ui_components/ui_components.vcxproj +++ b/ui_components/ui_components.vcxproj @@ -42,7 +42,7 @@ StaticLibrary true - v120_xp + v142 Unicode @@ -242,8 +242,8 @@ - - {a9d6dc71-c0dc-4549-aea0-3b15b44e86a9} + + {e106acd7-4e53-4aee-942b-d0dd426db34e}