Хочу получить все ip адреса, которые закреплены за машиной
использую gethostbyname(NULL). По идее, как написано в мануале, должны как раз они все и вернуться мне в структуре hostent. Ан нет. Возвращается только один. Хотя их на самом деле 2. В чем может быть проблема?
Здравствуйте, slay81, Вы писали:
S>Хочу получить все ip адреса, которые закреплены за машиной S>использую gethostbyname(NULL). По идее, как написано в мануале, должны как раз они все и вернуться мне в структуре hostent. Ан нет. Возвращается только один. Хотя их на самом деле 2. В чем может быть проблема?
чуток ниже статья была, вот оттуда
struct hostent {
char *h_name;
char **h_aliases;
int h_addrtype;
int h_length;
char **h_addr_list;
};
#define h_addr h_addr_list[0]
h_name. Имя хоста.
h_aliases. Массив строк, содержащих псевдонимы хоста. Завершается значением NULL.
h_addrtype. Тип адреса. Для Internet-домена — AF_INET.
h_length. Длина адреса в байтах. h_addr_list. Массив, содержащий адреса всех сетевых интерфейсов хоста. Завершается нулём. Обратите внимание, что байты каждого адреса хранятся с сетевым порядке, поэтому htonl вызывать не нужно.
Здравствуйте, slay81, Вы писали:
S>Хочу получить все ip адреса, которые закреплены за машиной S>использую gethostbyname(NULL). По идее, как написано в мануале, должны как раз они все и вернуться мне в структуре hostent. Ан нет. Возвращается только один. Хотя их на самом деле 2. В чем может быть проблема?
ну на счет gethostbyname(NULL) не скажу... это че-то непонятное мне... я обычно пользую gethostname(buf, len)
а потом уже gethostbyname(buf)
но если вот такой код не работает, а nslookup показывает все что нужно... тогда фиг знат.
#include <sys/types.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
int
main(int argc, char **argv)
{
struct hostent *hptr;
int count;
hptr = gethostbyname2("ftp.freebsd.org", AF_INET);
if (hptr == NULL)
return -1; /* не резолвится наше имя */
/* А тут собственно мы чего-то делаем. */for (count = 0; hptr->h_addr_list[count]; count++)
printf("%s\n", inet_ntoa(*(struct in_addr *)hptr->h_addr_list[count]));
}
$ gcc -o t t.c
$ ./t
204.152.184.73
62.243.72.50
$
Здравствуйте, aka50, Вы писали:
A>Здравствуйте, slay81, Вы писали:
S>>Хочу получить все ip адреса, которые закреплены за машиной S>>использую gethostbyname(NULL). По идее, как написано в мануале, должны как раз они все и вернуться мне в структуре hostent. Ан нет. Возвращается только один. Хотя их на самом деле 2. В чем может быть проблема?
A>ну на счет gethostbyname(NULL) не скажу... это че-то непонятное мне... я обычно пользую gethostname(buf, len) A>а потом уже gethostbyname(buf)
A>но если вот такой код не работает, а nslookup показывает все что нужно... тогда фиг знат.
A>
A>#include <sys/types.h>
A>#include <unistd.h>
A>#include <sys/socket.h>
A>#include <netinet/in.h>
A>#include <arpa/inet.h>
A>#include <netdb.h>
A>int
A>main(int argc, char **argv)
A>{
A> struct hostent *hptr;
A> int count;
A> hptr = gethostbyname2("ftp.freebsd.org", AF_INET);
A> if (hptr == NULL)
A> return -1; /* не резолвится наше имя */
A> /* А тут собственно мы чего-то делаем. */
A> for (count = 0; hptr->h_addr_list[count]; count++)
A> printf("%s\n", inet_ntoa(*(struct in_addr *)hptr->h_addr_list[count]));
A>}
A>
A>
A>$ gcc -o t t.c
A>$ ./t
A>204.152.184.73
A>62.243.72.50
A>$
A>
Здравствуйте, mityaika, Вы писали:
M>h_name. Имя хоста. M>h_aliases. Массив строк, содержащих псевдонимы хоста. Завершается значением NULL. M>h_addrtype. Тип адреса. Для Internet-домена — AF_INET. M>h_length. Длина адреса в байтах. M>h_addr_list. Массив, содержащий адреса всех сетевых интерфейсов хоста. Завершается нулём. Обратите внимание, что байты каждого адреса хранятся с сетевым порядке, поэтому htonl вызывать не нужно.
Здравствуйте, slay81, Вы писали:
S>Здравствуйте, mityaika, Вы писали:
M>>h_name. Имя хоста. M>>h_aliases. Массив строк, содержащих псевдонимы хоста. Завершается значением NULL. M>>h_addrtype. Тип адреса. Для Internet-домена — AF_INET. M>>h_length. Длина адреса в байтах. M>>h_addr_list. Массив, содержащий адреса всех сетевых интерфейсов хоста. Завершается нулём. Обратите внимание, что байты каждого адреса хранятся с сетевым порядке, поэтому htonl вызывать не нужно.
S>Уф, спасибо, что носом ткнули S>То, что надо
дык не мне спасибо
автору
я сам это сегодня утром только в метро прочитал
ниже по ветке примеры рабочие есть
Здравствуйте, aka50, Вы писали:
A>ну на счет gethostbyname(NULL) не скажу... это че-то непонятное мне... я обычно пользую gethostname(buf, len) A>а потом уже gethostbyname(buf)
Первое:
Смотрим MSDN:
If null is provided in the name parameter, the returned string is the same as the string returned by a successful gethostname function call.
Второе: на машине две сетевухи (правда виртуальных от vmware. Ни какой сети машина не подключена):
192.168.108.1
192.168.130.1
Если в качестве параметра в gethostbyname давать имя машины то в hostent окажутся именно эти два адреса.
А если дать localhost, то 127.0.0.1. Так оно и должно быть?
D>Если в качестве параметра в gethostbyname давать имя машины то в hostent окажутся именно эти два адреса. D>А если дать localhost, то 127.0.0.1. Так оно и должно быть?
Сорри, что сую нос.. но вообще — да. Потому что имя localhost определёно в файле hosts как 127.0.0.1
Вроди так.
Здравствуйте, duan, Вы писали:
D>Здравствуйте, aka50, Вы писали:
D>If null is provided in the name parameter, the returned string is the same as the string returned by a successful gethostname function call.
хмм... ну я не так часто этой функцией пользуюсь... но у нас в man (FreeBSD 4.6) такого не написано... и если честно то не знал
D>Если в качестве параметра в gethostbyname давать имя машины то в hostent окажутся именно эти два адреса. D>А если дать localhost, то 127.0.0.1. Так оно и должно быть?
ага.
Здравствуйте, aka50, Вы писали:
A>хмм... ну я не так часто этой функцией пользуюсь... но у нас в man (FreeBSD 4.6) такого не написано... и если честно то не знал
А может это чисто виндовая фича. Может попробуете. А заодно общественности скажете. Если не сложно конечно.
Здравствуйте, duan, Вы писали:
A>>хмм... ну я не так часто этой функцией пользуюсь... но у нас в man (FreeBSD 4.6) такого не написано... и если честно то не знал D>А может это чисто виндовая фича. Может попробуете. А заодно общественности скажете. Если не сложно конечно.
Во FreeBSD 4.8 не работает. Прога валится в кору.
Есть функция без параметра, gethostent, которая возвращает записи из файла /etc/hosts
#include <sys/types.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
int
main(int argc, char **argv)
{
struct hostent *hptr;
int count;
while (hptr = gethostent()){
if (hptr == NULL)
return -1;
for (count = 0; hptr->h_addr_list[count]; count++)
printf("%s -> %s\n", inet_ntoa(*(struct in_addr *)hptr->h_addr_list[count]), hptr->h_name);
}
return 0;
}
Здравствуйте, butcher, Вы писали:
B>Здравствуйте, mityaika, Вы писали:
M>>радуюсь, прям как ребенок M>>маленькими шажками я таки доберусь до цели
B>Любителю творчества Криса Касперски посвещается B>случайно наткнулся..