This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RTOS/TM4C129ENCPDT:获取 PPP 连接上的外部 DNS 服务器名称

Guru**** 2012440 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/580994/rtos-tm4c129encpdt-getting-external-dns-server-name-on-ppp-connection

器件型号:TM4C129ENCPDT

工具/软件:TI-RTOS

我想知道如何让 TIRTOS 从 PPP 连接到蜂窝调制解调器中获取外部 DNS 服务器名称。

在 PPP 会话建立时,我会自动获取 IP 地址,但我需要能够使用 getaddrinfo 或 DNDGetHostByName 来获取目标主机 IP,但 PPP 会话在默认情况下没有配置 DNS 服务器。

我希望能够获取建议的网络 DNS 服务器、而不仅仅是使用静态地址。

我在这里看到了几篇文章、其中提到需要手动获取服务器地址、但没有说明我如何实际执行此操作的示例。

我使用的是 tirtos_tivac_2_16_01_14

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Barry、

    您能为我澄清几点吗:

    • 在 PPP 会话建立时,我会自动获取 IP 地址

    哪个 IP 地址? 是什么?

    • 但我需要能够使用 getaddrinfo 或 DNDGetHostByName 来获取目标主机 IP,但默认情况下,PPP 会话没有配置 DNS 服务器。

    您正在调用 getaddrinfo 还是 DNSGetHostByName? 它们将返回错误?

    谢谢、
    Gerardo

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Gerardo

    我正在使用 getaddrinfo

    我通过代码进行搜索,发现 TIRTOS 中实现的 DHCP 不支持 DHCPPT_NAME_SERVERS,它为所有 DHCP 选项提供了标志,但只支持极少的这些选项。

    因此我现在知道我无法 通过 DHCP 自动设置 DNS 服务器 IP 地址

    我了解了如何在 设计时通过配置文件设置 DNS 服务器地址

    VAR DNS = xdc.useModule('ti.ndk.config.Dns');
    dns.externDnsServIp ="139.130.221.10";

    作为一项解决方案、我现在正在寻找的是如何在运行时更改外部 DNS 服务器 IP、因此我可以为我的代码提供多个可能使用的 DNS 服务器、以便在其中一个服务器不可用时进行调整。

    此致

    Barry

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我已经了解了如何在运行时设置/更改我的 DNS 服务器 IP 地址。

    下面是我实现这一目标的方法

    //================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    //设置 DNS 服务器 IP 地址
    //=================================================================================
    静态空 SetDNSServer (char * serverip)
    {
    charIPString[16];
    IPNipaddr;
    CI_IPNetCurrentAddr;
    handlehCfg;
    handlehCfgIpAddr;
    inti、 rc、size;
    
    hCfg = 0;
    //检查我们当前是否有 DNS 服务器项
    rc = CfgGetEntry (hCfg、CFGTAG _SYSINFO、CFGITEM_DHCP_DOMAINNAMESERVER、1、&hCfgIpAddr);
    if (RC > 0)
    {
    while (RC > 0)
    {
    size = sizeof (CurrentAddr);
    RC = CfgEntryGetData (hCfgIpAddr、&size、(uint8_t *)&CurrentAddr);
    
    NtIPN2Str( CurrentAddr.ipaddr,IPString );
    LogDiagMessage("COMs Remove DNS server Address '%s'"",IPString);//
    
    删除当前静态 IP 条目
    CfgIpeEntry (hCfg, hCfgAddr );RC=CfgGetIpEntry
    (0),hCfIpAddr
    }
    }
    
    //手动添加 DNS 服务器
    ipaddr = inet_addr (serverip);
    if (ipaddr)
    {
    hCfg = 0;
    CfgAddEntry (hCfg、CFGTAG _SYSINFO、CFGITEM_DHCP_DOMAINNAMESERVER、0、 sizeof (ipaddr)、(uint8 *)&ipaddr、0);
    LogDiagMessage ("COMS Set DNS Server ='%s'、serverip");
    }
    
    for (i=1;;i++)
    {
    hCfg = 0;
    //尝试获取 DNS 服务器
    RC = CfgGetImmadi( hCfg、CFGTAG _SYSINFO、CFGITEM_DHCP_DOMAINNAMESERVER、I、4、 (uint8 *) ipaddr (&ipaddr);
    如果(RC!= 4)
    中断;
    
    //我们得到了一些东西
    //将 IP 转换为字符串:
    NtIPN2Str( ipaddr,IPString );
    LogDiagMessage ("COMS DNS Server %d ='%s'、I、IPString);
    }
    //SetDNSServer
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    只是对这一问题采取后续行动。
    我检查了 NDK 代码、它检查多达4个外部 DNS 服务器地址。
    因此、可以将多达4个外部 DNS 服务器 IP 地址添加到配置中、DNSResolveExternal 函数将依次对每个地址进行3次尝试、直到找到响应的地址或它们全部失败。