Qt определяет, указывает ли данное имя хоста на localhost

Мое приложение подключается к TCP-серверу. Я хотел бы, чтобы он знал о том, что он работает на том же хосте, что и серверное приложение, чтобы он мог в конечном итоге напрямую запустить серверный процесс, если он не работает.

Поскольку сервер прослушивает интерфейс, а приложение разрешает имя хоста для подключения к серверу, мне не так очевидно определить, указывает ли настроенное имя хоста, используемое для подключения сервера, на тот же хост, что и сервер, или нет.

Я хотел бы что-то вроде этого:

bool isThisLocalHost(QString hostName) {
     //resolve hostname's address
     //list localhost interfaces ip or hw addresses ?
     //if the hostname address matches one of the host interfaces address
     //pseudo code         
     bool bRes = interfaces_addresses_list.contains(hostname_address);

     return bRes;
}

На самом деле я пытаюсь добиться этого с помощью QNetworkInterface, QNetworkAddressEntry, QHostInfo, QHostAddress.

Может есть простой способ?


person spacm    schedule 10.05.2016    source источник
comment
Недостаточно проверить, является ли это локальным хостом (127.x.x.x), вы также должны проверить, является ли это адресом любого из локальных интерфейсов.   -  person Kuba hasn't forgotten Monica    schedule 10.05.2016
comment
Да, я думаю, что мой ответ делает то же самое, что и ваш, но блокирует (что я не возражаю в моем случае использования). Не видел вопрос о том, как проверить, является ли сетевой адрес локальным в Qt.   -  person spacm    schedule 11.05.2016


Ответы (2)


Вот что я получил:

bool isThisLocalHost(QString hostName) {
    QList <QHostAddress> lAddrHostName = QHostInfo::fromName(hostName).addresses();
    QList <QHostAddress> lAddrLocalHostInterfaces = QNetworkInterface::allAddresses();
    bool bRes = false;
    foreach (QHostAddress addr, lAddrHostName) {
        bRes = bRes || lAddrLocalHostInterfaces.contains(addr);
    }
return bRes;
}
person spacm    schedule 10.05.2016

QHostAddress имеет isLoopback(), который должен дать вам то, что вам нужно.

Если вы просто хотите знать, подключены ли вы к себе, это (частично?) Дубликат этот вопрос.

person Joe    schedule 10.05.2016
comment
Спасибо, сейчас попробую! - person spacm; 10.05.2016
comment
Кажется, это не то, что мне нужно: если я попробую qDebug()<<"is on localhost :"<<QHostAddress("192.168.1.18").isLoopback();, я получу ложь, ожидая истинности, поскольку 192.168.1.18 — это один из интерфейсов хоста, на котором я запускаю свое приложение. - person spacm; 10.05.2016