| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Сети > Как лучше всего узнать IP машины |
| Автор: boobie 8.8.2013, 12:33 |
| Здравствуйте! Как лучше всего узнать свой внешний IP-адрес (IPv4 или IPv6)? А в случае его отсутствия - IP адрес в локальной сети. Сначала думал вытащить его из результата выполнениния команды ipconfig, но это не всегда работает, т.к. может быть несколько соединений или сетевых карт. С помощью чего и куда подключаться для получения внешнего ip (v4 и v6)? |
| Автор: Alexeis 8.8.2013, 12:38 |
| Какой бы ни был способ, адаптеров может быть много и IP адресов тоже может быть много. Есть способ получения текущего активного, на котором висит инет. Если это то что нужно, то делается через WinAPI по имени компа. У меня где-то был примерчик. Добавлено через 7 минут и 35 секунд gethostname позволяет узнать сетевое имя текущего компа. gethostbyname позволяет узнать IP адрес по имени хоста. Но IP будет последнего адаптера который установил соединение. Это вполне может быть wifi или еще что. |
| Автор: boobie 8.8.2013, 12:55 |
| Т.е. как выполнять соединение? Если это ip wi-fi, то законнектиться не получится? Alexeis Эмм... IPv4-адрес эти функции возвращают, а что делать с IPv6? Яндекс выдает мне оба адреса на запрос "my ip". IdIPWatch1.LocalIP выдает мне IPv4-адрес локальной сети. Фигня какая-то... |
| Автор: Alexeis 8.8.2013, 13:10 |
| Ну как, кабель воткнул, адаптер считает, что есть соединение. Wifi подключился к сети, считает что есть соединение. Не в смысле сокетов соединение. |
| Автор: boobie 8.8.2013, 13:14 | ||
И у каждого свой ИП-адрес? И как тогда пользоваться, например, Инди-компонентами? Какой клиенту ИП передавать? |
| Автор: Alexeis 8.8.2013, 13:37 |
| Если адаптеры не включены в мост, то у них разные IP . Т.е. почти всегда разные. Как работать зависит от ситуации. Если нужно с инетом работать, то через gethostbyname будет нужный IPшник, тот через который получают инет. А так по разному может быть. Как иначе выбрать нужную сеть если не по IPшнику адаптера? |
| Автор: boobie 8.8.2013, 15:16 |
| А если пользователь с роутером "создает" сервер, дает мне свой АйПи, полученный с помощью gethostbyname, то я не смогу к нему подключится по данному АйПи... Как подключаться в таком случае? |
| Автор: Alexeis 8.8.2013, 15:55 |
| За роутером траблы. Чтобы работал сервер за роутером нужно делать перенаправление портов на роутере. Насколько я знаю, самое правильное решение для конекта таких пользователей это установка соединения через промежуточный сервер. Например установить VPN типа Hamachi . Вообще, в настоящее время как-то научились обходить роутеры (я имею ввиду pnp сети типа торрентов) . Насколько я знаю, используется технология UPnP автоматического перенаправления портов. Можно почитать например тут http://www.codeproject.com/Articles/27346/Programming-control-point-application-using-the-UP . |
| Автор: Illusion Dolphin 8.8.2013, 18:50 |
| Чтобы узнать "внейший" айпи единственный версый спобоб это: 1) Сделать простенький сайт который отвечает на GET строкой с IP юзера 2) Разместить его в интернете 3) Из программы запросить сайт 4) Профит Всё остальное в какой-либо ситуации будет не работать. Добавлено через 1 минуту и 52 секунды Но работать будет только если есть соединение с "внешним миром", само сабой разумеется, т.к. иначе у вас может и не быть "внешнего" адреса. |
| Автор: Alexeis 8.8.2013, 20:08 |
| Illusion Dolphin, я так понимаю внешний IP не самоцель, он нужен для того чтобы запустить сервер на машине, вот только если машина за рутером, то внешний IP никак не поможет. |
| Автор: Illusion Dolphin 8.8.2013, 21:40 | ||
Чтобы запустить сервер он как раз таки не нужен А дальше вопрос соединения 2х машин. Тут есть много вариантов. Обычно нормальный сервер доступен "извне", что означает, что если внешний пользователь запросит какой-то арес и порт то в конечном итоге запрос дойдёт до сервера. На этом пути могут стоять маршрутизаторы, NAT и прочие сетевые устройства, даже ADSL. Но всё это проблемы серверной части, клиент просто соединяется и всё. В вашем случае не понятно, что за сервер, какая конфигурация сети и кто такой пользователь и что он имеет. Если уточните - будет можно давать советы, а так как-то слишком пусто. |
| Автор: boobie 9.8.2013, 08:33 | ||||
| Ну я разбираюсь с Инди-библиотекой... Простенький чат, например. Предположим, у меня есть Айпи моего друга, я пытаюсь отправить ему сообщение. Но у него стоит роутер. Дойдет ли до него мое сообщение? Вот, максимально упрощенный код: 2 Memo, 1 Button, при нажатии на кнопку отправляется содержимое Memo1. Коннект происходит при создании формы. IP вводится в idTCPClient1.Host перед компиляцией:
Тут как бы неважна конкретная задача. Я пихаю IP в idTCPClient1.Host и Инди делает все за меня. Вопрос в том, какой Ip туда пихать. И как в таком случае настраивать серверную часть, чтобы не смотря на
клиент подключился? |
| Автор: Illusion Dolphin 9.8.2013, 09:16 | ||
Роутер - это слишком обще |
| Автор: boobie 9.8.2013, 13:19 | ||
| Эмм... Несколько усложненная версия чата (с вводом ИП) с таким же принципом работает криво. Друг сообщает мне свой IP (результат запроса "my ip" в яндексе), я - свой. У него есть роутер, он зашел в инет с ноута (по ВиФи). У меня роутера нет, мой Ip - реальный (т.е. меня по этому ip можно просечь, хакнуть и т.д.) адрес машины в сети. Ко мне он коннектится нормально, сообщения от него доходят, а я не могу законнектится к нему. Насколько я понимаю, он сообщает мне адрес своего роутера, т.е. его выдает поисковик. А роутер затем уже перенаправляет на подключенное устройство. Что делать в этом случае? ---------------------------------------------------- Порты проверять? idtcpserver.defaultport=7000, сервер прослушивает порт 7000, idtcpclient.port = 7000, клиент отправляет строки на порт 7000. Если у него 7000 порт закрыт, то смог бы он мне отправить строку? ----------------------------------------------------
И как это реализовывать? ---------------------------------------------------- ipconfig выдает у него только адрес в локальной сети. Тему надо назвать "как настроить idtcpserver, если у вас стоит роутер\прокси\и пр." |
| Автор: boobie 9.8.2013, 13:55 | ||
Почему тогда не коннектится? |
| Автор: Alexeis 9.8.2013, 14:09 |
| Нужно проверять последовательно в чем проблема. Сначала зарядить сервер, потом проверить открыт ли порт. Например сервисом http://portforward.com/help/portcheck.htm Если нет, то нужно проверить тот ли порт перенаправлен который биндиться или нет. И проверить еще фаервол. Там либо исключение нужно делать или отключать. Если проверка показывает что порт открыт, то значит проблема на стороне клиента. |