如何使用gethostbyname()检测您的IP /名称

时间:2011-11-27 23:08:06

标签: c sockets ip

有没有办法从gethostname()获取IP号码?

我们正在为我们所在的实验室中的计算机随机生成IP地址。我们使用gethostbyname(<random ip>)来获取计算机的IP。

我们想要做的就是将我们从gethostbyname()得到的ip与从gethostname()得到的ip进行比较。

我们尝试过:

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");
  

问题是,主机 - &gt; h_name是&#39; 172.125.45.1&#39; (我做了那个   up)和temp是&#39; u-my_comp&#39;

所以我们无法比较字符串,因为一个给了我们计算机的名称(u-my_comp),另一个给了ip ...

有没有让这些函数返回相同类型的值?

我们尝试过像

这样的事情
gethostname(temp, 24)
temp_host = gethostbyname(temp)

希望现在我们可以将temp_host-&gt; h_name与host-&gt; h_name进行比较...但是,这也没有用。

有什么想法吗?

谢谢!

2 个答案:

答案 0 :(得分:3)

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;
}

答案 1 :(得分:0)

如果你打电话:

myhost = gethostbyname(temp);

(已分配myhost)然后您将有两个要比较的hostent结构 - 您将拥有目标查询主机和当前主机的IP地址列表(而不仅仅是当前主机的主机名)。