【问题标题】:Retrieving DHCP-allocated domain suffix in Linux C在 Linux C 中检索 DHCP 分配的域后缀
【发布时间】:2012-08-26 23:39:02
【问题描述】:

我正在尝试在 ANSI C (Linux) 中以编程方式检索主机的本地域后缀。例如:我的机器是ironside.0ffnet.net,我想检索“0ffnet.net”。

我已经看到许多使用 getnameinfo() 和 getaddrinfo() 解决此问题的帖子,但是这些函数似乎从 /etc/hosts 文件中提取它们的信息以获取机器本地的任何接口地址。

如果我的机器通过 DHCP 分配了一个地址(和相应的域后缀),则 /etc/hosts 文件不会得到更新,而是将此信息存储在 /etc/resolv.conf 例如:

dfex@ironside:~/hush$cat /etc/resolv.conf 
domain 0ffnet.net
search 0ffnet.net
nameserver 139.130.4.4

因此,getnameinfo() 和 getaddrinfo() 都只返回机器的主机名,不带后缀,使用 /etc/hosts 信息,如下所示:

dfex@ironside:~/hush$ cat /etc/hosts
::1             ironside localhost6.localdomain6 localhost6
127.0.1.1       ironside
127.0.0.1       localhost
::1             localhost ip6-localhost ip6-loopback

有没有人知道一个函数可以在不使用 system() 调用的情况下提取这些信息?我一直在梳理 Beej 的指南,但没有取得多大成功。

【问题讨论】:

  • 您可能必须进行适当的 DHCP 广播。实际协议见RFC2131

标签: c linux dns network-programming


【解决方案1】:

感谢@alan-curry,它为我指明了正确的方向。对于其他为此苦苦挣扎的人, res_init 绝对是要走的路。这是获取本地域后缀的快速方法:

#include <stdio.h>
#include <resolv.h>

int main (int argc, char *argv[]) {

res_init();

printf ("Default domain: %s\n", _res.defdname);
return 0;
}

【讨论】:

    【解决方案2】:

    我将不得不分解这个问题并分别回答各个部分。首先是标题问题。

    DHCP 域

    真正知道 DHCP 客户端从 DHCP 服务器接收到什么的唯一方法是读取客户端留在/var/lib/dhcp 中的文件。如果有其他东西控制了resolv.conf,则可能根本不会使用 DHCP 建议的搜索域。

    “我的主机的本地域后缀”

    主机可能属于多个域,也可能不属于任何域,这使得这个概念很难定义。 resolv.conf 指定将搜索您正在解析的主机名的域;当应用于您的自己的主机名时,并不能保证搜索会成功。

    随便!解析器搜索列表是我真正想要的。我如何获得它?

    致电res_init,然后查看_res.dnsrch 和/或_res.defdname。或者自己解析resolv.conf;这是一种非常简单且稳定的格式。

    那么 getdomainname() 是干什么用的?

    它适用于您可能不想要的 NIS(YP)。

    【讨论】:

    • 传奇 - 感谢 Alan - 之前没有遇到 res_init。这成功了:)
    【解决方案3】:

    您可以尝试使用:

    int getdomainname(char *name, size_t len);
    

    尝试运行这个程序:

    #include <unistd.h>
    #include <stdio.h>
    
    int main()
    {
     char buf[255];
     getdomainname(buf, 255);
     printf("Domain: %s\n", buf);
     return 0; 
    }
    

    编辑:

    不,经过多次尝试,我怀疑您将不得不使用系统调用和丑陋的 C 解析器(在 popen 中使用 AWK 会使这段代码更短一些)。

    这段代码似乎对我有用:

    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
     char buf[255];
     const char reqhostname[255] = "ENTER_YOUR_HOSTNAME_HERE";
    
     FILE *fd;
     char readbuf[255];
     char *pch;
     int token_counter = 0;
    
     memset(buf, 0, 255);
     strcat(buf, "host ");
     strcat(buf, reqhostname);
     fd = popen(buf, "r");
     fgets(readbuf, 255, fd);
     printf("Host returned: %s\n", readbuf);
     pclose(fd);
    
     pch = strtok(readbuf, " ");
     while (pch != NULL)
       {
            strcpy(buf, pch);
            break;
       }
    
     memset(buf2, 0, 255);
     pch = strtok(buf, ".");
     while (pch != NULL)
       {
            pch = strtok(NULL, ".");
            if (pch == NULL)
               {
                    memset(buf, 0, 255);
                    strncpy(buf, buf2, strlen(buf2) - 1);
                    break;
               }
            token_counter++;
            strcat(buf2, pch);
            strcat(buf2, ".");
       }
    
     printf("Domain: %s\n", buf);
    
     return 0;
    }
    

    【讨论】:

    • 谢谢,但这似乎是在尝试相同的来源 - 我从上面得到的输出是:Domain: (none)
    猜你喜欢
    • 2017-01-21
    • 2018-05-12
    • 1970-01-01
    • 2013-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-26
    • 1970-01-01
    相关资源
    最近更新 更多