![]() |
Модераторы: xvr |
![]() ![]() ![]() |
|
iNfantry |
|
|||
Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 17.9.2006 Репутация: нет Всего: нет |
Подскажите пожалуйста как можно узнать свой external ip при подключении к интернету без использования каких-либо встроенных/установленных команд/программ системы, тоесть "своими руками". Вариант чтобы обратиться на какуюто страницу в сети, которая выдаст ип или послать dns-запрос тоже не очень интересен.. Как это сделать непосредственно? Например в вин32 кажется есть апи-функция которая возвращает сетевую информацию, а есть ли в *nix подобные средства или системные вызовы?
|
|||
|
||||
GrayCardinal |
|
|||
Фигасе ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 8 Всего: 58 |
iNfantry,
На страницу не обязательно. Можно просто сделать исходящий connect () куда-нибудь (без разницы, хоть на msn.com), затем на сокет : getsockname(2) (вернет адрес интерфейса с которого производился коннект). Добавлено @ 09:24 Сетевую информацию - можжно тупо распарсить вывод команды /sbin/ifconfig он вообще из /proc/ берет инфу, откуда точно правда не знаю Это сообщение отредактировал(а) GrayCardinal - 25.9.2006, 09:25 |
|||
|
||||
iNfantry |
|
|||
Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 17.9.2006 Репутация: нет Всего: нет |
GrayCardinal, а не подскажешь по подробнее про getsockname() что она возвращает - дворд с ип адресом отправителя?
|
|||
|
||||
GrayCardinal |
|
|||
Фигасе ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 8 Всего: 58 |
Т.е. первый аргумент - дескриптор, второй - адрес (для IPv4 - на структура типа sockaddr_in (куда адрес уйдет)), второй - размер адреса (*address_len = 4) Добавлено @ 11:31 Если все нормально - возвращает ноль. Ну, это нормально :-) Добавлено @ 11:32 в sockaddr_in.s_addr если память не изменяет - DWORD с адресом. Это сообщение отредактировал(а) GrayCardinal - 25.9.2006, 11:31 |
|||
|
||||
iNfantry |
|
|||
Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 17.9.2006 Репутация: нет Всего: нет |
Всё, спасибо, в мануале нашел.
Опросить присвоенный локальный адрес (его иногда называют именем сокета) можно с помощью функции getsockname(): она помещает его в структуру sockaddr, на которую указывает аргумент address, а длину адреса записывает по указателю address_len.
|
|||
|
||||
GrayCardinal |
|
|||
Фигасе ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 8 Всего: 58 |
Всегда пожалуйста :-)
|
|||
|
||||
iNfantry |
|
|||
Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 17.9.2006 Репутация: нет Всего: нет |
Хех, почти одновременно
![]() |
|||
|
||||
dmiceman |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 9.9.2006 Репутация: нет Всего: нет |
я дико извиняюсь, но тут есть одна мааленькая тонкость.
адрес это штука привязанная не к компьютеру, а к интерфейсу. а интерфейс -- это сетевуха или модем или ppp или vpn или фиг знает что еще. из этого следует что адресов у компьютера может быть много. что бы не быть голословным скажу что на моем кпомпе их сейчас пять штук. вот поэтому алгоритм тут должен быть такой -- читать таблицу интерфейсов и извлекать их адреса. делается это посредством getifaddrs() man-а на которую кстати нет, так что смотреть /usr/include/ifaddrs.h отдельная тема -- это роутинг, поскольку только один интерфейс является дефолтным, адрес которого и можно, с натяжкой, назвать адресом компьютера. вот тут проще действительно /proc/net/route читать, потому как все равно более другой путь -- это ioctl()-ы. |
|||
|
||||
sOckets |
|
|||
![]() ЖгуПоПонедельникам ![]() ![]() Профиль Группа: Участник Сообщений: 298 Регистрация: 24.8.2006 Где: ws2.lib Репутация: нет Всего: 2 |
Ты получишь только локальные данные , а если тебе нужен твой действительно внешний IP , например конечный шлюз провайдера , то ты должен (имхо) узнавать в интернете , повесить где нибуть скрипт PHP который выдаёт твой IP (http://myip.ru) и просто каждый раз когда надо коннектиться и брать оттуда IP , а сокеты вам не помогут узнать какой IP у шлюза прова %)
Если конечно тебе это надо ![]() -------------------- Я Будущий сотрудник Google Inc. Юзаем Google Code Search для поиска исходников. Юзаем GMail как почту. |
|||
|
||||
GrayCardinal |
|
|||
Фигасе ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 8 Всего: 58 |
dmiceman,
ИМХО. человеку надо было узнать адрес с которого он будет производить подключение. Он его узнал. Зачем ему адреса интерфейсов, которые могут быть даже не подключены ? |
|||
|
||||
dmiceman |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 9.9.2006 Репутация: нет Всего: нет |
мой ip сейчас 80.81.208.66, но это совсем не мой ip :-) нет у меня такого интерфейса ибо сижу за маскарадом. то есть тут вопрос -- нужен ли ip дефолтного интерфейса или нужен ip видный снаружи. если второе -- то да, надо смотреть чем-то внешним. если ip дефолтного интерфейса -- действовать по моему плану -- найти дефолтный роутинг, выдрать его интерфейс и найти адрес этого интерфейса. |
|||
|
||||
GrayCardinal |
|
|||
Фигасе ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 8 Всего: 58 |
Угу. А еще уточнить - ГДЕ видный ![]() ЗЫ галку уже поставили, однако, тему ЗАКРЫЛИ ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С/С++: Программирование под Unix/Linux" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |