Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Qt get external IP address using QNetworkReply

Qt get external IP address using QNetworkReply

Scheduled Pinned Locked Moved Unsolved General and Desktop
2 Posts 2 Posters 2.5k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • CybeXC Offline
    CybeXC Offline
    CybeX
    wrote on last edited by
    #1

    Good day

    Intro:

    My application requires getting the external IP address and matching it with an internally acquired address, thus allowing the application to proceed.

    For this, I am using a QNetworkAccessManager and QNetworkReply for this purpose.

    My code was built using this example as a reference.

    What I have tried:

    Acquiring an external IP can be done by getting a JSon object from the ipify API.

    I confirmed this by:

    curl "https://api.ipify.org?format=json"

    which in turn responds with my current IP address in the format:

    {"ip":"255.255.255.255"}

    which is a JSonObject. Using this, I created the code below.

    Problem:

    The problem is quite simple, I get no response. The post request is executed but simply no response (or finished) signal is ever triggered.

    • POST -> GET request

    I have changed the code for a get request as this solved this no response issue, found on this thread.

    I did this by specifying the whole url with query parameters in the URL:

    QNetworkRequest request(QUrl("https://api.ipify.org?format=json"));
    

    including the header content type and size (as in the example below, finally calling the QNetworkAccessManager::get() with:

    replyExternalAddress = networkManager->get(request);
    

    but this too gave no response.

    I figured that it is something small that I am missing, but I simply cannot see it.

    Advice?


    Code for querying external IP:

    // public callable method, starting network request
    void APICommunicator::requestExternalAddress(){
        qInfo(apicommunicator) << "Requesting external IP address from ipify.org";
    
        // creates network request
        // specifies "format=json"
        QUrlQuery postData;
        postData.addQueryItem("format", "json");
        QByteArray encodedQuery = postData.toString(QUrl::FullyEncoded).toUtf8();
        QNetworkRequest request(QUrl("https://api.ipify.org"));
    
        request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
        request.setHeader(QNetworkRequest::ContentLengthHeader, QString::number(encodedQuery.size()));
    
        // creates merged URL from URL and query items and sends a post:
        //    https://api.ipify.org?format=json
        replyExternalAddress = networkManager->post(request, encodedQuery);
       
        // Creates QMetaObject::Connection connection for finished signal from QNetworkReply
        conExternalAddress = QObject::connect(replyExternalAddress, SIGNAL(finished()), this, SLOT(externalAddressResponse()));
    
        // attach error listener to reply
        addErrorListener(replyExternalAddress, conExternalAddress);
    
    
    }
    
    void APICommunicator::externalAddressResponse(){
        qDebug(apicommunicator) << "External Address response recieved";
    
        // disconnect signals
        QObject::disconnect(conExternalAddress);
        QObject::disconnect(conErrorListener);
    
        // read all output from JSon object
        QByteArray ba = replyExternalAddress->readAll();
    
        // delete QNetworkReply
        replyExternalAddress->deleteLater();
    
        LogMessageHandler::writeToApiLog(QString("\n\nCALL EXTERNAL [" + replyExternalAddress->request().url().toString() + "]\n" + QString(ba)));
    
        QJsonObject doc = QJsonDocument::fromJson(ba).object();
        QString ip = doc.value("ip").toString();    
        QHostAddress address = QHostAddress();
    
        if (ip.isEmpty()) {
            qWarning(apicommunicator) << "External Address: no data received";
        }
        else {
            address = QHostAddress(version);
        }
    
        // replies with address to external slot (in main application)
        emit ExternalAddressReply(address);
    }
    
    hskoglundH 1 Reply Last reply
    0
    • CybeXC CybeX

      Good day

      Intro:

      My application requires getting the external IP address and matching it with an internally acquired address, thus allowing the application to proceed.

      For this, I am using a QNetworkAccessManager and QNetworkReply for this purpose.

      My code was built using this example as a reference.

      What I have tried:

      Acquiring an external IP can be done by getting a JSon object from the ipify API.

      I confirmed this by:

      curl "https://api.ipify.org?format=json"

      which in turn responds with my current IP address in the format:

      {"ip":"255.255.255.255"}

      which is a JSonObject. Using this, I created the code below.

      Problem:

      The problem is quite simple, I get no response. The post request is executed but simply no response (or finished) signal is ever triggered.

      • POST -> GET request

      I have changed the code for a get request as this solved this no response issue, found on this thread.

      I did this by specifying the whole url with query parameters in the URL:

      QNetworkRequest request(QUrl("https://api.ipify.org?format=json"));
      

      including the header content type and size (as in the example below, finally calling the QNetworkAccessManager::get() with:

      replyExternalAddress = networkManager->get(request);
      

      but this too gave no response.

      I figured that it is something small that I am missing, but I simply cannot see it.

      Advice?


      Code for querying external IP:

      // public callable method, starting network request
      void APICommunicator::requestExternalAddress(){
          qInfo(apicommunicator) << "Requesting external IP address from ipify.org";
      
          // creates network request
          // specifies "format=json"
          QUrlQuery postData;
          postData.addQueryItem("format", "json");
          QByteArray encodedQuery = postData.toString(QUrl::FullyEncoded).toUtf8();
          QNetworkRequest request(QUrl("https://api.ipify.org"));
      
          request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
          request.setHeader(QNetworkRequest::ContentLengthHeader, QString::number(encodedQuery.size()));
      
          // creates merged URL from URL and query items and sends a post:
          //    https://api.ipify.org?format=json
          replyExternalAddress = networkManager->post(request, encodedQuery);
         
          // Creates QMetaObject::Connection connection for finished signal from QNetworkReply
          conExternalAddress = QObject::connect(replyExternalAddress, SIGNAL(finished()), this, SLOT(externalAddressResponse()));
      
          // attach error listener to reply
          addErrorListener(replyExternalAddress, conExternalAddress);
      
      
      }
      
      void APICommunicator::externalAddressResponse(){
          qDebug(apicommunicator) << "External Address response recieved";
      
          // disconnect signals
          QObject::disconnect(conExternalAddress);
          QObject::disconnect(conErrorListener);
      
          // read all output from JSon object
          QByteArray ba = replyExternalAddress->readAll();
      
          // delete QNetworkReply
          replyExternalAddress->deleteLater();
      
          LogMessageHandler::writeToApiLog(QString("\n\nCALL EXTERNAL [" + replyExternalAddress->request().url().toString() + "]\n" + QString(ba)));
      
          QJsonObject doc = QJsonDocument::fromJson(ba).object();
          QString ip = doc.value("ip").toString();    
          QHostAddress address = QHostAddress();
      
          if (ip.isEmpty()) {
              qWarning(apicommunicator) << "External Address: no data received";
          }
          else {
              address = QHostAddress(version);
          }
      
          // replies with address to external slot (in main application)
          emit ExternalAddressReply(address);
      }
      
      hskoglundH Offline
      hskoglundH Offline
      hskoglund
      wrote on last edited by
      #2

      @CybeX Hi I made a small Qt test app, called TestExternalAddress which gave me my correct external address, you can try it:

      TestExternalAddress.pro:

      QT     += network
      TARGET  = app
      HEADERS = TestExternalAddress.h
      SOURCES = main.cpp TestExternalAddress.cpp
      

      main.cpp:

      #include <QCoreApplication>
      #include "TestExternalAddress.h"
      
      int main(int argc, char *argv[])
      {
          QCoreApplication app(argc, argv);
          TestExternalAddress test;
          return app.exec();
      }
      

      TestExternalAddress.h:

      #include <QJsonDocument>
      #include <QJsonObject>
      #include <QHostAddress>
      #include <QNetworkReply>
      
      class TestExternalAddress : public QObject
      {
          Q_OBJECT
      
      public:
          TestExternalAddress();
      
      private slots:
          void gotReply(QNetworkReply* networkReply);
      };
      

      TestExternalAddress.cpp:

      #include "TestExternalAddress.h"
      #include "qdebug.h"
      
      TestExternalAddress::TestExternalAddress()
      {
          QNetworkAccessManager* manager = new QNetworkAccessManager(this);
          connect(manager,SIGNAL(finished(QNetworkReply*)),SLOT(gotReply(QNetworkReply*)));
          manager->get(QNetworkRequest(QUrl("https://api.ipify.org?format=json")));
      }
      
      void TestExternalAddress::gotReply(QNetworkReply* networkReply)
      {
          networkReply->deleteLater();
          qDebug() <<  QHostAddress(QJsonDocument::fromJson(networkReply->readAll()).object().value("ip").toString());
      }
      

      qDebug() printed out my external ip address :-)

      1 Reply Last reply
      3

      • Login

      • Login or register to search.
      • First post
        Last post
      0
      • Categories
      • Recent
      • Tags
      • Popular
      • Users
      • Groups
      • Search
      • Get Qt Extensions
      • Unsolved