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

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

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

Автор: bigory 17.10.2010, 13:53

Всем доброе время суток!
Вот есть код, который определяет внутренний 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 17.10.2010, 14:14

а разве внутренний айпи это последний из списка всех айпи, не равный ЛокалХосту?

Автор: bigory 17.10.2010, 14:29

Скажу честно, не знаю, этот кусок взял готовый. Неправильно построена логика?

Автор: ufna 17.10.2010, 14:33

Она не то, что настроена - тут логики нет для данного сабжа :))

Я не очень понимаю что есть "внутренний айпи", но данный код его точно не находит - он же просто перебирает все возможные "не локалхост" и выводит последний из них.

Автор: bigory 17.10.2010, 14:46

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

Автор: ufna 17.10.2010, 15:47

а что выдает у юзеров других?

может у них больше, чем один интерфейс?

Автор: bigory 17.10.2010, 16:19

Написал я прогу Тест_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 17.10.2010, 17:00

Не знаю почему у друга твоего еще и МАС-адреса вывелись, но вопрос то в другом - вот у тебя пять айпи адресов, один из которых - локалхост. Вопрос - как определить, который ты надо?

Автор: BRE 17.10.2010, 17:09

Цитата(ufna @ 17.10.2010, 18:00) *
Не знаю почему у друга твоего еще и МАС-адреса вывелись...

Это не MAC-адреса, это IPv6.

Автор: bigory 17.10.2010, 17:21

Вот тут и интересно, что та программа, которая представлена в демо, кусок кода которой я написал, у меня выводит правильно, но вот у друга не то что надо, хотя он в списке тоже присутствует.
Вот с внешним IP я решил проблему через PHP скрипт, который предложили в одном из топике. Он как раз и у меня и у друга выводится правильно, не смотря на то, что в списке у друга нет этого IP.
Наверно все же есть какой-то закон по которому можно найти свой внутренний IP. Но вопрос, какой???

Автор: ufna 17.10.2010, 18:06

Цитата(BRE @ 17.10.2010, 18:09) *
Это не MAC-адреса, это IPv6.


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



bigory, а ты уверен, что нужные тебе айпи у друга IPv4, а не IPv6? И что проверяет скипт РНР? Обычно скрипты эти показывают внешний айпи.

Автор: bigory 17.10.2010, 18:14

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

Уверен, ведь в сетевых подключениях четко показывает как выглядит IP, а демо пример выводит совсем не тот.
Ну а я и написал что решил проблему с внешним IP, все верно:) Не совсем верно показан пример в демо

Автор: ufna 18.10.2010, 18:04

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


Выложи скомпилированный пример, который выводит список этих айпи.

Автор: bigory 18.10.2010, 20:13

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

Забыл написать, что исполняемый файл под виндоус. Но чтоб смогли воспользоваться линуксоиды и маковцы, есть исходник для компиляции

Автор: ufna 18.10.2010, 21:55

ну у меня айпи в списке нужный есть, в середине, т.к. сетевой адаптер вторым идет в списке всех интерфейсов. Так что вопрос остался тем же - как определить, что данный айпи - нужный "внутренний"? У меня к примеру три сетевых подключения, как вывод - который тебе нужен?

Автор: bigory 18.10.2010, 22:18

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

Автор: ufna 18.10.2010, 22:29

блин :)

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

Потому - смотри в сторону определения сетевого интерфейса, а не айпи. Алгоритм "по айпи" сделать можно легко, но см. выше.

Автор: Litkevich Yuriy 19.10.2010, 8:52

Цитата(ufna @ 19.10.2010, 1:29) *
Все три равнозначны, но для разных сетей.
может по заданной маске подсети смотреть? Но вообще вопрос правильный, если карточек несколько.

Автор: Sokoloff 21.10.2010, 11:22

На мой взгляд сама постановка вопроса не верная или не понятна. Что такое "локальный 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) Под маску могут подпасть сразу несколько адресов, комп имеет несколько сетевых карт в одну подсеть, или для для одной карточки установлено несколько адресов. Что делать, брать первый попавшийся?

Или под локальным адресом ты понимаешь http://ru.wikipedia.org/wiki/%C2%AB%D0%A1%D0%B5%D1%80%D1%8B%D0%B9%C2%BB_IP-%D0%B0%D0%B4%D1%80%D0%B5%D1%81. Тогда проверяй по их маскам, опять же возможны два исключительных случая.

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