Ich schreibe gerade einen Port-Scanner in Qt (C++) für Mac. Die Überprüfung, ob ein bestimmter Port offen ist oder nicht, funktioniert einwandfrei. Aber Wenn der Portbereich, den der Benutzer überprüfen möchte, zu groß ist, wird jeder Port überprüft, aber die Ausgabe erfolgt erst nach diesem Vorgang. Das Programm sollte beispielsweise Port 1 überprüfen und das Ergebnis ausgeben. Danach sollte es das nächste und Ausgang zu überprüfen und so weiter ...Frame nach jeder Iteration aktualisieren
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++;
}
Haben Sie bekam jede beraten, wie ich einen Ausgang nach jeder Iteration haben könnte?
Sie können einen Anruf auf [ 'QApplication :: process()'] setzen wollen (http://doc.qt.io/ qt-5/qcoreapplication.html # processEvents) in Ihre Schleife, um der Benutzeroberfläche die Möglichkeit zu geben, Nachrichten zu verarbeiten und Aktualisierungen anzuzeigen. –
@KarstenKoop Vielen Dank! Das hat mein Problem gelöst. –
Ihr Code blockiert die GUI. Hör auf, die GUI zu blockieren und alles wird gut. Sie ** werden nach jeder Iteration ausgegeben, aber Sie * kehren * niemals zur Ereignisschleife zurück, sodass die Benutzeroberfläche keine Möglichkeit hat, sich selbst zu aktualisieren. ** Benutze 'processEvents' nicht **. Behandle jede Verwendung dieser Methode als Fehler. Es ist eine asynchrone Welt, schreibe keinen Code, der etwas anderes vorgibt und du ersparst dir jede Menge Ärger. –