diff --git a/src/MeoAssistant/Controller.cpp b/src/MeoAssistant/Controller.cpp index 34bbf3d6aa..e5d1cc973f 100644 --- a/src/MeoAssistant/Controller.cpp +++ b/src/MeoAssistant/Controller.cpp @@ -328,16 +328,16 @@ std::optional asst::Controller::call_command(const std::string& cmd closesocket(client_socket); } else { - // reset the overlapped since we reuse it for different handle - auto event = sockov.hEvent; - sockov = {}; - sockov.hEvent = event; + // reset the overlapped since we reuse it for different handle + auto event = sockov.hEvent; + sockov = {}; + sockov.hEvent = event; - (void)ReadFile(reinterpret_cast(client_socket), m_socket_buffer.get(), PipeBuffSize, - nullptr, &sockov); + (void)ReadFile(reinterpret_cast(client_socket), m_socket_buffer.get(), PipeBuffSize, + nullptr, &sockov); + } } } - } else { // ReadFile DWORD len = 0; @@ -349,13 +349,13 @@ std::optional asst::Controller::call_command(const std::string& cmd closesocket(client_socket); } else { - (void)ReadFile(reinterpret_cast(client_socket), m_socket_buffer.get(), PipeBuffSize, - nullptr, &sockov); - } + (void)ReadFile(reinterpret_cast(client_socket), m_socket_buffer.get(), PipeBuffSize, + nullptr, &sockov); + } } else { //err = GetLastError(); - socket_eof = true; + socket_eof = true; } } } @@ -585,8 +585,7 @@ int asst::Controller::push_cmd(const std::string& cmd) return static_cast(++m_push_id); } -std::optional asst::Controller::try_to_init_socket(const std::string& local_address, - unsigned short try_port, unsigned short try_times) +std::optional asst::Controller::try_to_init_socket(const std::string& local_address) { LogTraceFunction; @@ -615,29 +614,25 @@ std::optional asst::Controller::try_to_init_socket(const std::st bool server_start = false; uint16_t port_result = 0; - uint16_t max_port = try_port + try_times; - for (uint16_t port = try_port; port < max_port; ++port) { - Log.trace("try to bind port", port); #ifdef _WIN32 - m_server_addr.sin_port = htons(port); - int bind_ret = ::bind(m_server_sock, reinterpret_cast(&m_server_addr), sizeof(SOCKADDR)); - int listen_ret = ::listen(m_server_sock, 3); - server_start = bind_ret == 0 && listen_ret == 0; + m_server_addr.sin_port = htons(0); + int bind_ret = ::bind(m_server_sock, reinterpret_cast(&m_server_addr), sizeof(SOCKADDR)); + int addrlen = sizeof(m_server_addr); + int getname_ret = getsockname(m_server_sock, reinterpret_cast(&m_server_addr), &addrlen); + int listen_ret = ::listen(m_server_sock, 3); + server_start = bind_ret == 0 && getname_ret == 0 && listen_ret == 0; #else - // todo + // todo #endif - if (server_start) { - port_result = port; - break; - } - } if (!server_start) { Log.info("not supports netcat"); return std::nullopt; } + port_result = ntohs(m_server_addr.sin_port); + Log.info("server_start", local_address, port_result); return port_result; } diff --git a/src/MeoAssistant/Controller.h b/src/MeoAssistant/Controller.h index 40c0559e35..679b7b1066 100644 --- a/src/MeoAssistant/Controller.h +++ b/src/MeoAssistant/Controller.h @@ -79,8 +79,7 @@ namespace asst bool recv_by_socket = false); int push_cmd(const std::string& cmd); - std::optional try_to_init_socket(const std::string& local_address, unsigned short try_port, - unsigned short try_times = 10U); + std::optional try_to_init_socket(const std::string& local_address); using DecodeFunc = std::function; bool screencap();