The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"как определить свой IP адрес"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

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

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]


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

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "как определить свой IP адрес"  
Сообщение от vic (??) on 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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "как определить свой IP адрес"  
Сообщение от konst email(??) on 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


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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "как определить свой IP адрес"  
Сообщение от vic (??) on 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 :)

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

6. "как определить свой IP адрес"  
Сообщение от ufobject email(??) on 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);    
}

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

7. "как определить свой IP адрес"  
Сообщение от vic (??) on 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);    
>}

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

8. "как определить свой IP адрес"  
Сообщение от ufobject email(??) on 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);    
>>}
>
>плагиат=)
>см ссылку что выше.

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

9. "как определить свой IP адрес"  
Сообщение от vic (??) on 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, а потом удивиться почему она не так работает периодически :) И будет думать что мы плохие примеры даем :)

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

10. "как определить свой IP адрес"  
Сообщение от ufobject email(ok) on 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,
>а потом удивиться почему она не так работает периодически :) И
>будет думать что мы плохие примеры даем :)


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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

14. "как определить свой IP адрес"  
Сообщение от vic (??) on 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.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру