// ---------------------------------------------------------------------------- bool ConnectToServer::tryConnect(int timeout, int retry, bool another_port) { m_retry_count = retry; ENetEvent event; ENetAddress ea; ea.host = STKHost::HOST_ANY; ea.port = STKHost::PORT_ANY; Network* nw = another_port ? new Network(/*peer_count*/1, /*channel_limit*/EVENT_CHANNEL_COUNT, /*max_in_bandwidth*/0, /*max_out_bandwidth*/0, &ea, true/*change_port_if_bound*/) : STKHost::get()->getNetwork(); assert(nw); m_done_intecept = false; nw->getENetHost()->intercept = ConnectToServer::interceptCallback; while (--m_retry_count >= 0 && !ProtocolManager::lock()->isExiting()) { ENetPeer* p = nw->connectTo(m_server_address); if (!p) break; Log::info("ConnectToServer", "Trying connecting to %s from port %d, " "retry remain: %d", m_server_address.toString().c_str(), nw->getENetHost()->address.port, m_retry_count); while (enet_host_service(nw->getENetHost(), &event, timeout) != 0) { if (event.type == ENET_EVENT_TYPE_CONNECT) { Log::info("ConnectToServer", "Connected to %s", m_server_address.toString().c_str()); nw->getENetHost()->intercept = NULL; STKHost::get()->initClientNetwork(event, nw); m_state = DONE; return true; } } // Reset old peer in case server address differs due to intercept enet_peer_reset(p); } if (another_port) delete nw; return false; } // tryConnect