C 如何使用gethostbyname()检测您的IP/名称
有没有办法从gethostname获取IP号码 我们正在为我们所在实验室的计算机随机生成IP地址。我们使用gethostbyname获取计算机的IP 我们要做的实质是比较从gethostbyname获得的ip和从gethostname获得的ip 我们尝试:C 如何使用gethostbyname()检测您的IP/名称,c,sockets,ip,C,Sockets,Ip,有没有办法从gethostname获取IP号码 我们正在为我们所在实验室的计算机随机生成IP地址。我们使用gethostbyname获取计算机的IP 我们要做的实质是比较从gethostbyname获得的ip和从gethostname获得的ip 我们尝试: struct hostent* host; char temp[MAX_LEN]; gethostname(temp, MAX_LEN); host = gethostbyname(<random ip address>) i
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");
希望现在我们可以比较temp\u host->h\u name和host->h\u name…但是是的,这也不起作用
有什么想法吗
谢谢 如果你打电话:
myhost = gethostbyname(temp);
分配myhost后,您将有两个hostent结构进行比较-您将有目标查询主机和当前主机的IP地址列表,而不仅仅是当前主机的主机名。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;
}
你在用什么操作系统?看看这篇文章:,试试h_addr_listubuntu。我试过玩h_addr_列表你用h_addr_列表做了什么?很多事情。这是唯一能提供任何清晰信息的东西:ipbuf=inet\u ntoa*struct in\u addr*hostentry->h\u addr\u list[0]。。。但是它总是返回127.0.1.1,无论如何它不应该是127.0.0.1吗?
#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;
}