В настоящее время я кодирую портовый сканер в Qt (C++) для Mac. Процесс проверки того, открыт ли какой-либо порт или нет, работает полностью нормально. Но, если диапазон портов, который пользователь хочет проверить, слишком велик, каждый порт будет проверяться, но выход будет происходить только после этого процесса. Программа фактически должна проверять, например, порт 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()'] (http://doc.qt.io/ qt-5/qcoreapplication.html # processEvents), чтобы дать пользовательскому интерфейсу возможность обрабатывать сообщения и показывать обновления. –
@KarstenKoop Большое спасибо! Это решило мою проблему. –
Ваш код блокирует gui. Прекратите блокировать gui, и все будет хорошо. Вы ** ** выходите после каждой итерации, но никогда не возвращаете * в цикл событий, поэтому пользовательский интерфейс не имеет возможности обновиться. ** Не используйте ** processEvents'. Рассматривайте любое использование этого метода как ошибку. Это асинхронный мир, не пишите код, который притворяется иначе, и вы сэкономите массу неприятностей. –