Есть ли функция в Си для определения собственного ip адреса (или списка всех адресов)?
gethostbyname требует указывать hostname (напр. localhost - 127.0.0.1), а не хотелось бы привязываться к названиям...
>Есть ли функция в Си для определения собственного ip адреса (или списка
>всех адресов)?
>gethostbyname требует указывать hostname (напр. localhost - 127.0.0.1), а не хотелось бы
>привязываться к названиям...А если подложить ей localhost?
Конечно, это не слишком красиво, но ведь localhost --- стандартное имя, так что проблем в привязкой к нему быть не должно, ИМХО.
>>Есть ли функция в Си для определения собственного 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 адреса (или списка
>>>всех адресов)?
>>>gethostbyname требует указывать hostname (напр. localhost - 127.0.0.1), а не хотелось бы
>>>привязываться к названиям...
>>
>>А если подложить ей localhost?
>>
>>Конечно, это не слишком красиво, но ведь localhost --- стандартное имя, так
>>что проблем в привязкой к нему быть не должно, ИМХО.
>
>gethostbyname() вернет 127.0.0.1 для localhost :)
>
>А вообще уже обсуждалось например тут
>http://www.opennet.me/openforum/vsluhforumID9/5500.html
огромное спасибо!
>>Есть ли функция в Си для определения собственного ip адреса (или списка
>>всех адресов)?
>>gethostbyname требует указывать hostname (напр. localhost - 127.0.0.1), а не хотелось бы
>>привязываться к названиям...
>
>А если подложить ей localhost?
>
>Конечно, это не слишком красиво, но ведь localhost --- стандартное имя, так
>что проблем в привязкой к нему быть не должно, ИМХО.только разве на localhost не получу я 127.0.0.1 ?
>>>Есть ли функция в Си для определения собственного ip адреса (или списка
>>>всех адресов)?
>>>gethostbyname требует указывать hostname (напр. localhost - 127.0.0.1), а не хотелось бы
>>>привязываться к названиям...
>>
>>А если подложить ей localhost?
>>
>>Конечно, это не слишком красиво, но ведь localhost --- стандартное имя, так
>>что проблем в привязкой к нему быть не должно, ИМХО.
>
>только разве на localhost не получу я 127.0.0.1 ?чуть выше я написал:
gethostbyname() вернет 127.0.0.1 для localhost :)
>>>>Ес
ть ли функция в Си для определения собственного 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 адреса (или списка
>
>>>>>всех адресов)?
>>>>>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 адреса (или списка
>>
>>>>>>всех адресов)?
>>>>>>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 адреса (или списка
>>>
>>>>>>>всех адресов)?
>>>>>>>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 адреса (или списка
>>>>
>>>>>>>>всех адресов)?
>>>>>>>>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,
>а потом удивиться почему она не так работает периодически :) И
>будет думать что мы плохие примеры даем :)
Возможно я не прав, но у меня этот код работает ПРИВОСХОДНО. И я оч благодарен автору за э
то Ж)
>Возможно я не прав, но у меня этот код работает ПРИВОСХОДНО. И
>я оч благодарен автору за это Ж)эх, в эту бочку меда, да бочку дегдя б.
Как будет вести себя процедура на eth0, если на нем IPv6 адрес повесить :)
Вопрос риторический.
>
>>Возможно я не прав, но у меня этот код работает ПРИВОСХОДНО. И
>>я оч благодарен автору за это Ж)
>
>эх, в эту бочку меда, да бочку дегдя б.
>
>Как будет вести себя процедура на eth0, если на нем IPv6 адрес
>повесить :)
>Вопрос риторический.Зачем подымать тему двухмесячной давности? (Вопроc риторический)
Если бы решение предложил, так ведь нет же...Что касается ipv6, то у меня и ipv4 и ipv6 на интерфейсе установлено. Функция показывает адрес ipv4, что и должна показывать, ipv6 от нее никто не требует. Для ipv6 используются иные параметры или функция. Если читали внимательно, то я приводил пример простой функции, делая оговорки что это всего лишь пример.
>Если бы решение предложил, так ведь нет же...Зато предлагаемый способ - явно не решение. Если на интерфейсе поднято два и более адресов, эта функция уже не подходит. ifconfig тоже видит только один первый адрес, тогда как например через zebra или quagga можно увидеть более одного адреса. Жаль что используемый в них код не столь переносим между различными unix like ОС, но есть реализации под каждую из них.
>Что касается ipv6, то у меня и ipv4 и ipv6 на интерфейсе
>установлено. Функция показывает адрес ipv4, что и должна показывать, ipv6 от
>нее никто не требует. Для ipv6 используются иные параметры или функция.
>Если читали внимательно, то я приводил пример простой функции, делая оговорки
>что это всего лишь пример.Не хотел обидеть ни вас, ни кого другого. Просто поправка: у структуры sockaddr надо хотя бы поставить проверку поля sa_family. Вы сможете понять, к чему я это говорю, если оставить единственным адресом на данном интерфейсе - адрес из inet6.
>Зато предлагаемый способ - явно не решение. Если на интерфейсе поднято два
>и более адресов, эта функция уже не подходит. ifconfig тоже видит
>только один первый адрес, тогда как например через zebra или quagga
>можно увидеть более одного адреса. Жаль что используемый в них код
>не столь переносим между различными unix like ОС, но есть реализации
>под каждую из них.Да, не решение. Я оговаривал что это 'пример' (направление куда думать).
Кстати, в линухе ifconfig видит адреса алиасы на интерфейсе (но только в линухе).
Для *nix'ов это конечно системозависимая информация, поэтому нет единообразного способа доступа к ней.>Не хотел обидеть ни вас, ни кого другого. Просто поправка: у структуры
>sockaddr надо хотя бы поставить проверку поля sa_family. Вы сможете понять,
>к чему я это говорю, если оставить единственным адресом на данном
>интерфейсе - адрес из inet6.Ну да и эту проверку конечно надо делать как и все остальные опущенные проверки (пример все таки).
Однако, если нету IPv4-адреса (или интерфейс в дауне), то функция вернет 0.0.0.0 (вырожденный), т.е. сообщит об отсутствии IPv4-адреса. При этом конечно может существовать IPv6-адрес, но так как дело функции вернуть IPv4-адрес, то она нулевым адресом сообщает об отсутствии оного (опять же это верно для линуха, но может быть неверным для других *nix).Из всего этого следует что IP адрес в программу следует передавать в конфигурации возложив эту проблему на пользователя программы, как это и делают сервера типа apache. IMHO.