C中的gethostbyname

C中的gethostbyname,c,gethostbyname,C,Gethostbyname,我不知道如何用C语言编写应用程序,但我需要一个能够: lh = gethostbyname("localhost"); output = lh->h_name; 要打印输出变量 上面的代码在PHP MongoDB数据库驱动程序中用于获取计算机的主机名(主机名是生成唯一ID的输入的一部分)。我怀疑这是否会返回主机名,所以我需要一些证据 任何代码示例都会非常有用 快乐的一天。怎么了 h_名称 主机(PC)的正式名称。如果 使用DNS或类似的解析 系统,它是完全合格的 导致错误的域名(FQDN

我不知道如何用C语言编写应用程序,但我需要一个能够:

lh = gethostbyname("localhost");
output = lh->h_name;
要打印输出变量

上面的代码在PHP MongoDB数据库驱动程序中用于获取计算机的主机名(主机名是生成唯一ID的输入的一部分)。我怀疑这是否会返回主机名,所以我需要一些证据

任何代码示例都会非常有用

快乐的一天。

怎么了

h_名称

主机(PC)的正式名称。如果 使用DNS或类似的解析 系统,它是完全合格的 导致错误的域名(FQDN) 服务器返回回复。如果使用 本地主机文件,它是第一个 IPv4地址后的条目


在C/UNIX中,等价物类似于:

#include <stdio.h>
#include <netdb.h>

int main (int argc, char *argv[]) {
    struct hostent *hstnm;
    if (argc != 2) {
        fprintf(stderr, "usage: %s hostname\n", argv[0]);
        return 1;
    }
    hstnm = gethostbyname (argv[1]);
    if (!hstnm)
        return 1;
    printf ("Name: %s\n", hstnm->h_name);
    return 0;
}
但是你自己试试看。如果你有正确的环境,它应该是好的

#include <stdio.h>
#include <netdb.h>


int main(int argc, char *argv[])
{
    struct hostent *lh = gethostbyname("localhost");

    if (lh)
        puts(lh->h_name);
    else
        herror("gethostbyname");

    return 0;
}
…然后它将返回“foobar”。但是,如果您使用另一种方法(这也是很常见的),那么它只会返回“localhost”。更可靠的方法是使用
gethostname()
函数:

#include <stdio.h>
#include <unistd.h>
#include <limits.h>

int main(int argc, char *argv[])
{
    char hostname[HOST_NAME_MAX + 1];

    hostname[HOST_NAME_MAX] = 0;
    if (gethostname(hostname, HOST_NAME_MAX) == 0)
        puts(hostname);
    else
        perror("gethostname");

    return 0;
}
#包括
#包括
#包括
int main(int argc,char*argv[])
{
字符主机名[HOST_NAME_MAX+1];
主机名[主机名\u最大值]=0;
if(gethostname(主机名,主机名,最大值)=0)
puts(主机名);
其他的
perror(“gethostname”);
返回0;
}

当然,DNS不会用于“本地主机”,因此与此相关的是本地主机文件。如果本地主机文件中的条目同时包含“localhost”和与同一地址(127.0.0.1)关联的真实主机名,并且真实主机名是第一个条目,则h_name将返回真实主机名。@David Gelhar:localhost不是计算机名。localhost解析为127.0.0.1,但没有反向转换。没错,但关键是如果/etc/hosts看起来像
127.0.0.1 realname.com localhost
,那么
gethostbyname(“localhost”)
将返回h_name中的“realname.com”,但如果顺序颠倒,它将返回“localhost”(参见caf的答案)。您应该将
sizeof(hostname)-1
作为
gethostname()的长度传递给
gethostname()
。否则,如果发生截断,则可能最终没有空终止。根据我的主页:“POSIX.1说,如果发生这种截断,那么返回的缓冲区是否包含终止的空字节是未知的。”@scai:谢谢,修复了。
127.0.0.1    foobar    localhost
#include <stdio.h>
#include <unistd.h>
#include <limits.h>

int main(int argc, char *argv[])
{
    char hostname[HOST_NAME_MAX + 1];

    hostname[HOST_NAME_MAX] = 0;
    if (gethostname(hostname, HOST_NAME_MAX) == 0)
        puts(hostname);
    else
        perror("gethostname");

    return 0;
}