有没有办法从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进行比较...但是,这也没有用。
有什么想法吗?
谢谢!
答案 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地址列表(而不仅仅是当前主机的主机名)。