fenglove 发表于 2016-12-16 11:38:22

域名解析失败

各位好,最近测试RT-THREAD 以太网通信部分,
硬件部分STM32F107+LAN8720
OS版本:2.1.0
LWIP是默认的1.4.1,
现在以太网部分通讯没有问题,但是因为提交数据的时候需要提交到外部服务器,需要按照HTTP POST方式提交数据
设备IP能够正常上网,
牵扯到DNS域名解析,gethostbyname经常返回失败,请问下这个需要去那部分找原因?

javenreal 发表于 2016-12-16 11:48:33

gethostbyname,通常不会立刻返回结果的,要用异步调用的方式。 让它去解析,解析成功后调用你的回调函数。如果失败,你可以让它再次解析。

aozima 发表于 2016-12-16 12:49:21

finsh>>list_if()

看下你的DNS地址是多少?
如果是固定IP,LWIP默认的DNS是opendns,是国外的,在国内经常出问题。最好修改为为国内常用的,如114DNS或阿里DNS。

或DHCP由路由分配的。

fenglove 发表于 2016-12-16 14:15:27

我自己设置了一个DNS服务器,是从路由器获得之后读取的,默认的是第一个,这样设置两个会有问题吗?
dns server #0: 208.67.222.222
dns server #1: 219.146.1.66

fenglove 发表于 2016-12-16 14:16:42

javenreal 发表于 2016-12-16 11:48
gethostbyname,通常不会立刻返回结果的,要用异步调用的方式。 让它去解析,解析成功后调用你的回调函数。 ...

哦,我就是先解析域名,解析成功就用返回的地址connect服务器,解析失败就之计退出,

javenreal 发表于 2016-12-16 14:30:02

fenglove 发表于 2016-12-16 14:16
哦,我就是先解析域名,解析成功就用返回的地址connect服务器,解析失败就之计退出, ...

dns_gethostbyname 会返回一个值,返回ERR_OK代表成功。

但是实际上除非这个域名之前就解析过,否则不可能立刻返回OK。

返回ERR_INPROGRESS并不代表错误,而是代表正在处理,等待服务器回复。

可以这样写:

        err = dns_gethostbyname(g_GprsCfg.RemoteAddr, &ip, dns_found, NULL);
        if(err == ERR_OK)
        {
                //立刻成功,这里将状态机设置为继续执行后续工作
        }
        else
        {
                //没有立刻成功,将状态机设置为等待状态,在dns_found回调函数中更新状态机
                set_state(DS_DNS_WAIT, 60);
        }

javenreal 发表于 2016-12-16 14:32:05

lwip的代码注释里面标注的还是很清楚的

/**
* Resolve a hostname (string) into an IP address.
* NON-BLOCKING callback version for use with raw API!!!
*
* Returns immediately with one of err_t return codes:
* - ERR_OK if hostname is a valid IP address string or the host
*   name is already in the local names table.
* - ERR_INPROGRESS enqueue a request to be sent to the DNS server
*   for resolution if no errors are present.
* - ERR_ARG: dns client not initialized or invalid hostname
*
* @param hostname the hostname that is to be queried
* @param addr pointer to a ip_addr_t where to store the address if it is already
*             cached in the dns_table (only valid if ERR_OK is returned!)
* @param found a callback function to be called on success, failure or timeout (only if
*            ERR_INPROGRESS is returned!)
* @param callback_arg argument to pass to the callback function
* @return a err_t return code.
*/

fenglove 发表于 2016-12-16 14:45:30

javenreal 发表于 2016-12-16 14:32
lwip的代码注释里面标注的还是很清楚的

/**


哦哦,好的,谢谢javenreal

aozima 发表于 2016-12-16 17:11:17

fenglove 发表于 2016-12-16 14:15
我自己设置了一个DNS服务器,是从路由器获得之后读取的,默认的是第一个,这样设置两个会有问题吗?
dns se ...

默认使用#0,建议修改为 114.114.114.114或 (223.5.5.5 / 223.6.6.6) http://alidns.com/

fenglove 发表于 2016-12-16 17:20:11

aozima 发表于 2016-12-16 17:11
默认使用#0,建议修改为 114.114.114.114或 (223.5.5.5 / 223.6.6.6) http://alidns.com/

好的。谢谢

flangerbox 发表于 2016-12-16 17:55:05

查一下路由器是否设置有问题。
页: [1]
查看完整版本: 域名解析失败