![]() |
|
![]() ![]() ![]() |
|
CompWorm |
|
|||
![]() Допеределыватель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1689 Регистрация: 6.12.2004 Где: / Репутация: нет Всего: 31 |
Доброго времени!
задача: вывести свой локальный и внешний IP адрес. я нашёл вот такой подход
у меня нет внешнего IP - на выходе получаю 2 неадекватных айпишника. дал прогу товарищу, у которого внешний ИП, по его словам, есть - на выходе всего один локальный ип... Это сообщение отредактировал(а) CompWorm - 8.6.2010, 21:56 |
|||
|
||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Судя по тому, что написано в документации:
Я могу предположить, что у Вас нет доменного имени привязанного к внешнему статическому IP адресу. Предположим, что Вы захотели поднять свой сайт, настроили Web сервер и прочее. Всё работает на локальной машине, но из интернета на него можно зайти только по IP адресу. Для этого арендуют свободное доменное имя за 20$ в год. Или пользуются бесплатными сервисами типа no-ip.com. В Вашем случае, скорее всего, QHostInfo обращается к DNS серверу провайдера где пытается найти IP адрес на имя вашего локального компьютера и находит совершенно чужие компьютеры с таким именем в интернете. Для Ваших целей должен подойти класс QNetworkInterface вместо QHostInfo. |
|||
|
||||
CompWorm |
|
|||
![]() Допеределыватель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1689 Регистрация: 6.12.2004 Где: / Репутация: нет Всего: 31 |
я попробовал ваш вариант. теже яйца - вид сбоку. локальный ИП показывает хоршо, внешнего нет.
проблема оказалась суровей, чем я думал, а именно в том, что внешний ИП даётся провайдером, и далее сам провайдер от внешнего ИПа к моему компу прокладывает VPN... то есть на интерфейсе внешнего ИПа быть не может. как-то примерно так, но я могу ошибаться, ибо у меня внешнего вообще никогда не было ![]() я вот обратил внимание, что qutIM при передаче файлов IP отправителя пишет тоже локальный, типа 192.168.yyy.xxx - там такую же ошибку допустили авторы. самый банальный метод - закэпчить ИП с сайта, например так http://www.whatismyip.com/automation/n09230945.asp но может есть программный метод? |
|||
|
||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Роутер провайдера это чужой компьютер с двумя интерфейсами, один из которых играет роль твоего внешнего IP, но под этим адресом может сидеть вся сетка. Есть 3 способа узнать свой внешний IP: - соединиться с внешним компьютером находящимся в интернете и попросить тебе передать адрес обратно. - купить/узнать статический адрес у провайдера (соответственно в этом случае программные средства вообще не понадобятся) - использовать dyndns и резолвить по dns имени внешний IP адрес Для пользователей программы подходит только первый способ. Это значит нужно выделать отдельный сервер для этих целей или использовать чужие, но в этом случае нет никакой гарантии, что сервер завтра не закроется. У меня например стоит роутер дома и для ноута или десктопа его внешний IP равен локальному IP адресу в локальной сети. |
|||
|
||||
CompWorm |
|
||||||
![]() Допеределыватель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1689 Регистрация: 6.12.2004 Где: / Репутация: нет Всего: 31 |
то есть так
пока сервер не упадёт или не внесёт изменения... хорошо, тогда первым кодом я вытягиваю локальный IP, а внешний тогда пробую так:
но isFinished не наступает... вариант с сигналом
работает, но мне надо IP получить сразу до выполнения следующей строчки кода. подскажить, в чём косяк. |
||||||
|
|||||||
SABROG |
|
||||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Вынеси следующую строчку кода в отдельный слот или метод. Или не красивый и не правильный вариант:
|
||||
|
|||||
CompWorm |
|
||||||
![]() Допеределыватель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1689 Регистрация: 6.12.2004 Где: / Репутация: нет Всего: 31 |
SABROG, кроме того что с QEventLoop не красиво, в чём может крыться опасность? в чём "неправильность?"
я так понял, она запускает отдельный поток, в котором ждёт сигнала quit, а вызывающее приложение ждёт окончания вызова exec()...
не лучше ли этим?
Добавлено через 1 минуту и 40 секунд просто основная идея - оформить получение айпишников простыми функциями типа s = getIP(); и всё... ![]() |
||||||
|
|||||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
qApp->processEvents() вернет тебе управление еще до того как в очередь событий поступит сигнал finished(), если только не обернуть его в while. Нет, все в том же потоке работает. Большое количество разнообразных запросов к разным серверам требуют разной реакции, но общей инфраструктуры для их обработки. Если требуется предоставить интерфейс класса для пользователя, то можно и через QEventLoop. |
|||
|
||||
CompWorm |
|
|||
![]() Допеределыватель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1689 Регистрация: 6.12.2004 Где: / Репутация: нет Всего: 31 |
спасибо +
![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |