Ping in C++-Qt

Comments Off on Ping in C++-Qt
Share

Sviluppata con il (prezioso) aiuto di Francesco Sarasini (sarasini.it, dev.sarasini.it),  ecco un’applicazione desktop, progettata in C++ per il framework Qt, che fa il ping verso un host.
Download

L’interfaccia grafica dell’applicativo consiste di una casella testuale txtHost e di due pulsanti di comando cmdLookUpHost e cmdPing col compito di ricercare l’ip relativo all’host e di fare il ping all’host specificato. Ai due pulsanti di comando sono associati rispettivamente due slot (uno slot è una procedura richiamata da un certo evento, per esempio l’evento click) on_cmdPing_clicked() e on_cmdLookUpHost_clicked() (Look_up() è un terzo slot, il file da considerare è mainwindow.h).

class MainWindow : public QMainWindow {
   ...
   private slots:
      void on_cmdPing_clicked();
      void on_cmdLookUpHost_clicked();
      void on_lookup(const QHostInfo &host);
};

Osserviamo il codice degli slot (file mainwindow.cpp):

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}
...
void MainWindow::on_cmdLookUpHost_clicked()
{
    QHostInfo::lookupHost(ui->txtHost->text(), this, SLOT(on_lookup(QHostInfo)));
}

void MainWindow::on_lookup(const QHostInfo &host)
{
    QMessageBox msgbox;

    if (host.error() != QHostInfo::NoError)
    {
         msgbox.setText("Lookup failed: " + host.errorString());
         msgbox.setIcon(QMessageBox::Critical);
         msgbox.exec();
         return;
    }

    foreach (QHostAddress address, host.addresses())
    {
        msgbox.setText("Found address: " + address.toString());
        msgbox.setIcon(QMessageBox::Information);
        msgbox.exec();
    }
}

void MainWindow::on_cmdPing_clicked()
{
    QProcess *ping = new QProcess();
    QString result;
    QStringList args;
    QMessageBox msgbox;

    args << "-c 3" << ui->txtHost->text();

    ping->start("ping", args);

    if(!ping->waitForStarted(6000))
    {
         msgbox.setText("Ping failed");
         msgbox.setIcon(QMessageBox::Critical);
         msgbox.exec();
         return;
    }

    if(!ping->waitForFinished(6000))
    {
         msgbox.setText("Ping failed");
         msgbox.setIcon(QMessageBox::Critical);
         msgbox.exec();
         return;
    }

    result=QString(ping->readAllStandardOutput());

    ping->close();
    msgbox.setText(result);
    msgbox.setIcon(QMessageBox::Information);
    msgbox.exec();
}

Se l’utente clicca sul tasto LookUpHost, viene richiamato il metodo on_look() che ha come parametro un oggetto di tipo QHostInfo. Il cuore della procedura è un ciclo che va dalla riga 25 alla riga 30. Si scorrono tutti gli oggetti della collection addresses() che contiene la risoluzione dei nomi di dominio e per ciascun oggetto (di tipo QHostInfo) della collection vengono visualizzate le relative informazioni col metodo toString(). Altrimenti viene visualizzato un messaggio di errore (righe dalla 17 alla 23). Nel secondo slot, viene istanziato un oggetto di tipo QProcess (riga 35) e successivamente lanciato il ping con gli opportuni argomenti (riga 42, sostanzialmente il nome della casella testuale contenente il nome dell’host e il numero di messaggi ICMP che per comodità ho posto uguale a 3). I risultati del ping vengono memorizzati poi nella stringa result mediante il metodo readAllStandardOutput() (riga 60) e messi in una finestra (riga 63). Si fissano poi un valore di attesa (pari a 6 secondi) nel caso in cui il comando ping vada in timeout (metodo waitForstarted(), riga 44 e metodo waitForFinished(), riga 52).

Comments are closed.