diff --git a/emmy_debugger/include/emmy_debugger/transporter/transporter.h b/emmy_debugger/include/emmy_debugger/transporter/transporter.h index 6c6dcc3..89c2117 100644 --- a/emmy_debugger/include/emmy_debugger/transporter/transporter.h +++ b/emmy_debugger/include/emmy_debugger/transporter/transporter.h @@ -84,4 +84,6 @@ class Transporter { void Run(); virtual void OnDisconnect(); virtual void OnConnect(bool suc); + // helper for both client and server + static bool ParseSocketAddress(const std::string &host, int port, sockaddr_storage *addr, std::string &err); }; diff --git a/emmy_debugger/src/transporter/socket_client_transporter.cpp b/emmy_debugger/src/transporter/socket_client_transporter.cpp index e70d50c..cf91e77 100644 --- a/emmy_debugger/src/transporter/socket_client_transporter.cpp +++ b/emmy_debugger/src/transporter/socket_client_transporter.cpp @@ -59,10 +59,9 @@ bool SocketClientTransporter::Connect(const std::string& host, int port, std::st uvClient.data = this; uv_tcp_init(loop, &uvClient); struct sockaddr_storage addr; - uv_ip6_addr(host.c_str(), port, (struct sockaddr_in6 *) &addr);// 尝试使用IPv6地址 - - if (addr.ss_family == AF_UNSPEC) { - uv_ip4_addr(host.c_str(), port, (struct sockaddr_in *) &addr);// 如果失败,改用IPv4地址 + bool addr_suc = ParseSocketAddress(host, port, &addr, err); + if (!addr_suc) { + return false; } connect_req.data = this; diff --git a/emmy_debugger/src/transporter/socket_server_transporter.cpp b/emmy_debugger/src/transporter/socket_server_transporter.cpp index a73cf5c..2b37a63 100644 --- a/emmy_debugger/src/transporter/socket_server_transporter.cpp +++ b/emmy_debugger/src/transporter/socket_server_transporter.cpp @@ -49,10 +49,9 @@ bool SocketServerTransporter::Listen(const std::string& host, int port, std::str uvServer.data = this; uv_tcp_init(loop, &uvServer); struct sockaddr_storage addr; - uv_ip6_addr(host.c_str(), port, (struct sockaddr_in6 *) &addr);// 尝试使用IPv6地址 - - if (addr.ss_family == AF_UNSPEC) { - uv_ip4_addr(host.c_str(), port, (struct sockaddr_in *) &addr);// 如果失败,改用IPv4地址 + bool addr_suc = ParseSocketAddress(host, port, &addr, err); + if (!addr_suc) { + return false; } uv_tcp_bind(&uvServer, reinterpret_cast(&addr), 0); diff --git a/emmy_debugger/src/transporter/transporter.cpp b/emmy_debugger/src/transporter/transporter.cpp index 7fbc53a..5aeb28e 100644 --- a/emmy_debugger/src/transporter/transporter.cpp +++ b/emmy_debugger/src/transporter/transporter.cpp @@ -244,3 +244,22 @@ int Transporter::Stop() running = false; return 0; } + +bool Transporter::ParseSocketAddress(const std::string &host, int port, sockaddr_storage *addr, std::string &err) +{ + const int ip6_addr_res = uv_ip6_addr(host.c_str(), port, reinterpret_cast(addr));// 尝试使用IPv6地址 + if (ip6_addr_res == 0) { + return true; + } + + const int ip4_addr_res = uv_ip4_addr(host.c_str(), port, reinterpret_cast(addr));// 如果失败,改用IPv4地址 + if (ip4_addr_res == 0) { + return true; + } + + err = "Invalid host. IPv6 error: "; + err += uv_strerror(ip6_addr_res); + err += ". IPv4 error: "; + err += uv_strerror(ip4_addr_res); + return false; +}