2015-11-20 7 views
0

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

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

ответ

0

Этого можно достичь с помощью классов Qt, но вам также понадобятся системные инструменты для сбора информации о имени хоста, и эти инструменты отличаются между Linux и окнами. Тем не менее, с помощью простого переключателя препроцессора, мы можем использовать 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 для получения более полного списка живых хостов, но вам нужно будет запускаться с правами администратора, и вы все равно, вероятно, столкнетесь с множеством проблем с брандмауэром.

Смежные вопросы