【发布时间】:2023-04-03 19:09:01
【问题描述】:
我目前正在为 Mac 编写 Qt(C++) 中的端口扫描程序。检查某个端口是否打开的过程完全正常。 但是如果用户想要检查的端口范围太大,每个端口都会被检查,但是只有在这个过程之后才会输出。 该程序实际上应该检查例如端口 1 并输出结果。之后它应该检查下一个和输出等等......
void MainWindow::checkPort(int portmin, int portmax, string ip) {
int dif = portmax - portmin;
if (dif <= 0)
return;
unsigned int open = 0;
unsigned int closed = 0;
int checked = 0;
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr(ip.c_str());
for (int i = portmin; i <= portmax; i++) {
int s = socket(AF_INET, SOCK_STREAM, 0);
addr.sin_port = htons(i);
int con = ::connect(s, reinterpret_cast<sockaddr*>(&addr), sizeof(sockaddr));
if (con == 0){
ui->textEdit->setTextColor(Qt::green);
ui->textEdit->append("Port " + QString::number(i) + " open.");
open++;
}
if (con == -1) {
ui->textEdit->setTextColor(Qt::red);
ui->textEdit->append("Port " + QString::number(i) + " closed.");
closed++;
}
::close(con);
::close(s);
checked++;
}
您有什么建议我如何在每次迭代后获得输出?
【问题讨论】:
-
您可能希望在循环中调用
QApplication::processEvents(),让 UI 有机会处理消息并显示更新。 -
@KarstenKoop 非常感谢!这解决了我的问题。
-
您的代码阻止了 gui。停止阻止 gui,一切都会好起来的。您正在在每次迭代后都有输出,但您永远不会返回到事件循环,因此 UI 没有机会刷新自己。 不要使用
processEvents。将此方法的任何使用视为错误。这是一个异步的世界,不要写假装的代码,你会为自己省去很多麻烦。 -
@KarstenKoop 这将重新进入事件循环,并简单地隐藏端口扫描仪不应该以这种方式开始编写的事实。
标签: c++ qt sockets port port-scanning