M louloulibs/network/tcp_socket_handler.cpp => louloulibs/network/tcp_socket_handler.cpp +6 -3
@@ 40,15 40,16 @@ TCPSocketHandler::TCPSocketHandler(std::shared_ptr<Poller> poller):
SocketHandler(poller, -1),
use_tls(false),
connected(false),
- connecting(false)
+ connecting(false),
#ifdef CARES_FOUND
- ,resolving(false),
+ resolving(false),
resolved(false),
resolved4(false),
resolved6(false),
cares_addrinfo(nullptr),
- cares_error()
+ cares_error(),
#endif
+ hostname_resolution_failed(false)
{}
TCPSocketHandler::~TCPSocketHandler()
@@ 109,6 110,7 @@ void TCPSocketHandler::connect(const std::string& address, const std::string& po
addr_res = this->cares_addrinfo;
if (!addr_res)
{
+ this->hostname_resolution_failed = true;
const auto msg = this->cares_error;
this->close();
this->on_connection_failed(msg);
@@ 129,6 131,7 @@ void TCPSocketHandler::connect(const std::string& address, const std::string& po
if (res != 0)
{
log_warning("getaddrinfo failed: "s + gai_strerror(res));
+ this->hostname_resolution_failed = true;
this->close();
this->on_connection_failed(gai_strerror(res));
return ;
M louloulibs/network/tcp_socket_handler.hpp => louloulibs/network/tcp_socket_handler.hpp +2 -0
@@ 256,6 256,8 @@ protected:
std::string cares_error;
#endif // CARES_FOUND
+ bool hostname_resolution_failed;
+
private:
TCPSocketHandler(const TCPSocketHandler&) = delete;
TCPSocketHandler(TCPSocketHandler&&) = delete;
M src/irc/irc_client.cpp => src/irc/irc_client.cpp +5 -0
@@ 72,6 72,11 @@ void IrcClient::on_connection_failed(const std::string& reason)
{
this->bridge->send_xmpp_message(this->hostname, "",
"Connection failed: "s + reason);
+
+ if (this->hostname_resolution_failed)
+ while (!this->ports_to_try.empty())
+ this->ports_to_try.pop();
+
if (this->ports_to_try.empty())
{
// Send an error message for all room that the user wanted to join