Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Ввод/Вывод, Сеть. Межпроцессное взаимодействие _ Как получить свой внешний IP-адрес?

Автор: Rocky 19.11.2009, 18:52

Всем привет! Как это можно сделать? Я могу только получить ip, заданный для локальной сети... А как получить свой реальный интернетный ip?

Спасибо!

Автор: dim_san 19.11.2009, 19:24

QNetworkInterface::allAddresses();

Автор: Rocky 19.11.2009, 19:27

неа, возвращает внутренний локальный - 192.168.0.2 (ну и loopback)... а нужно получить динамический адрес, который присваивается провайдером, при выходе в инет ((

Автор: dim_san 19.11.2009, 19:34

а как подключение то организовано?

Автор: Rocky 19.11.2009, 19:47

есть мой комп, он подключен через комуникатор к роутеру который в свою очередь смотрит на свич провайдера, т.е. в интеренет по сути... Т.е. грубо говоря есть роутер, который скрывает небольшую локальную сеть...

Я пока только тестами занимаюсь.. Просто хочу в программу (по работе) встроить модуль, который бы слал мне на почту ip-адрес машины, с которой запущен... Нужно не для хака, а чтобы удаленно просматривать логи программы...

Автор: DmP 19.11.2009, 20:05

Rocky, нужно что бы кто то из вне сказал какой IP. Типа сделать запрос на какой сайт, он и скажет какой у вас IP. Пример сайта - 2ip.ru.

Автор: Rocky 19.11.2009, 20:12

ахха, спасибо как раз на нем сейчас сижу )))

Вообще думаю средствами QT никак не узнать... да и QT тут вообще не причем... Осталось разобраться можно ли с сайтом типа 2ip общаться как бы в командной строке, т.е. чтобы пользователь ничего не видел... пойду искать куда сунул книгу по php, может там что нарою... :)

Автор: Rocky 19.11.2009, 20:42

О! Я уже сделал чтобы программа посылала письмо на ящик... щас посмотрел шапку письма, и там содержится тот самый адрес, с которого это письмо было отпралено:

Цитата
Received: from localhost (unknown [85.249.76.72]) (Authenticated sender:.....

Осталось разобраться какой запрос нужно послать почтовому серверу, чтобы он ответил какой у меня адрес. ))

Автор: grio 19.11.2009, 20:52

Цитата(Rocky @ 19.11.2009, 20:42) *
О! Я уже сделал чтобы программа посылала письмо на ящик... щас посмотрел шапку письма, и там содержится тот самый адрес, с которого это письмо было отпралено:
Цитата
Received: from localhost (unknown [85.249.76.72]) (Authenticated sender:.....

Осталось разобраться какой запрос нужно послать почтовому серверу, чтобы он ответил какой у меня адрес. ))


просто запроси через QHttp мой php-скрипт: http://www.grio.ru/myip.php


Автор: Rocky 19.11.2009, 21:24

Хм.... что не так делаю, не получается ((

{
...
    m_pHttp = new QHttp();
    QDialog::connect(m_pHttp, SIGNAL(done(bool)), this, SLOT(OnReadyRead()));
    m_pHttp->setHost("www.grio.ru");
    m_pHttp->get(QUrl::toPercentEncoding("/myip.php"));
...
}

void CDifferentSettingsDialog::OnReadyRead()
{
    QMessageBox::information(this, m_pMessage->GetMessage(eHeader), m_pHttp->readAll());
}

QMessageBox выдает сообщение: "ошибка 404 и т.д." :(

Автор: grio 19.11.2009, 21:40

Цитата
QUrl("www.grio.ru/myip.php").host();
QUrl("www.grio.ru/myip.php").path();

ну как то так...

Автор: Rocky 19.11.2009, 21:41

гыыы
Есть. Надо так:

m_pHttp->get("/myip.php");

Всем спасибо ))
Терь осталось на сайт фирмы написать такой вот скриптик и все :)

Автор: Litkevich Yuriy 19.11.2009, 21:51

Цитата(Rocky @ 20.11.2009, 0:41) *
Терь осталось на сайт фирмы написать такой вот скриптик и все
а может у IANA есть стандартный сервис?

наподобие http://example.com/

Автор: Rocky 19.11.2009, 22:08

Посмотрю, спасибо. Щас попробую еще таким же образом с 2ip.ru вытянуть инфу... Интересно :)

Автор: Rocky 19.11.2009, 22:43

Вобщем, если кому нужно будет:

CDifferentSettingsDialog::CDifferentSettingsDialog(...)
{
...
    m_pHttp = new QHttp();
    QDialog::connect(m_pHttp, SIGNAL(done(bool)), this, SLOT(OnReadyRead()));
    m_pHttp->setHost("2ip.ru");
    m_pHttp->get("/index.php");
...
}
void CDifferentSettingsDialog::OnReadyRead()
{
    m_sCurrentDynIP = "";

    const QString sText = m_pHttp->readAll();
    const QRegExp oRegExp("((1{0,1}[0-9]{0,2}|2[0-4]{1,1}[0-9]{1,1}|25[0-5]{1,1})\\.){3,3}(1{0,1}[0-9]{0,2}|2[0-4]{1,1}[0-9]{1,1}|25[0-5]{1,1})");
    
    const int n = sText.indexOf(oRegExp);
    if (n == -1) return;

    m_sCurrentDynIP = sText.mid(n, 15);        //255.255.255.255
    const int nLength = m_sCurrentDynIP.length();
    for (int i = 0; i < nLength; ++i)
    {
        const QChar sSymbol = m_sCurrentDynIP.at(i);
        if (sSymbol.isDigit() || sSymbol == '.') continue;
        m_sCurrentDynIP.replace(i, 1, " ");
    }

    m_sCurrentDynIP = m_sCurrentDynIP.trimmed();
}

Автор: bigory 16.10.2010, 19:59

m_sCurrentDynIP что за переменная?
Как мне ее передать в Label?

Автор: Алексей1153 16.10.2010, 20:08

bigory, строка, скорее всего (QString)

Автор: kwisp 18.10.2010, 9:53

Rocky,
мне вот этот кусок не понятен ((

Цитата(Rocky @ 19.11.2009, 23:43) *
m_sCurrentDynIP = sText.mid(n, 15);        //255.255.255.255     
const int nLength = m_sCurrentDynIP.length();    
for (int i = 0; i < nLength; ++i)    
{        
const QChar sSymbol = m_sCurrentDynIP.at(i);        
if (sSymbol.isDigit() || sSymbol == '.') continue;        
m_sCurrentDynIP.replace(i, 1, " ");    
}    
m_sCurrentDynIP = m_sCurrentDynIP.trimmed();


m_sCurrentDynIP = sText.mid(n, 15);        //255.255.255.255     
const int nLength = m_sCurrentDynIP.length();

разве тут не очевидно, что nLength == 15 ?

назначение цикла вообще не пойму.

П.С.
ну и oRegExp не уж то по короче сделать никак?

Автор: Sokoloff 21.10.2010, 14:33

Цитата(Rocky @ 19.11.2009, 20:47) *
есть мой комп, он подключен через комуникатор к роутеру который в свою очередь смотрит на свич провайдера, т.е. в интеренет по сути... Т.е. грубо говоря есть роутер, который скрывает небольшую локальную сеть...

Я пока только тестами занимаюсь.. Просто хочу в программу (по работе) встроить модуль, который бы слал мне на почту ip-адрес машины, с которой запущен... Нужно не для хака, а чтобы удаленно просматривать логи программы...

Может тебе нужен http://ru.wikipedia.org/wiki/DynDNS или его аналоги?
А как планируешь проскочить через NAT, порты пробросишь?

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)