Как определить ваш IP / имя с помощью gethostbyname () - PullRequest
0 голосов
/ 28 ноября 2011

есть ли способ получить номер IP от gethostname()?

Мы случайным образом генерируем IP-адреса для компьютеров в лаборатории, в которой мы находимся. Мы используем gethostbyname(<random ip>) для получения IP-адреса компьютера.

По сути, мы хотим сравнить ip, который мы получаем от gethostbyname (), с тем, что мы получаем от gethostname ().

Мы пытались:

struct hostent* host;
char temp[MAX_LEN];
gethostname(temp, MAX_LEN);

host = gethostbyname(<random ip address>)

if(host->h_name == temp) printf("They are the same\n");

Проблема в том, что host-> h_name имеет значение '172.125.45.1' (я сделал это вверх), а температура равна 'u-my_comp'

поэтому мы не можем сравнивать строки, потому что одна дает нам имя компьютера (u-my_comp), а другая - ip ...

Есть ли способ заставить эти функции возвращать одинаковые значения?

мы пытались сделать что-то вроде

gethostname(temp, 24)
temp_host = gethostbyname(temp)

в надежде, что теперь мы сможем сравнить temp_host-> h_name с host-> h_name ... но да, это тоже не сработало.

Есть идеи?

спасибо!

Ответы [ 2 ]

3 голосов
/ 28 ноября 2011

gethostbyname() для преобразования имени хоста в адрес сокета.Если «имя хоста», которое вы вводите, является IPv4-адресом с точками и четырьмя точками, это будет все, что вы получите в параметре h_name результата.

Чтобы преобразовать адрес сокета обратно в имя, которое вы хотитесопутствующая функция gethostbyaddr() - за исключением того, что вы этого не сделаете, потому что gethostbyname() и gethostbyaddr() устарели.Вместо этого вы должны использовать getaddrinfo() и getnameinfo().

Например:

#include <stdio.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main()
{
    struct sockaddr_in sa;
    char host[1024];
    int gni_err;

    sa.sin_family = AF_INET;
    sa.sin_port = 0;
    sa.sin_addr.s_addr = inet_addr("127.0.0.1");

    gni_err = getnameinfo((struct sockaddr *)&sa, sizeof sa, host, sizeof host, NULL, 0, NI_NAMEREQD | NI_NOFQDN);

    if (gni_err == 0) {
        printf("host is: %s\n", host);
    } else {
        fprintf(stderr, "Error looking up host: %s\n", gai_strerror(gni_err));
    }

    return 0;
}
0 голосов
/ 28 ноября 2011

Если вы позвоните:

myhost = gethostbyname(temp);

(выделив myhost), тогда у вас будет две структуры хостов, которые вы будете сравнивать - у вас будут списки IP-адресов как для целевого хоста запроса, так и для текущего хоста (а не только имя хоста для текущего хоста).

...