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

find list of all accessible hostnames

我有一个应用程序,用户可以在其中动态配置远程进程之间的 TCP 连接。我想确保用户输入有效,方法是向他们提供 QComboBox,该 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 viewsmbtree 返回的开头 '\\',因为 QTcpSocket 连接采用没有它的主机名。

显然,QStringList可用于填充 QComboBox:

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

注意: net viewsmbtree 只会显示具有可访问共享的计算机。您可以尝试 nmap 以获得更完整的活动主机列表,但您将需要 运行 作为 root 并且您仍然可能会遇到很多防火墙问题。