найти список всех доступных имен хостов

У меня есть приложение, в котором пользователь может динамически настраивать TCP-соединения между удаленными процессами. Я хотел бы убедиться, что пользовательский ввод действителен, предоставляя им QComboBox это предварительно заполнено всеми действительными именами хоста в их сети. Есть ли способ найти список имен хостов, используя Qt?

Если возможно, я бы хотел сделать это как на Windows, так и на Linux.

0

Решение

Это может быть достигнуто с использованием классов Qt, но вам также понадобится использовать системные инструменты для сбора информации об имени хоста, и эти инструменты различаются в Linux и Windows. Тем не менее, с простым переключателем препроцессора, мы можем использовать QProcess чтобы вызвать правильный и вытащить имена хостов из результата, используя QRegExp:

// find valid hostnames
QStringList hostnames;
QRegExp hostnameRx("\\\\\\\\(.*)");
QProcess cmd(this);

#ifdef _WIN32
cmd.start("cmd.exe");
cmd.write("net view\r\n");
cmd.write("exit\r\n");
#else
cmd.start("smbtree", QStringList() << "--no-pass");
#endif // _WIN32

cmd.waitForFinished();

while (!cmd.atEnd())
{
QString line = cmd.readLine();
hostnameRx.indexIn(line);
if (!hostnameRx.cap(1).trimmed().isEmpty())
{
hostnames << hostnameRx.cap(1).trimmed();
}
}

Регулярное выражение удаляет начало ‘\\’, возвращенное обоими net view а также smbtree, так как QTcpSocket соединения принимают имена хостов без него.

Очевидно, что QStringListможет быть использован для заполнения QComboBox:

QComboBox* box = new QComboBox(this);
box->insertItems(0, hostnames);

НОТА: net view а также smbtree только покажу компьютеры с доступными акциями. Ты можешь попробовать nmap для более полного списка живых хостов, но вам нужно будет работать от имени root, и вы все равно, вероятно, столкнетесь с множеством проблем с брандмауэром.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]