Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Внутренний IP
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Ввод/Вывод, Сеть. Межпроцессное взаимодействие
bigory
Всем доброе время суток!
Вот есть код, который определяет внутренний IP:

    QString ipAddress;
    QList<QHostAddress> ipAddressesList = QNetworkInterface::allAddresses();
    for (int i = 0; i < ipAddressesList.size(); ++i) {
        if (ipAddressesList.at(i) != QHostAddress::LocalHost &&
            ipAddressesList.at(i).toIPv4Address()) {
            ipAddress = ipAddressesList.at(i).toString();
            break;
        }
    }
    ui->label_2->setText(ipAddress);


Проблема в том, что не везде он определяет его правильно. У меня Win XP SP3, оператор Стрим. У меня определяет правильно, а вот посылаю на тест другим людям, у которых другой оператор, другие версии виндоуса, так они говорят что у них внутренний IP определяется неправильно. Есть ли другой способ определить внутренний IP? Очень желательно, чтоб он определялся правильно.
ufna
а разве внутренний айпи это последний из списка всех айпи, не равный ЛокалХосту?
bigory
Скажу честно, не знаю, этот кусок взял готовый. Неправильно построена логика?
ufna
Она не то, что настроена - тут логики нет для данного сабжа :))

Я не очень понимаю что есть "внутренний айпи", но данный код его точно не находит - он же просто перебирает все возможные "не локалхост" и выводит последний из них.
bigory
Внутренний IP подразумевается постоянный IP в локальной сети. А как правиль надо было написать код? Я нре могу экспериментировать, так как у меня что неправильно, что правильно все равно выводит правильный IP, то есть я не смогу проконтролировать. Нужно пробовать в другой сети, но у меня физически такой возможности нет
ufna
а что выдает у юзеров других?

может у них больше, чем один интерфейс?
bigory
Написал я прогу Тест_IP

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtGui>
#include <QtNetwork>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QString ipAddress;
    QList<QHostAddress> ipAddressesList = QNetworkInterface::allAddresses();
    for (int i = 0; i < ipAddressesList.size(); ++i){
            ipAddress = ipAddressesList.at(i).toString();
            ui->textBrowser->append(ipAddress);
        }
}


MainWindow::~MainWindow()
{
    delete ui;
}


И вот что выводит:
Мой            Друга
192.168.1.5    FE80:0:0:0:A058:B12B:6661:ABB1
91.76.134.250    169.254.171.177
192.168.77.1    FE80:0:0:0:74D3019:B3C7:590F
192.168.38.1    192.168.0.199
127.0.0.1        0:0:0:0:0:0:0:1
                127.0.0.1
                FE80:0:0:0:0:5EFE:C0A8:C7
                2001:0:5EF5:79FD:3084:135:A81B:967C
                FE80:0:0:0:3084:135:A81B:967C


Самое интересное это то, что у меня отобразился и внутренний и внешний, у друга внутренний, и то по номеру строки не совпадает с моей
ufna
Не знаю почему у друга твоего еще и МАС-адреса вывелись, но вопрос то в другом - вот у тебя пять айпи адресов, один из которых - локалхост. Вопрос - как определить, который ты надо?
BRE
Цитата(ufna @ 17.10.2010, 18:00) *
Не знаю почему у друга твоего еще и МАС-адреса вывелись...

Это не MAC-адреса, это IPv6.
bigory
Вот тут и интересно, что та программа, которая представлена в демо, кусок кода которой я написал, у меня выводит правильно, но вот у друга не то что надо, хотя он в списке тоже присутствует.
Вот с внешним IP я решил проблему через PHP скрипт, который предложили в одном из топике. Он как раз и у меня и у друга выводится правильно, не смотря на то, что в списке у друга нет этого IP.
Наверно все же есть какой-то закон по которому можно найти свой внутренний IP. Но вопрос, какой???
ufna
Цитата(BRE @ 17.10.2010, 18:09) *
Это не MAC-адреса, это IPv6.


точно, протупил :)



bigory, а ты уверен, что нужные тебе айпи у друга IPv4, а не IPv6? И что проверяет скипт РНР? Обычно скрипты эти показывают внешний айпи.
bigory
Цитата(ufna @ 17.10.2010, 19:06) *
а ты уверен, что нужные тебе айпи у друга IPv4, а не IPv6? И что проверяет скипт РНР? Обычно скрипты эти показывают внешний айпи

Уверен, ведь в сетевых подключениях четко показывает как выглядит IP, а демо пример выводит совсем не тот.
Ну а я и написал что решил проблему с внешним IP, все верно:) Не совсем верно показан пример в демо
ufna
Цитата(bigory @ 17.10.2010, 19:14) *
Уверен, ведь в сетевых подключениях четко показывает как выглядит IP, а демо пример выводит совсем не тот.
Ну а я и написал что решил проблему с внешним IP, все верно:) Не совсем верно показан пример в демо


Выложи скомпилированный пример, который выводит список этих айпи.
bigory
Вот ссылка на архив
http://file.qip.ru/file/V9WGC9pv/IP_Test.html ( 4.26 Mb )
Там исходник, и исполняемый файл вместе с библиотеками

Забыл написать, что исполняемый файл под виндоус. Но чтоб смогли воспользоваться линуксоиды и маковцы, есть исходник для компиляции
ufna
ну у меня айпи в списке нужный есть, в середине, т.к. сетевой адаптер вторым идет в списке всех интерфейсов. Так что вопрос остался тем же - как определить, что данный айпи - нужный "внутренний"? У меня к примеру три сетевых подключения, как вывод - который тебе нужен?
bigory
Я немного дополнил мою программку. Там я оставил список, который выводт программка и добавил ту логику, по которой ищет "нужный" внутренний IP
http://file.qip.ru/file/IGAIqsaI/IP_Test.html ( 70 Kb )
Старый исполняемый файл замените новым.
Там я хочу показать какой адресс выводит именно тот алгоритм, который представлен в примерах. Надеюсь так можно будет разработать логику, по которой можно будет искать нужный IP
ufna
блин :)

первое что тебе нужно сделать - определить у какого интерфейса брать айпишник. Вот к этому сводится твоя проблема. А из списка айпишников ты нужный со 100% уверенностью сказать не сможешь - у меня стоит три карточки - тебе какой айпи нужен? Все три равнозначны, но для разных сетей.

Потому - смотри в сторону определения сетевого интерфейса, а не айпи. Алгоритм "по айпи" сделать можно легко, но см. выше.
Litkevich Yuriy
Цитата(ufna @ 19.10.2010, 1:29) *
Все три равнозначны, но для разных сетей.
может по заданной маске подсети смотреть? Но вообще вопрос правильный, если карточек несколько.
Sokoloff
На мой взгляд сама постановка вопроса не верная или не понятна. Что такое "локальный IP", локальный относительно чего? Если не смотрящий в инет, то у машины может быть таких интерфейсов/адресов несколько.
Поясни для чего это нужно? Если чтоб отправить адрес на какой-то сервер, чтоб потом он смог связаться с клиентом, то нужно искать адрес из той же подсети что и адрес сервера. Например:

Сервер имеет IP 192.168.77.10 и маску 255.255.255.0

Клиент имеет следующие IP
192.168.1.5
91.76.134.250
192.168.77.1
192.168.38.1
127.0.0.1

Перебираем все эти адреса и сравниваем с адресом сервера с учетом маски, в данном случае подойдет только 192.168.77.1 . Надо продумать что делать в исключительных вариантах:
1) Может оказаться что ни один адрес не подошел под маску, т.е. нет прямого маршрута от сервера к клиенту. Что делать?
2) Под маску могут подпасть сразу несколько адресов, комп имеет несколько сетевых карт в одну подсеть, или для для одной карточки установлено несколько адресов. Что делать, брать первый попавшийся?

Или под локальным адресом ты понимаешь серые адреса. Тогда проверяй по их маскам, опять же возможны два исключительных случая.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2021 IPS, Inc.