【问题标题】:gethostbyname in CC中的gethostbyname
【发布时间】:2011-02-21 09:01:21
【问题描述】:

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

lh = gethostbyname("localhost");
output = lh->h_name;

要打印输出变量。

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

任何代码示例都会很有帮助。

快乐的一天。

【问题讨论】:

    标签: c gethostbyname


    【解决方案1】:
    #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;
    }
    

    这不是一种非常可靠的确定主机名的方法,尽管它有时可能会起作用。 (它返回的内容取决于/etc/hosts 的设置方式)。如果你有这样的一行:

    127.0.0.1    foobar    localhost
    

    ...然后它将返回“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;
    }
    

    【讨论】:

    • 您应该将sizeof(hostname) -1 作为长度传递给gethostname()。否则,如果发生截断,您最终可能没有空终止。根据我的手册页:“POSIX.1 表示,如果发生这种截断,则返回的缓冲区是否包含终止空字节是未指定的。”
    • @scai:谢谢,已修复。
    【解决方案2】:

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

    以及它有效的证明:

    $ hstnm localhost
    Name: demon-a21pht
    

    但是你自己试试吧。只要你有正确的环境,应该没问题。

    【讨论】:

      【解决方案3】:

      怎么了?

      h_name

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

      【讨论】:

      • 当然,DNS 不会用于“localhost”,因此相关的是本地主机文件。 如果本地主机文件中的条目同时具有“localhost”和与同一地址(127.0.0.1)关联的真实主机名并且真实主机名是第一个条目,然后 h_name 将返回真实的主机名。
      • @David Gelhar:localhost 不是计算机的名称。 localhost 解析为 127.0.0.1 但没有反向转换。 en.wikipedia.org/wiki/Localhost
      • 对,但关键是如果/etc/hosts 看起来像127.0.0.1 realname.com localhost 那么gethostbyname("localhost") 将在h_name 中返回“realname.com”,但如果顺序颠倒,它将返回“ localhost”(见caf的回答)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-09
      • 1970-01-01
      • 2014-05-30
      • 1970-01-01
      • 2011-10-02
      • 1970-01-01
      相关资源
      最近更新 更多