Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何使用gethostbyname()检测您的IP/名称_C_Sockets_Ip - Fatal编程技术网

C 如何使用gethostbyname()检测您的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

有没有办法从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>)

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