Всем доброе время суток!
Вот есть код, который определяет внутренний 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);
а разве внутренний айпи это последний из списка всех айпи, не равный ЛокалХосту?
Скажу честно, не знаю, этот кусок взял готовый. Неправильно построена логика?
Она не то, что настроена - тут логики нет для данного сабжа )
Я не очень понимаю что есть "внутренний айпи", но данный код его точно не находит - он же просто перебирает все возможные "не локалхост" и выводит последний из них.
Внутренний IP подразумевается постоянный IP в локальной сети. А как правиль надо было написать код? Я нре могу экспериментировать, так как у меня что неправильно, что правильно все равно выводит правильный IP, то есть я не смогу проконтролировать. Нужно пробовать в другой сети, но у меня физически такой возможности нет
а что выдает у юзеров других?
может у них больше, чем один интерфейс?
Написал я прогу Тест_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
Не знаю почему у друга твоего еще и МАС-адреса вывелись, но вопрос то в другом - вот у тебя пять айпи адресов, один из которых - локалхост. Вопрос - как определить, который ты надо?
Вот тут и интересно, что та программа, которая представлена в демо, кусок кода которой я написал, у меня выводит правильно, но вот у друга не то что надо, хотя он в списке тоже присутствует.
Вот с внешним IP я решил проблему через PHP скрипт, который предложили в одном из топике. Он как раз и у меня и у друга выводится правильно, не смотря на то, что в списке у друга нет этого IP.
Наверно все же есть какой-то закон по которому можно найти свой внутренний IP. Но вопрос, какой???
Вот ссылка на архив
http://file.qip.ru/file/V9WGC9pv/IP_Test.html ( 4.26 Mb )
Там исходник, и исполняемый файл вместе с библиотеками
Забыл написать, что исполняемый файл под виндоус. Но чтоб смогли воспользоваться линуксоиды и маковцы, есть исходник для компиляции
ну у меня айпи в списке нужный есть, в середине, т.к. сетевой адаптер вторым идет в списке всех интерфейсов. Так что вопрос остался тем же - как определить, что данный айпи - нужный "внутренний"? У меня к примеру три сетевых подключения, как вывод - который тебе нужен?
Я немного дополнил мою программку. Там я оставил список, который выводт программка и добавил ту логику, по которой ищет "нужный" внутренний IP
http://file.qip.ru/file/IGAIqsaI/IP_Test.html ( 70 Kb )
Старый исполняемый файл замените новым.
Там я хочу показать какой адресс выводит именно тот алгоритм, который представлен в примерах. Надеюсь так можно будет разработать логику, по которой можно будет искать нужный IP
блин
первое что тебе нужно сделать - определить у какого интерфейса брать айпишник. Вот к этому сводится твоя проблема. А из списка айпишников ты нужный со 100% уверенностью сказать не сможешь - у меня стоит три карточки - тебе какой айпи нужен? Все три равнозначны, но для разных сетей.
Потому - смотри в сторону определения сетевого интерфейса, а не айпи. Алгоритм "по айпи" сделать можно легко, но см. выше.
На мой взгляд сама постановка вопроса не верная или не понятна. Что такое "локальный 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)