| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [Qt] узнать свой ip |
| Автор: CompWorm 8.6.2010, 21:01 | ||
| Доброго времени! задача: вывести свой локальный и внешний IP адрес. я нашёл вот такой подход
у меня нет внешнего IP - на выходе получаю 2 неадекватных айпишника. дал прогу товарищу, у которого внешний ИП, по его словам, есть - на выходе всего один локальный ип... |
| Автор: SABROG 9.6.2010, 09:08 | ||
Судя по тому, что написано в документации:
Я могу предположить, что у Вас нет доменного имени привязанного к внешнему статическому IP адресу. Предположим, что Вы захотели поднять свой сайт, настроили Web сервер и прочее. Всё работает на локальной машине, но из интернета на него можно зайти только по IP адресу. Для этого арендуют свободное доменное имя за 20$ в год. Или пользуются бесплатными сервисами типа no-ip.com. В Вашем случае, скорее всего, QHostInfo обращается к DNS серверу провайдера где пытается найти IP адрес на имя вашего локального компьютера и находит совершенно чужие компьютеры с таким именем в интернете. Для Ваших целей должен подойти класс QNetworkInterface вместо QHostInfo. |
| Автор: CompWorm 9.6.2010, 10:56 |
| я попробовал ваш вариант. теже яйца - вид сбоку. локальный ИП показывает хоршо, внешнего нет. проблема оказалась суровей, чем я думал, а именно в том, что внешний ИП даётся провайдером, и далее сам провайдер от внешнего ИПа к моему компу прокладывает VPN... то есть на интерфейсе внешнего ИПа быть не может. как-то примерно так, но я могу ошибаться, ибо у меня внешнего вообще никогда не было я вот обратил внимание, что qutIM при передаче файлов IP отправителя пишет тоже локальный, типа 192.168.yyy.xxx - там такую же ошибку допустили авторы. самый банальный метод - закэпчить ИП с сайта, например так http://www.whatismyip.com/automation/n09230945.asp но может есть программный метод? |
| Автор: SABROG 9.6.2010, 11:14 |
Роутер провайдера это чужой компьютер с двумя интерфейсами, один из которых играет роль твоего внешнего IP, но под этим адресом может сидеть вся сетка. Есть 3 способа узнать свой внешний IP: - соединиться с внешним компьютером находящимся в интернете и попросить тебе передать адрес обратно. - купить/узнать статический адрес у провайдера (соответственно в этом случае программные средства вообще не понадобятся) - использовать dyndns и резолвить по dns имени внешний IP адрес Для пользователей программы подходит только первый способ. Это значит нужно выделать отдельный сервер для этих целей или использовать чужие, но в этом случае нет никакой гарантии, что сервер завтра не закроется. У меня например стоит роутер дома и для ноута или десктопа его внешний IP равен локальному IP адресу в локальной сети. |
| Автор: SABROG 9.6.2010, 12:21 | ||||
Вынеси следующую строчку кода в отдельный слот или метод. Или не красивый и не правильный вариант:
|
| Автор: CompWorm 9.6.2010, 12:43 | ||||||
| SABROG, кроме того что с QEventLoop не красиво, в чём может крыться опасность? в чём "неправильность?" я так понял, она запускает отдельный поток, в котором ждёт сигнала quit, а вызывающее приложение ждёт окончания вызова exec()...
не лучше ли этим?
Добавлено через 1 минуту и 40 секунд просто основная идея - оформить получение айпишников простыми функциями типа s = getIP(); и всё... |
| Автор: SABROG 9.6.2010, 13:28 |
qApp->processEvents() вернет тебе управление еще до того как в очередь событий поступит сигнал finished(), если только не обернуть его в while. Нет, все в том же потоке работает. Большое количество разнообразных запросов к разным серверам требуют разной реакции, но общей инфраструктуры для их обработки. Если требуется предоставить интерфейс класса для пользователя, то можно и через QEventLoop. |
| Автор: CompWorm 9.6.2010, 20:54 |
| спасибо + |