我有一个应用程序,用户可以在其中动态配置远程进程之间的TCP连接。我想确保用户输入有效,方法是为他们提供一个预先填充了网络上所有有效主机名的QComboBox
。有没有办法使用Qt找到主机名列表?
如果可能的话,我想在Windows和Linux上都这样做。
答案 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 view
和smbtree
返回的开始'\\',因为QTcpSocket
连接在没有它的情况下占用主机名。
显然,QStringList
可用于填充QComboBox
:
QComboBox* box = new QComboBox(this);
box->insertItems(0, hostnames);
注意: net view
和smbtree
仅显示具有可访问共享的计算机。您可以尝试使用nmap
获取更完整的实时主机列表,但是您需要以root用户身份运行,并且您仍可能遇到很多防火墙问题。