Определение своего ip под Linux

Вопросы программирования и использования среды Lazarus.

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

Определение своего ip под Linux

Сообщение Xenar » 10.02.2013 07:24:08

Доброго времени суток.
Ну собственно вопрос в теме. Есть ли у кого рабочая функция для решения онного. Все что я нашел в сети под lin не работает. Можно конечно взять вывод ifconig и распарсить его.... но хотелость бы конечно что то более православного.
Аватара пользователя
Xenar
постоялец
 
Сообщения: 158
Зарегистрирован: 08.06.2011 12:54:07

Re: Определение своего ip под Linux

Сообщение Maxizar » 10.02.2013 18:24:27

Все что я нашел в сети под lin не работает

вот код на Си, работает как в убунту если собрать обычным гцц, так и на ARM архитектуре (я собирал тулчейном, который собрал при помощи buildroot), таких как Omap2 (AM37xx) и AT91 (AT91SAM9G20-EK)

Код: Выделить всё
/******************************************************************************
Description.:  функция get_addr_of_if  вернет IP-адрес in,
*              заданный в сетевом порядке расположения байтов для сетевого
*              интерфейса if_name.
*              для преобразования данного адреса в строковое представление
*              используйте функцию inet_ntoa().


Input Value.:  if_name  - имя сетевого интерфейса в строковом представлении
*                         например "eth0"
*              addr     - указатель на структуру адреса, в которую будет скопирован
*                         адрес сетевого интерфейса. Данный формат IP адреса необходим
*                         в таких функциях как connect


Return Value: <> 0 - Error    см комментарии.
*             == 0 - Good job
******************************************************************************/
int get_addr_of_if(const char *if_name, struct in_addr* addr)
{
   
    struct ifaddrs *ifa_head;
    struct ifaddrs *ifa_cur;
    int result;
   
   
   
    if( !if_name || !addr )
      return -1;                        //входные параметры не верны
   
   
    if( getifaddrs(&ifa_head) != 0 )
      return -2;                        //ошибка в получении списка сетевых интерфейсов
     
     
    result = -3;
    for( ifa_cur = ifa_head; ifa_cur; ifa_cur = ifa_cur->ifa_next )
    {
        if( ifa_cur->ifa_name != NULL && ifa_cur->ifa_addr != NULL )
        {
            if( strcmp(if_name, (char *)ifa_cur->ifa_name) != 0 || ifa_cur->ifa_addr->sa_family != AF_INET ) // || !(ifa_cur->ifa_flags & IFF_UP) )
              continue;
           
            memcpy(addr, &(((struct sockaddr_in *)ifa_cur->ifa_addr)->sin_addr), sizeof(struct in_addr) );
            result = 0;  //good job
            break;
        }
    }
   
    freeifaddrs(ifa_head);

   
    return (result);
}
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 231

Рейтинг@Mail.ru
cron