Re: gethostbyname + hostent
От: mityaika  
Дата: 18.06.04 13:13
Оценка: 2 (1)
Здравствуйте, 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 вызывать не нужно.
Re[2]: gethostbyname + hostent
От: mityaika  
Дата: 18.06.04 13:56
Оценка: :)
Здравствуйте, 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>



вау!!! и под виндой все работает ловко

#include <stdio.h>
#include "winsock2.h"

void main() 
{
    WSADATA wsaData;
    int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
    if ( iResult != NO_ERROR )
        printf("Error at WSAStartup()\n");
    
    struct hostent *remoteHost;
    char hostName[] = "ftp.freebsd.org";
    
    remoteHost = gethostbyname( hostName );
    if( remoteHost == NULL )
        printf( "Cannot resolve. Error#: %ld\n", WSAGetLastError() );
    else
    {
        for (int count = 0; remoteHost->h_addr_list[count]; count++)
            printf("%s\n", inet_ntoa(*(struct in_addr *)remoteHost->h_addr_list[count]));
    }
    
    
    
    return;
}


радуюсь, прям как ребенок
маленькими шажками я таки доберусь до цели
Re[5]: gethostbyname + hostent
От: butcher Россия http://bu7cher.blogspot.com
Дата: 21.06.04 10:48
Оценка: +1
Здравствуйте, 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;
}

Нет ничего невозможного..
Re[6]: gethostbyname + hostent
От: butcher Россия http://bu7cher.blogspot.com
Дата: 21.06.04 11:30
Оценка: :)
Здравствуйте, butcher, Вы писали:

Это можно убрать из кода
B>
B>    if (hptr == NULL)
B>        return -1;
B>


copy-paste понимаешь

Нет ничего невозможного..
gethostbyname + hostent
От: slay81  
Дата: 18.06.04 12:00
Оценка:
Хочу получить все ip адреса, которые закреплены за машиной
использую gethostbyname(NULL). По идее, как написано в мануале, должны как раз они все и вернуться мне в структуре hostent. Ан нет. Возвращается только один. Хотя их на самом деле 2. В чем может быть проблема?
Re: gethostbyname + hostent
От: aka50 Россия  
Дата: 18.06.04 13:29
Оценка:
Здравствуйте, 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
$
Re[2]: gethostbyname + hostent
От: slay81  
Дата: 18.06.04 15:49
Оценка:
Здравствуйте, mityaika, Вы писали:

M>h_name. Имя хоста.

M>h_aliases. Массив строк, содержащих псевдонимы хоста. Завершается значением NULL.
M>h_addrtype. Тип адреса. Для Internet-домена — AF_INET.
M>h_length. Длина адреса в байтах.
M>h_addr_list. Массив, содержащий адреса всех сетевых интерфейсов хоста. Завершается нулём. Обратите внимание, что байты каждого адреса хранятся с сетевым порядке, поэтому htonl вызывать не нужно.

Уф, спасибо, что носом ткнули
То, что надо
Re[3]: gethostbyname + hostent
От: mityaika  
Дата: 18.06.04 15:53
Оценка:
Здравствуйте, 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>То, что надо

дык не мне спасибо
автору
я сам это сегодня утром только в метро прочитал
ниже по ветке примеры рабочие есть
Re[2]: gethostbyname + hostent
От: duan Россия  
Дата: 19.06.04 14:29
Оценка:
Здравствуйте, 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. Так оно и должно быть?
Re[3]: gethostbyname + hostent
От: Dakis Беларусь  
Дата: 19.06.04 18:26
Оценка:
D>Если в качестве параметра в gethostbyname давать имя машины то в hostent окажутся именно эти два адреса.
D>А если дать localhost, то 127.0.0.1. Так оно и должно быть?
Сорри, что сую нос.. но вообще — да. Потому что имя localhost определёно в файле hosts как 127.0.0.1
Вроди так.
Re[3]: gethostbyname + hostent
От: butcher Россия http://bu7cher.blogspot.com
Дата: 21.06.04 08:59
Оценка:
Здравствуйте, mityaika, Вы писали:

M>радуюсь, прям как ребенок

M>маленькими шажками я таки доберусь до цели

Любителю творчества Криса Касперски посвещается
случайно наткнулся..

Нет ничего невозможного..
Re[3]: gethostbyname + hostent
От: aka50 Россия  
Дата: 21.06.04 09:16
Оценка:
Здравствуйте, 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. Так оно и должно быть?
ага.
Re[4]: gethostbyname + hostent
От: duan Россия  
Дата: 21.06.04 10:30
Оценка:
Здравствуйте, aka50, Вы писали:

A>хмм... ну я не так часто этой функцией пользуюсь... но у нас в man (FreeBSD 4.6) такого не написано... и если честно то не знал

А может это чисто виндовая фича. Может попробуете. А заодно общественности скажете. Если не сложно конечно.
Re[6]: gethostbyname + hostent
От: duan Россия  
Дата: 22.06.04 05:10
Оценка:
B>Во FreeBSD 4.8 не работает. Прога валится в кору.

В Linux 2.6.3 RH9 аналогично
Re[4]: gethostbyname + hostent
От: mityaika  
Дата: 23.06.04 08:47
Оценка:
Здравствуйте, butcher, Вы писали:

B>Здравствуйте, mityaika, Вы писали:


M>>радуюсь, прям как ребенок

M>>маленькими шажками я таки доберусь до цели

B>Любителю творчества Криса Касперски посвещается

B>случайно наткнулся..

спасибо
изучим
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.