У меня есть приложение, в котором пользователь может динамически настраивать TCP-соединения между удаленными процессами. Я хотел бы убедиться, что пользовательский ввод действителен, предоставляя им QComboBox
это предварительно заполнено всеми действительными именами хоста в их сети. Есть ли способ найти список имен хостов, используя Qt?
Если возможно, я бы хотел сделать это как на Windows, так и на Linux.
Это может быть достигнуто с использованием классов 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, и вы все равно, вероятно, столкнетесь с множеством проблем с брандмауэром.
Других решений пока нет …