打印
[应用相关]

lwip中使用DNS的问题

[复制链接]
5345|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wlawei|  楼主 | 2016-3-21 09:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
刚开始学STM32(stm32f407)和lwip,感觉各种头大,感觉回调函数没有被执行,先贴代码

void MyDNS(void)
{
        char hostname[]="www.baidu.com";//需要解析的域名
        ip_addr_t *addr;                   //记录IP地址
        printf("hostname is %s\r\n",hostname);//在串口打印要解析的域名
        dns_gethostbyname(hostname,addr,my_found,NULL);//开始解析
        printf("dns is over\r\n");//在串口打印解析函数是否完成
}


两个打印函数在串口中都正常输出,说明dns_gethostbyname函数执行,但是在回调函数my_found中没有执行打印输出。my_found代码:
static void my_found(const char *name, ip_addr_t *ipaddr, void *arg)
{
        u8_t ip[4];
        myIP = *ipaddr;//保存IP
        printf("callback program is running\r\n");
        //分解IP
        ip[0] = myIP.addr>>24;
        ip[1] = myIP.addr>>16;
        ip[2] = myIP.addr>>8;
        ip[3] = myIP.addr;
        printf("%d.%d.%d.%d\r\n",ip[3], ip[2], ip[1], ip[0]); //打印IP
        printf("call back is running\r\n");
}

dns_gethostbyname函数在dns.c中定义,原函数代码如下:
dns_gethostbyname(const char *hostname, ip_addr_t *addr, dns_found_callback found,
                  void *callback_arg)
{
  u32_t ipaddr;
  /* not initialized or no valid server yet, or invalid addr pointer
   * or invalid hostname or invalid hostname length */
  if ((dns_pcb == NULL) || (addr == NULL) ||
      (!hostname) || (!hostname[0]) ||
      (strlen(hostname) >= DNS_MAX_NAME_LENGTH)) {
    return ERR_ARG;
  }

#if LWIP_HAVE_LOOPIF
  if (strcmp(hostname, "localhost")==0) {
    ip_addr_set_loopback(addr);
    return ERR_OK;
  }
#endif /* LWIP_HAVE_LOOPIF */

  /* host name already in octet notation? set ip addr and return ERR_OK */
  ipaddr = ipaddr_addr(hostname);
  if (ipaddr == IPADDR_NONE) {
    /* already have this address cached? */
    ipaddr = dns_lookup(hostname);
  }
  if (ipaddr != IPADDR_NONE) {
    ip4_addr_set_u32(addr, ipaddr);
    return ERR_OK;
  }

  /* queue query with specified callback */
  return dns_enqueue(hostname, found, callback_arg);
}

我想确定的是:
1、我的回调函数写的是否正确?
2、ip_addr_t *addr;                   //记录IP地址,这条代码,有的程序写成ip_addr_t addr;代码也能够正常编译,但是,我这样写的话,编译器报错,同一个编译器,他那样写就能够打印IP(但是打印的IP不正确),我这样写就报错,都是在lwip环境下。
3、如果有高手能给分析一下有什么问题,那最好了
沙发
DreamofOven| | 2016-3-21 20:18 | 只看该作者
你可以加个串口调试的时候打印出相关信息不就知道程序运行到什么地方了吗

使用特权

评论回复
板凳
wlawei|  楼主 | 2016-3-22 09:02 | 只看该作者
DreamofOven 发表于 2016-3-21 20:18
你可以加个串口调试的时候打印出相关信息不就知道程序运行到什么地方了吗 ...

谢,当时串口调试信息直接不打印,也就是没有调用回调函数,后来我找到了问题,使用DNS需要在协议栈初始化时,保证dns_init被调用,同时dns_tmr被周期性调用,我没有周期性调用dns_tmr,所以导致回调函数不能调用

使用特权

评论回复
地板
598330983| | 2016-3-22 13:41 | 只看该作者
DNS,这个域名解析。我通常是直接使用4个8.

使用特权

评论回复
5
w_u123| | 2016-3-22 15:06 | 只看该作者
不是那个编译开关一打开,那个DNS_tmr也会跟着一起初始化吗

使用特权

评论回复
6
wlawei|  楼主 | 2016-3-24 15:45 | 只看该作者
598330983 发表于 2016-3-22 13:41
DNS,这个域名解析。我通常是直接使用4个8.

我是要解析出来域名地址,然后,通过IP地址get后POST数据的,我估计用4个8可能不行的

使用特权

评论回复
7
wlawei|  楼主 | 2016-3-24 15:58 | 只看该作者
w_u123 发表于 2016-3-22 15:06
不是那个编译开关一打开,那个DNS_tmr也会跟着一起初始化吗

我的加上这么一段程序就可以正常工作了,原理不是很清楚,我也是刚开始摸索LWIP
#if LWIP_DNS
  if (LWipTime - DNSTimer >= 1000)
  {
                DNSTimer =  LWipTime;
                dns_tmr();
  }
#endif

使用特权

评论回复
8
wlawei|  楼主 | 2016-3-24 21:37 | 只看该作者
wlawei 发表于 2016-3-24 15:58
我的加上这么一段程序就可以正常工作了,原理不是很清楚,我也是刚开始摸索LWIP
#if LWIP_DNS
  if (LWip ...

刚看到教程中说这是轮询

使用特权

评论回复
9
598330983| | 2016-4-4 22:04 | 只看该作者
楼上你的专利不错啊,是独一无二的那种吗

使用特权

评论回复
10
wlawei|  楼主 | 2016-4-23 21:09 | 只看该作者
598330983 发表于 2016-4-4 22:04
楼上你的专利不错啊,是独一无二的那种吗

你说的我的专利吗?

使用特权

评论回复
11
天灵灵地灵灵| | 2016-4-24 10:41 | 只看该作者
对于udp数据的接收位于
tcpip_init
==> lwip_init       // 初始化lwip用到的所有结构,变量等[luther.gliethttp]
==> tcpip_thread    // 创建网络数据处理线程,用来处理如下几个ip报头中包含的协议
==*> ip_input ==> udp_input(p, inp);    // udp报文
==*> ip_input ==> tcp_input(p, inp);    // tcp报文
==*> ip_input ==> icmp_input(p, inp);   //icmp报文
==*> ip_input ==> igmp_input(p,inp,&(iphdr->dest)); // igmp报文

tcpip_init
==> lwip_init
==*> sys_init
/**
* Perform Sanity check of user-configurable values, and initialize all modules.
*/
void
lwip_init(void)
{
  /* Sanity check user-configurable values */
  lwip_sanity_check();

  /* Modules initialization */
  stats_init();
  sys_init();
  mem_init();
  memp_init();
  pbuf_init();
  netif_init();
#if LWIP_SOCKET
  lwip_socket_init();
#endif /* LWIP_SOCKET */
  ip_init();
#if LWIP_ARP
  etharp_init();
#endif /* LWIP_ARP */
#if LWIP_RAW
  raw_init();
#endif /* LWIP_RAW */
#if LWIP_UDP
  udp_init();
#endif /* LWIP_UDP */
#if LWIP_TCP
  tcp_init();
#endif /* LWIP_TCP */
#if LWIP_SNMP
  snmp_init();
#endif /* LWIP_SNMP */
#if LWIP_AUTOIP
  autoip_init();
#endif /* LWIP_AUTOIP */
#if LWIP_IGMP
  igmp_init();
#endif /* LWIP_IGMP */
#if LWIP_DNS
  dns_init();
#endif /* LWIP_DNS */
}

使用特权

评论回复
12
598330983| | 2016-4-24 11:03 | 只看该作者
不小心看到你在卖各种专利,不知道这个赚钱不

使用特权

评论回复
13
598330983| | 2016-4-24 22:51 | 只看该作者
wlawei 发表于 2016-4-24 16:20
没有卖啊,当时自己做的东西

哈哈,我就看你签名里那个网址里写的。

使用特权

评论回复
14
wlawei|  楼主 | 2016-4-25 08:33 | 只看该作者
598330983 发表于 2016-4-24 22:51
哈哈,我就看你签名里那个网址里写的。

以前给企业做的个东西,开始说要专利,后来有说不要了,然后就挂到网站上,看看能不能转出去,没有专门搞这个

使用特权

评论回复
15
598330983| | 2016-4-28 19:46 | 只看该作者
lwip现在越来越多的厂家支持了。

使用特权

评论回复
16
丛龙强| | 2017-3-21 17:12 | 只看该作者
wlawei 发表于 2016-3-24 15:58
我的加上这么一段程序就可以正常工作了,原理不是很清楚,我也是刚开始摸索LWIP
#if LWIP_DNS
  if (LWip ...

你好,这个轮询是在哪个地方添加的,是调用的地方吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:个人网站 http://www.wlweb.org/

14

主题

79

帖子

0

粉丝