查找所有可访问主机名的列表
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 view
和 smbtree
返回的开头 '\\',因为 QTcpSocket
连接采用没有它的主机名。
显然,QStringList
可用于填充 QComboBox
:
QComboBox* box = new QComboBox(this);
box->insertItems(0, hostnames);
注意: net view
和 smbtree
只会显示具有可访问共享的计算机。您可以尝试 nmap
以获得更完整的活动主机列表,但您将需要 运行 作为 root 并且您仍然可能会遇到很多防火墙问题。
我有一个应用程序,用户可以在其中动态配置远程进程之间的 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 view
和 smbtree
返回的开头 '\\',因为 QTcpSocket
连接采用没有它的主机名。
显然,QStringList
可用于填充 QComboBox
:
QComboBox* box = new QComboBox(this);
box->insertItems(0, hostnames);
注意: net view
和 smbtree
只会显示具有可访问共享的计算机。您可以尝试 nmap
以获得更完整的活动主机列表,但您将需要 运行 作为 root 并且您仍然可能会遇到很多防火墙问题。