Доброго времени суток!
Необходимо чтобы при запуске программы, в каком-нибудь статическом поле отображался ip адрес машины.
Пробовал использовать gethostname, а потом gethostbyname - в результате почему то выходило только 127.0.0.1, а мне необходимый мне айпи выглядит вот так: 192.168.78.134
Также пробовал getsockname, но его я могу использовать только в одном месте, при создании сервера, который прослушивает канал, а это происходит при запуске программы, но такой вариант выдавал мне 0.0.0.0
Какие есть варианты?
[Решено]Получение ip
Модератор: Модераторы разделов
-
кодировщик
- Сообщения: 974
- Статус: зарёган в пятницу 13
- ОС: Linux
Re: [Решено]Получение ip
Код бы свой показыл полностью?! Тогда вот что первое в голову пришло
Код: Выделить всё
#include <libnet.h>
int main() {
libnet_t *l;
char errbuf[LIBNET_ERRBUF_SIZE];
u_int32_t ip_addr;
l = libnet_init(LIBNET_RAW4, NULL, errbuf);
if ( l == NULL ) {
fprintf(stderr, "libnet_init() failed: %s\n", errbuf);
exit(EXIT_FAILURE);
}
ip_addr = libnet_get_ipaddr4(l);
if ( ip_addr != -1 )
printf("IP address: %s\n", libnet_addr2name4(ip_addr, LIBNET_DONT_RESOLVE));
else
fprintf(stderr, "Couldn't get own IP address: %s\n", libnet_geterror(l));
libnet_destroy(l);
return 0;
}-
KiWi
- Бывший модератор
- Сообщения: 2521
- Статус: статус, статус, статус
Re: [Решено]Получение ip
Немного гугла и, о ужас!
Мы знаем функцию, которая возвращает все сетевые соединения!
getifaddrs
Мы знаем функцию, которая возвращает все сетевые соединения!
getifaddrs
-
Lostboy
- Сообщения: 33
- ОС: openSUSE/Mandriva
Re: [Решено]Получение ip
Спасибо за функцию getifaddrs, тяжело ее найти если не знаешь в принципе о ней ничего
А обычный поиск по этому вопросу выдавал только решения с gethostbyname и getsockname.
Может кому-то понадобится код: (получаем список всех айпи, и выбираем из них только те которые относятся к семейству AF_INET и те у которых интерфейсное имя не равно "lo" т.е. избавляемся от 127.0.0.1)
Может кому-то понадобится код: (получаем список всех айпи, и выбираем из них только те которые относятся к семейству AF_INET и те у которых интерфейсное имя не равно "lo" т.е. избавляемся от 127.0.0.1)
Код: Выделить всё
struct ifaddrs *ifap, *ifap_tmp;
getifaddrs(&ifap);
for(ifap_tmp = ifap; ifap_tmp->ifa_next != NULL; ifap_tmp = ifap_tmp->ifa_next)
{
if(ifap_tmp->ifa_addr->sa_family != AF_INET) continue;
if (!strcmp(ifap_tmp->ifa_name, "lo")) continue;
printf("\nName= %s\n", ifap_tmp->ifa_name);
char* my_ip_address = inet_ntoa(((struct sockaddr_in*)(ifap_tmp->ifa_addr))->sin_addr);
printf("Address= %s\n", my_ip_address);
}
freeifaddrs(ifap);