Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> свой ip, платформонезависимо 
:(
    Опции темы
cupper
Дата 21.3.2011, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: нет
Всего: 1



Мне нужно получить свой ip. Делаю вот так
Код

char host_name[1024];
            std::string host;
            struct hostent *he;
            if(!gethostname(host_name, 1024))
            {
                if(he = gethostbyname(host_name))
                    host = inet_ntoa(*((in_addr*)he->h_addr_list[0]));
            }

под виндой все гуд. Под линем выдает мне 127.0.0.2. Хотя интерфейса с таким ip там вообще нет. Вариант с тем что бы перебирать все h_addr_list[i] неканает т.к. откуда мне знать какой из них выбрать.
Я в общем юзаю boost::asio и делаю мультикастовую рассылку. Это все обернуто сверху еще одним классом, но до boost::asio::ip::udp::socket я добраться могу. Мне вот нужно именно ip вот этого самого сокета получить, т.е. с которого непосредственно идет рассылка. Но в документации да и методом тыка я так и не смог вытащить от тудова эти данные.

Есть еще какой способ под линь ?
PM MAIL   Вверх
maint
Дата 21.3.2011, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 12.5.2008

Репутация: нет
Всего: 2



Код

h_addr_list[0]

Это один адрес, первый в списке. Надо перебрать все. Для сведения, комп может иметь много ip адресов, отсюда и список. На что и указывает имя переменной

Это сообщение отредактировал(а) maint - 21.3.2011, 17:23
PM   Вверх
cupper
Дата 21.3.2011, 17:24 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: нет
Всего: 1



Цитата(maint @ 21.3.2011,  17:22)
Код

h_addr_list[0]

Это один адрес, первый в списке. Надо перебрать все. Для сведения, комп может иметь много ip адресов, отсюда и список. На что и указывает имя переменной

Цитата

Вариант с тем что бы перебирать все h_addr_list[i] неканает т.к. откуда мне знать какой из них выбрать.


как глупая программа узнает какой же ей ip выбрать из этого списка ?

Добавлено через 12 минут и 53 секунды
судя по многим десяткам облазанных форумов и наших и забугорных сего способа нет кроме как получать список все ip
Есть способ
Код

            int fd;
            struct ifreq ifr;

            fd = socket(AF_INET, SOCK_DGRAM, 0);
            ifr.ifr_addr.sa_family = AF_INET;
            snprintf(ifr.ifr_name, IFNAMSIZ, "eth0");
            ioctl(fd, SIOCGIFADDR, &ifr);
 
            std::string ip(inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr));
            close(fd);

но тоже не катит, так как здесь можно/нужно указать адрес какого интерфейса получить, опять таки перебирать, опять таки как узнать какой ip выбрать :(

Это сообщение отредактировал(а) cupper - 21.3.2011, 17:24
PM MAIL   Вверх
cupper
Дата 21.3.2011, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: нет
Всего: 1



в теории можно пойти в лоб. т.е. в данные момент я при отправке данных записываю ip отправителя как данное. Можно же попробывать извлекать ip непосредственно на получателе из полученного пакета. Вопрос в том есть ли в asio средства для этого... переходить с asio это... не это не катит.
PM MAIL   Вверх
maint
Дата 21.3.2011, 18:50 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 12.5.2008

Репутация: нет
Всего: 2



не правилен сам подход. Надо свыкнуться с мыслью, что у компа более чем один ip. И все станет на свои места. Можно отбрасывать 127.0.0.X адреса, что бы уменьшить список. 127 и.д это loopback адреса. Они будут, даже если не будет сетевой
PM   Вверх
cupper
Дата 22.3.2011, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: нет
Всего: 1



Цитата(maint @ 21.3.2011,  18:50)
не правилен сам подход. Надо свыкнуться с мыслью, что у компа более чем один ip. И все станет на свои места. Можно отбрасывать 127.0.0.X адреса, что бы уменьшить список. 127 и.д это loopback адреса. Они будут, даже если не будет сетевой

уху, и пакет при отправке уходит сразу со всех ip во все подсети ? Яж говорю мне нужен ip с которого был отправлен пакет, согласен на отправителе это получить... кхм... очень сложно (как пример нужно обрабатывать ip куда отправляем с таблицами маршрутизации... что бы узнать в какую сеть и с какого интерфейса, но это абсурд). 

А вот на получателе уже куда более реально получить именно тот ip с которого был отправлен пакет, и не важно какой это пакет. Да я понимаю что если отправитель находится на каким либо шлюзом, проксей и прочем то ip будет уже внешний. Меня это устраивает. 
Вопрос теперь в том как сей ip вытащить средствами asio.
PM MAIL   Вверх
cupper
Дата 22.3.2011, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: нет
Всего: 1



Код

boost::asio::ip::udp::endpoint sender_endpoint;
boost::uint32_t len = socket_.receive_from(boost::asio::buffer(raw_buffer.get_buffer(), raw_buffer.get_size()), sender_endpoint);
address = sender_endpoint.address().to_v4().to_string();


мать его :(
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0470 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.