找到所有可访问主机名的列表

时间:2015-11-20 14:08:11

标签: c++ qt hostname

我有一个应用程序,用户可以在其中动态配置远程进程之间的TCP连接。我想确保用户输入有效,方法是为他们提供一个预先填充了网络上所有有效主机名的QComboBox。有没有办法使用Qt找到主机名列表?

如果可能的话,我想在Windows和Linux上都这样做。

1 个答案:

答案 0 :(得分: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 viewsmbtree返回的开始'\\',因为QTcpSocket连接在没有它的情况下占用主机名。

显然,QStringList可用于填充QComboBox

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

注意: net viewsmbtree仅显示具有可访问共享的计算机。您可以尝试使用nmap获取更完整的实时主机列表,但是您需要以root用户身份运行,并且您仍可能遇到很多防火墙问题。