diff options
Diffstat (limited to 'networkmanager.cpp')
| -rw-r--r-- | networkmanager.cpp | 55 |
1 files changed, 54 insertions, 1 deletions
diff --git a/networkmanager.cpp b/networkmanager.cpp index 50c81381..4eaecd75 100644 --- a/networkmanager.cpp +++ b/networkmanager.cpp @@ -27,7 +27,7 @@ void NetworkManager::connect_to_master() ms_socket->close(); ms_socket->abort(); - ms_socket->connectToHost(ms_hostname, ms_port); + perform_srv_lookup(); } void NetworkManager::connect_to_server(server_type p_server) @@ -82,6 +82,59 @@ void NetworkManager::handle_ms_packet() } } +void NetworkManager::perform_srv_lookup() +{ + ms_dns = new QDnsLookup(QDnsLookup::SRV, ms_hostname, this); + + connect(ms_dns, SIGNAL(finished()), this, SLOT(on_srv_lookup())); + ms_dns->lookup(); +} + +void NetworkManager::on_srv_lookup() +{ + bool connected = false; + if (ms_dns->error() != QDnsLookup::NoError) + { + qWarning("SRV lookup of the master server DNS failed."); + ms_dns->deleteLater(); + } + else + { + const auto srv_records = ms_dns->serviceRecords(); + + for (const QDnsServiceRecord &record : srv_records) + { + qDebug() << "Connecting to " << record.target(); + ms_socket->connectToHost(record.target(), record.port()); + QTime timer; + timer.start(); + do + { + ao_app->processEvents(); + if (ms_socket->state() == QAbstractSocket::ConnectedState) + { + connected = true; + break; + } + else if (ms_socket->error() != -1) + { + qWarning(QString("Error connecting to master server: %1").arg(ms_socket->errorString()).toStdString().c_str()); + ms_socket->abort(); + ms_socket->close(); + break; + } + } while (timer.elapsed() < timeout_milliseconds); // Very expensive spin-wait loop - it will bring CPU to 100%! + if (connected) break; + else + { + ms_socket->abort(); + ms_socket->close(); + } + } + } + emit ms_connect_finished(connected); +} + void NetworkManager::handle_server_packet() { char buffer[16384] = {0}; |
