URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 5623
[ Назад ]

Исходное сообщение
"как определить свой IP адрес"

Отправлено kvk , 08-Авг-06 18:26 
Есть ли функция в Си для определения собственного ip адреса (или списка всех адресов)?
gethostbyname требует указывать hostname (напр. localhost - 127.0.0.1), а не хотелось бы привязываться к названиям...

Содержание

Сообщения в этом обсуждении
"как определить свой IP адрес"
Отправлено Vladislav Perlin , 08-Авг-06 18:28 
>Есть ли функция в Си для определения собственного ip адреса (или списка
>всех адресов)?
>gethostbyname требует указывать hostname (напр. localhost - 127.0.0.1), а не хотелось бы
>привязываться к названиям...

А если подложить ей localhost?

Конечно, это не слишком красиво, но ведь localhost --- стандартное имя, так что проблем в привязкой к нему быть не должно, ИМХО.


"как определить свой IP адрес"
Отправлено vic , 08-Авг-06 18:41 
>>Есть ли функция в Си для определения собственного ip адреса (или списка
>>всех адресов)?
>>gethostbyname требует указывать hostname (напр. localhost - 127.0.0.1), а не хотелось бы
>>привязываться к названиям...
>
>А если подложить ей localhost?
>
>Конечно, это не слишком красиво, но ведь localhost --- стандартное имя, так
>что проблем в привязкой к нему быть не должно, ИМХО.

gethostbyname() вернет 127.0.0.1 для localhost :)

А вообще уже обсуждалось например тут
http://www.opennet.me/openforum/vsluhforumID9/5500.html


"как определить свой IP адрес"
Отправлено konst , 08-Авг-06 18:49 
>>>Есть ли функция в Си для определения собственного ip адреса (или списка
>>>всех адресов)?
>>>gethostbyname требует указывать hostname (напр. localhost - 127.0.0.1), а не хотелось бы
>>>привязываться к названиям...
>>
>>А если подложить ей localhost?
>>
>>Конечно, это не слишком красиво, но ведь localhost --- стандартное имя, так
>>что проблем в привязкой к нему быть не должно, ИМХО.
>
>gethostbyname() вернет 127.0.0.1 для localhost :)
>
>А вообще уже обсуждалось например тут
>http://www.opennet.me/openforum/vsluhforumID9/5500.html


огромное спасибо!


"как определить свой IP адрес"
Отправлено konst , 08-Авг-06 18:43 
>>Есть ли функция в Си для определения собственного ip адреса (или списка
>>всех адресов)?
>>gethostbyname требует указывать hostname (напр. localhost - 127.0.0.1), а не хотелось бы
>>привязываться к названиям...
>
>А если подложить ей localhost?
>
>Конечно, это не слишком красиво, но ведь localhost --- стандартное имя, так
>что проблем в привязкой к нему быть не должно, ИМХО.

только разве на localhost не получу я 127.0.0.1 ?


"как определить свой IP адрес"
Отправлено vic , 09-Авг-06 11:42 
>>>Есть ли функция в Си для определения собственного ip адреса (или списка
>>>всех адресов)?
>>>gethostbyname требует указывать hostname (напр. localhost - 127.0.0.1), а не хотелось бы
>>>привязываться к названиям...
>>
>>А если подложить ей localhost?
>>
>>Конечно, это не слишком красиво, но ведь localhost --- стандартное имя, так
>>что проблем в привязкой к нему быть не должно, ИМХО.
>
>только разве на localhost не получу я 127.0.0.1 ?

чуть выше я написал:
gethostbyname() вернет 127.0.0.1 для localhost :)


"как определить свой IP адрес"
Отправлено ufobject , 10-Авг-06 17:04 
>>>>Ес
ть ли функция в Си для определения собственного ip адреса (или списка
>>>>всех адресов)?
>>>>gethostbyname требует указывать hostname (напр. localhost - 127.0.0.1), а не хотелось бы
>>>>привязываться к названиям...
>>>
>>>А если подложить ей localhost?
>>>
>>>Конечно, это не слишком красиво, но ведь localhost --- стандартное имя, так
>>>что проблем в привязкой к нему быть не должно, ИМХО.
>>
>>только разве на localhost не получу я 127.0.0.1 ?
>
>чуть выше я написал:
>gethostbyname() вернет 127.0.0.1 для localhost :)

Вот тебе функция. Будет возвращать твой IP в читабельном виде Ж)

char *_getmyip()
{
    struct ifreq ifr;
    memset(&ifr, 0, sizeof(ifr));
    strcpy(ifr.ifr_name, "eth0");
    
    int s = socket(AF_INET, SOCK_DGRAM, 0);
    ioctl(s, SIOCGIFADDR, &ifr);
    close(s);
    
    struct sockaddr_in *sa = (struct sockaddr_in*)&ifr.ifr_addr;
    
    return inet_ntoa(sa->sin_addr);    
}


"как определить свой IP адрес"
Отправлено vic , 10-Авг-06 18:42 
>>>>>Ес
>ть ли функция в Си для определения собственного ip адреса (или списка
>
>>>>>всех адресов)?
>>>>>gethostbyname требует указывать hostname (напр. localhost - 127.0.0.1), а не хотелось бы
>>>>>привязываться к названиям...
>>>>
>>>>А если подложить ей localhost?
>>>>
>>>>Конечно, это не слишком красиво, но ведь localhost --- стандартное имя, так
>>>>что проблем в привязкой к нему быть не должно, ИМХО.
>>>
>>>только разве на localhost не получу я 127.0.0.1 ?
>>
>>чуть выше я написал:
>>gethostbyname() вернет 127.0.0.1 для localhost :)
>
>Вот тебе функция. Будет возвращать твой IP в читабельном виде Ж)
>
>char *_getmyip()
>{
>    struct ifreq ifr;
>    memset(&ifr, 0, sizeof(ifr));
>    strcpy(ifr.ifr_name, "eth0");
>
>    int s = socket(AF_INET, SOCK_DGRAM, 0);
>    ioctl(s, SIOCGIFADDR, &ifr);
>    close(s);
>
>    struct sockaddr_in *sa = (struct sockaddr_in*)&ifr.ifr_addr;
>
>    return inet_ntoa(sa->sin_addr);    
>}

плагиат=)
см ссылку что выше.


"как определить свой IP адрес"
Отправлено ufobject , 11-Авг-06 15:14 
>>>>>>Ес
>>ть ли функция в Си для определения собственного ip адреса (или списка
>>
>>>>>>всех адресов)?
>>>>>>gethostbyname требует указывать hostname (напр. localhost - 127.0.0.1), а не хотелось бы
>>>>>>привязываться к названиям...
>>>>>
>>>>>А если подложить ей localhost?
>>>>>
>>>>>Конечно, это не слишком красиво, но ведь localhost --- стандартное имя, так
>>>>>что проблем в привязкой к нему быть не должно, ИМХО.
>>>>
>>>>только разве на localhost не получу я 127.0.0.1 ?
>>>
>>>чуть выше я написал:
>>>gethostbyname() вернет 127.0.0.1 для localhost :)
>>
>>Вот тебе функция. Будет возвращать твой IP в читабельном виде Ж)
>>
>>char *_getmyip()
>>{
>>    struct ifreq ifr;
>>    memset(&ifr, 0, sizeof(ifr));
>>    strcpy(ifr.ifr_name, "eth0");
>>
>>    int s = socket(AF_INET, SOCK_DGRAM, 0);
>>    ioctl(s, SIOCGIFADDR, &ifr);
>>    close(s);
>>
>>    struct sockaddr_in *sa = (struct sockaddr_in*)&ifr.ifr_addr;
>>
>>    return inet_ntoa(sa->sin_addr);    
>>}
>
>плагиат=)
>см ссылку что выше.

Чего? Какой плагиат? Я где то копирайты поставил? Со мной же эта тема и обсуждалась Ж)


"как определить свой IP адрес"
Отправлено vic , 11-Авг-06 16:44 
>>>>>>>Ес
>>>ть ли функция в Си для определения собственного ip адреса (или списка
>>>
>>>>>>>всех адресов)?
>>>>>>>gethostbyname требует указывать hostname (напр. localhost - 127.0.0.1), а не хотелось бы
>>>>>>>привязываться к названиям...
>>>>>>
>>>>>>А если подложить ей localhost?
>>>>>>
>>>>>>Конечно, это не слишком красиво, но ведь localhost --- стандартное имя, так
>>>>>>что проблем в привязкой к нему быть не должно, ИМХО.
>>>>>
>>>>>только разве на localhost не получу я 127.0.0.1 ?
>>>>
>>>>чуть выше я написал:
>>>>gethostbyname() вернет 127.0.0.1 для localhost :)
>>>
>>>Вот тебе функция. Будет возвращать твой IP в читабельном виде Ж)
>>>
>>>char *_getmyip()
>>>{
>>>    struct ifreq ifr;
>>>    memset(&ifr, 0, sizeof(ifr));
>>>    strcpy(ifr.ifr_name, "eth0");
>>>
>>>    int s = socket(AF_INET, SOCK_DGRAM, 0);
>>>    ioctl(s, SIOCGIFADDR, &ifr);
>>>    close(s);
>>>
>>>    struct sockaddr_in *sa = (struct sockaddr_in*)&ifr.ifr_addr;
>>>
>>>    return inet_ntoa(sa->sin_addr);    
>>>}
>>
>>плагиат=)
>>см ссылку что выше.
>
>Чего? Какой плагиат? Я где то копирайты поставил? Со мной же эта
>тема и обсуждалась Ж)

Ну можно было бы и указать что в ссылке этот текст есть, ведь почти ничего не поменял :)
А потом у меня там фраза про то что 'это пример без всяких проверок' и т.п., а ты прямо так выложил пример без коммента. Вот человек вставит себе в код эту функцию as is, а потом удивиться почему она не так работает периодически :) И будет думать что мы плохие примеры даем :)


"как определить свой IP адрес"
Отправлено ufobject , 11-Авг-06 17:07 
>>>>>>>>Ес
>>>>ть ли функция в Си для определения собственного ip адреса (или списка
>>>>
>>>>>>>>всех адресов)?
>>>>>>>>gethostbyname требует указывать hostname (напр. localhost - 127.0.0.1), а не хотелось бы
>>>>>>>>привязываться к названиям...
>>>>>>>
>>>>>>>А если подложить ей localhost?
>>>>>>>
>>>>>>>Конечно, это не слишком красиво, но ведь localhost --- стандартное имя, так
>>>>>>>что проблем в привязкой к нему быть не должно, ИМХО.
>>>>>>
>>>>>>только разве на localhost не получу я 127.0.0.1 ?
>>>>>
>>>>>чуть выше я написал:
>>>>>gethostbyname() вернет 127.0.0.1 для localhost :)
>>>>
>>>>Вот тебе функция. Будет возвращать твой IP в читабельном виде Ж)
>>>>
>>>>char *_getmyip()
>>>>{
>>>>    struct ifreq ifr;
>>>>    memset(&ifr, 0, sizeof(ifr));
>>>>    strcpy(ifr.ifr_name, "eth0");
>>>>
>>>>    int s = socket(AF_INET, SOCK_DGRAM, 0);
>>>>    ioctl(s, SIOCGIFADDR, &ifr);
>>>>    close(s);
>>>>
>>>>    struct sockaddr_in *sa = (struct sockaddr_in*)&ifr.ifr_addr;
>>>>
>>>>    return inet_ntoa(sa->sin_addr);    
>>>>}
>>>
>>>плагиат=)
>>>см ссылку что выше.
>>
>>Чего? Какой плагиат? Я где то копирайты поставил? Со мной же эта
>>тема и обсуждалась Ж)
>
>Ну можно было бы и указать что в ссылке этот текст есть,
>ведь почти ничего не поменял :)
>А потом у меня там фраза про то что 'это пример без
>всяких проверок' и т.п., а ты прямо так выложил пример без
>коммента. Вот человек вставит себе в код эту функцию as is,
>а потом удивиться почему она не так работает периодически :) И
>будет думать что мы плохие примеры даем :)


Возможно я не прав, но у меня этот код работает ПРИВОСХОДНО. И я оч благодарен автору за э
то Ж)


"как определить свой IP адрес"
Отправлено Ganduras , 06-Окт-06 13:09 

>Возможно я не прав, но у меня этот код работает ПРИВОСХОДНО. И
>я оч благодарен автору за это Ж)

эх, в эту бочку меда, да бочку дегдя б.

Как будет вести себя процедура на eth0, если на нем IPv6 адрес повесить :)
Вопрос риторический.


"как определить свой IP адрес"
Отправлено vic , 06-Окт-06 14:55 
>
>>Возможно я не прав, но у меня этот код работает ПРИВОСХОДНО. И
>>я оч благодарен автору за это Ж)
>
>эх, в эту бочку меда, да бочку дегдя б.
>
>Как будет вести себя процедура на eth0, если на нем IPv6 адрес
>повесить :)
>Вопрос риторический.

Зачем подымать тему двухмесячной давности? (Вопроc риторический)
Если бы решение предложил, так ведь нет же...

Что касается ipv6, то у меня и ipv4 и ipv6 на интерфейсе установлено. Функция показывает адрес ipv4, что и должна показывать, ipv6 от нее никто не требует. Для ipv6 используются иные параметры или функция. Если читали внимательно, то я приводил пример простой функции, делая оговорки что это всего лишь пример.


"как определить свой IP адрес"
Отправлено Ganduras , 07-Окт-06 12:56 
>Если бы решение предложил, так ведь нет же...

Зато предлагаемый способ - явно не решение. Если на интерфейсе поднято два и более адресов, эта функция уже не подходит. ifconfig тоже видит только один первый адрес, тогда как например через zebra или quagga можно увидеть более одного адреса. Жаль что используемый в них код не столь переносим между различными unix like ОС, но есть реализации под каждую из них.

>Что касается ipv6, то у меня и ipv4 и ipv6 на интерфейсе
>установлено. Функция показывает адрес ipv4, что и должна показывать, ipv6 от
>нее никто не требует. Для ipv6 используются иные параметры или функция.
>Если читали внимательно, то я приводил пример простой функции, делая оговорки
>что это всего лишь пример.

Не хотел обидеть ни вас, ни кого другого. Просто поправка: у структуры sockaddr надо хотя бы поставить проверку поля sa_family. Вы сможете понять, к чему я это говорю, если оставить единственным адресом на данном интерфейсе - адрес из inet6.


"как определить свой IP адрес"
Отправлено vic , 09-Окт-06 12:34 
>Зато предлагаемый способ - явно не решение. Если на интерфейсе поднято два
>и более адресов, эта функция уже не подходит. ifconfig тоже видит
>только один первый адрес, тогда как например через zebra или quagga
>можно увидеть более одного адреса. Жаль что используемый в них код
>не столь переносим между различными unix like ОС, но есть реализации
>под каждую из них.

Да, не решение. Я оговаривал что это 'пример' (направление куда думать).
Кстати, в линухе ifconfig видит адреса алиасы на интерфейсе (но только в линухе).
Для *nix'ов это конечно системозависимая информация, поэтому нет единообразного способа доступа к ней.

>Не хотел обидеть ни вас, ни кого другого. Просто поправка: у структуры
>sockaddr надо хотя бы поставить проверку поля sa_family. Вы сможете понять,
>к чему я это говорю, если оставить единственным адресом на данном
>интерфейсе - адрес из inet6.

Ну да и эту проверку конечно надо делать как и все остальные опущенные проверки (пример все таки).
Однако, если нету IPv4-адреса (или интерфейс в дауне), то функция вернет 0.0.0.0 (вырожденный), т.е. сообщит об отсутствии IPv4-адреса. При этом конечно может существовать IPv6-адрес, но так как дело функции вернуть IPv4-адрес, то она нулевым адресом сообщает об отсутствии оного (опять же это верно для линуха, но может быть неверным для других *nix).

Из всего этого следует что IP адрес в программу следует передавать в конфигурации возложив эту проблему на пользователя программы, как это и делают сервера типа apache. IMHO.