亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? dns.c

?? NXPl788上lwip的無操作系統移植,基于Embest開發板
?? C
?? 第 1 頁 / 共 3 頁
字號:
      pEntry->tmr     = 1;
      pEntry->retries = 0;
      
      /* send DNS packet for this entry */
      err = dns_send(pEntry->numdns, pEntry->name, i);
      if (err != ERR_OK) {
        LWIP_DEBUGF(DNS_DEBUG | LWIP_DBG_LEVEL_WARNING,
                    ("dns_send returned error: %s\n", lwip_strerr(err)));
      }
      break;
    }

    case DNS_STATE_ASKING: {
      if (--pEntry->tmr == 0) {
        if (++pEntry->retries == DNS_MAX_RETRIES) {
          if ((pEntry->numdns+1<DNS_MAX_SERVERS) && !ip_addr_isany(&dns_servers[pEntry->numdns+1])) {
            /* change of server */
            pEntry->numdns++;
            pEntry->tmr     = 1;
            pEntry->retries = 0;
            break;
          } else {
            LWIP_DEBUGF(DNS_DEBUG, ("dns_check_entry: \"%s\": timeout\n", pEntry->name));
            /* call specified callback function if provided */
            if (pEntry->found)
              (*pEntry->found)(pEntry->name, NULL, pEntry->arg);
            /* flush this entry */
            pEntry->state   = DNS_STATE_UNUSED;
            pEntry->found   = NULL;
            break;
          }
        }

        /* wait longer for the next retry */
        pEntry->tmr = pEntry->retries;

        /* send DNS packet for this entry */
        err = dns_send(pEntry->numdns, pEntry->name, i);
        if (err != ERR_OK) {
          LWIP_DEBUGF(DNS_DEBUG | LWIP_DBG_LEVEL_WARNING,
                      ("dns_send returned error: %s\n", lwip_strerr(err)));
        }
      }
      break;
    }

    case DNS_STATE_DONE: {
      /* if the time to live is nul */
      if (--pEntry->ttl == 0) {
        LWIP_DEBUGF(DNS_DEBUG, ("dns_check_entry: \"%s\": flush\n", pEntry->name));
        /* flush this entry */
        pEntry->state = DNS_STATE_UNUSED;
        pEntry->found = NULL;
      }
      break;
    }
    case DNS_STATE_UNUSED:
      /* nothing to do */
      break;
    default:
      LWIP_ASSERT("unknown dns_table entry state:", 0);
      break;
  }
}

/**
 * Call dns_check_entry for each entry in dns_table - check all entries.
 */
static void
dns_check_entries(void)
{
  u8_t i;

  for (i = 0; i < DNS_TABLE_SIZE; ++i) {
    dns_check_entry(i);
  }
}

/**
 * Receive input function for DNS response packets arriving for the dns UDP pcb.
 *
 * @params see udp.h
 */
static void
dns_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *addr, u16_t port)
{
  u16_t i;
  char *pHostname;
  struct dns_hdr *hdr;
  struct dns_answer ans;
  struct dns_table_entry *pEntry;
  u16_t nquestions, nanswers;

  LWIP_UNUSED_ARG(arg);
  LWIP_UNUSED_ARG(pcb);
  LWIP_UNUSED_ARG(addr);
  LWIP_UNUSED_ARG(port);

  /* is the dns message too big ? */
  if (p->tot_len > DNS_MSG_SIZE) {
    LWIP_DEBUGF(DNS_DEBUG, ("dns_recv: pbuf too big\n"));
    /* free pbuf and return */
    goto memerr;
  }

  /* is the dns message big enough ? */
  if (p->tot_len < (SIZEOF_DNS_HDR + SIZEOF_DNS_QUERY + SIZEOF_DNS_ANSWER)) {
    LWIP_DEBUGF(DNS_DEBUG, ("dns_recv: pbuf too small\n"));
    /* free pbuf and return */
    goto memerr;
  }

  /* copy dns payload inside static buffer for processing */ 
  if (pbuf_copy_partial(p, dns_payload, p->tot_len, 0) == p->tot_len) {
    /* The ID in the DNS header should be our entry into the name table. */
    hdr = (struct dns_hdr*)dns_payload;
    i = htons(hdr->id);
    if (i < DNS_TABLE_SIZE) {
      pEntry = &dns_table[i];
      if(pEntry->state == DNS_STATE_ASKING) {
        /* This entry is now completed. */
        pEntry->state = DNS_STATE_DONE;
        pEntry->err   = hdr->flags2 & DNS_FLAG2_ERR_MASK;

        /* We only care about the question(s) and the answers. The authrr
           and the extrarr are simply discarded. */
        nquestions = htons(hdr->numquestions);
        nanswers   = htons(hdr->numanswers);

        /* Check for error. If so, call callback to inform. */
        if (((hdr->flags1 & DNS_FLAG1_RESPONSE) == 0) || (pEntry->err != 0) || (nquestions != 1)) {
          LWIP_DEBUGF(DNS_DEBUG, ("dns_recv: \"%s\": error in flags\n", pEntry->name));
          /* call callback to indicate error, clean up memory and return */
          goto responseerr;
        }

#if DNS_DOES_NAME_CHECK
        /* Check if the name in the "question" part match with the name in the entry. */
        if (dns_compare_name((unsigned char *)(pEntry->name), (unsigned char *)dns_payload + SIZEOF_DNS_HDR) != 0) {
          LWIP_DEBUGF(DNS_DEBUG, ("dns_recv: \"%s\": response not match to query\n", pEntry->name));
          /* call callback to indicate error, clean up memory and return */
          goto responseerr;
        }
#endif /* DNS_DOES_NAME_CHECK */

        /* Skip the name in the "question" part */
        pHostname = (char *) dns_parse_name((unsigned char *)dns_payload + SIZEOF_DNS_HDR) + SIZEOF_DNS_QUERY;

        while (nanswers > 0) {
          /* skip answer resource record's host name */
          pHostname = (char *) dns_parse_name((unsigned char *)pHostname);

          /* Check for IP address type and Internet class. Others are discarded. */
          SMEMCPY(&ans, pHostname, SIZEOF_DNS_ANSWER);
          if((ans.type == PP_HTONS(DNS_RRTYPE_A)) && (ans.cls == PP_HTONS(DNS_RRCLASS_IN)) &&
             (ans.len == PP_HTONS(sizeof(ip_addr_t))) ) {
            /* read the answer resource record's TTL, and maximize it if needed */
            pEntry->ttl = ntohl(ans.ttl);
            if (pEntry->ttl > DNS_MAX_TTL) {
              pEntry->ttl = DNS_MAX_TTL;
            }
            /* read the IP address after answer resource record's header */
            SMEMCPY(&(pEntry->ipaddr), (pHostname+SIZEOF_DNS_ANSWER), sizeof(ip_addr_t));
            LWIP_DEBUGF(DNS_DEBUG, ("dns_recv: \"%s\": response = ", pEntry->name));
            ip_addr_debug_print(DNS_DEBUG, (&(pEntry->ipaddr)));
            LWIP_DEBUGF(DNS_DEBUG, ("\n"));
            /* call specified callback function if provided */
            if (pEntry->found) {
              (*pEntry->found)(pEntry->name, &pEntry->ipaddr, pEntry->arg);
            }
            /* deallocate memory and return */
            goto memerr;
          } else {
            pHostname = pHostname + SIZEOF_DNS_ANSWER + htons(ans.len);
          }
          --nanswers;
        }
        LWIP_DEBUGF(DNS_DEBUG, ("dns_recv: \"%s\": error in response\n", pEntry->name));
        /* call callback to indicate error, clean up memory and return */
        goto responseerr;
      }
    }
  }

  /* deallocate memory and return */
  goto memerr;

responseerr:
  /* ERROR: call specified callback function with NULL as name to indicate an error */
  if (pEntry->found) {
    (*pEntry->found)(pEntry->name, NULL, pEntry->arg);
  }
  /* flush this entry */
  pEntry->state = DNS_STATE_UNUSED;
  pEntry->found = NULL;

memerr:
  /* free pbuf */
  pbuf_free(p);
  return;
}

/**
 * Queues a new hostname to resolve and sends out a DNS query for that hostname
 *
 * @param name the hostname that is to be queried
 * @param found a callback founction to be called on success, failure or timeout
 * @param callback_arg argument to pass to the callback function
 * @return @return a err_t return code.
 */
static err_t
dns_enqueue(const char *name, dns_found_callback found, void *callback_arg)
{
  u8_t i;
  u8_t lseq, lseqi;
  struct dns_table_entry *pEntry = NULL;
  size_t namelen;

  /* search an unused entry, or the oldest one */
  lseq = lseqi = 0;
  for (i = 0; i < DNS_TABLE_SIZE; ++i) {
    pEntry = &dns_table[i];
    /* is it an unused entry ? */
    if (pEntry->state == DNS_STATE_UNUSED)
      break;

    /* check if this is the oldest completed entry */
    if (pEntry->state == DNS_STATE_DONE) {
      if ((dns_seqno - pEntry->seqno) > lseq) {
        lseq = dns_seqno - pEntry->seqno;
        lseqi = i;
      }
    }
  }

  /* if we don't have found an unused entry, use the oldest completed one */
  if (i == DNS_TABLE_SIZE) {
    if ((lseqi >= DNS_TABLE_SIZE) || (dns_table[lseqi].state != DNS_STATE_DONE)) {
      /* no entry can't be used now, table is full */
      LWIP_DEBUGF(DNS_DEBUG, ("dns_enqueue: \"%s\": DNS entries table is full\n", name));
      return ERR_MEM;
    } else {
      /* use the oldest completed one */
      i = lseqi;
      pEntry = &dns_table[i];
    }
  }

  /* use this entry */
  LWIP_DEBUGF(DNS_DEBUG, ("dns_enqueue: \"%s\": use DNS entry %"U16_F"\n", name, (u16_t)(i)));

  /* fill the entry */
  pEntry->state = DNS_STATE_NEW;
  pEntry->seqno = dns_seqno++;
  pEntry->found = found;
  pEntry->arg   = callback_arg;
  namelen = LWIP_MIN(strlen(name), DNS_MAX_NAME_LENGTH-1);
  MEMCPY(pEntry->name, name, namelen);
  pEntry->name[namelen] = 0;

  /* force to send query without waiting timer */
  dns_check_entry(i);

  /* dns query is enqueued */
  return ERR_INPROGRESS;
}

/**
 * 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.
 */
err_t
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);
}

#endif /* LWIP_DNS */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
heyzo一本久久综合| 欧美天堂一区二区三区| 亚洲成av人片www| 欧美国产亚洲另类动漫| 欧美一区二区三区啪啪| 色婷婷av一区| 国产不卡高清在线观看视频| 日韩不卡一二三区| 一区二区三区波多野结衣在线观看| 国产乱码精品一区二区三| 天天做天天摸天天爽国产一区| 国产精品久久网站| 精品国产一区二区三区av性色| 欧美日本免费一区二区三区| 色伊人久久综合中文字幕| 国产1区2区3区精品美女| 青青草视频一区| 亚洲成人av一区| 亚洲免费观看高清完整版在线观看熊| 久久色视频免费观看| 日韩一区二区三区视频在线观看| 在线观看一区不卡| 色噜噜夜夜夜综合网| 高清在线不卡av| 国产精品乡下勾搭老头1| 免播放器亚洲一区| 日韩综合在线视频| 日韩黄色免费电影| 午夜视频在线观看一区二区| 亚洲国产中文字幕| 亚洲自拍偷拍欧美| 亚洲一二三区在线观看| 亚洲在线观看免费视频| 亚洲国产综合人成综合网站| 麻豆精品视频在线观看免费| 亚洲第一成年网| 亚洲午夜精品17c| 午夜视频在线观看一区二区| 亚洲美女视频一区| 悠悠色在线精品| 亚洲最新在线观看| 亚洲成人7777| 免费观看成人av| 激情综合色播五月| 国模一区二区三区白浆| 国内精品国产成人| 国产麻豆视频一区二区| 成人精品高清在线| 91无套直看片红桃| 欧美自拍偷拍一区| 911精品国产一区二区在线| 欧美一区二区日韩一区二区| 日韩欧美国产综合| 欧美极品另类videosde| 亚洲精品视频在线观看网站| 亚洲一区二区三区中文字幕在线| 亚洲成人tv网| 久久99久久99| 高清在线成人网| 欧美在线制服丝袜| 91精品国产综合久久香蕉麻豆| 日韩欧美一区在线观看| 国产亚洲午夜高清国产拍精品| 国产精品区一区二区三区| 亚洲精选一二三| 日本欧美韩国一区三区| 国产精品456露脸| 97se亚洲国产综合自在线| 欧洲一区在线观看| 精品少妇一区二区| 亚洲人成伊人成综合网小说| 日韩国产欧美在线观看| 国产福利一区二区三区视频| 91在线国产观看| 日韩一区二区三区电影在线观看| 国产欧美精品区一区二区三区 | 日韩一区二区免费高清| 久久只精品国产| 一区二区三区久久久| 美女看a上一区| 一本大道av伊人久久综合| 欧美福利视频一区| 国产欧美日韩麻豆91| 亚洲一区二区三区四区在线| 国产真实乱偷精品视频免| 91麻豆免费看片| 337p亚洲精品色噜噜噜| 国产精品久久久久久久久搜平片| 午夜伊人狠狠久久| 不卡在线视频中文字幕| 欧美一区二区三区电影| 国产精品三级视频| 青娱乐精品视频在线| 99国产一区二区三精品乱码| 日韩欧美国产wwwww| 亚洲综合图片区| 成人伦理片在线| 欧美一卡在线观看| 亚洲精品国产视频| 成人深夜在线观看| 欧美不卡视频一区| 香港成人在线视频| 一本到三区不卡视频| 国产欧美一区二区三区在线老狼| 午夜精彩视频在线观看不卡| 91年精品国产| 国产欧美精品一区二区色综合| 蜜桃视频免费观看一区| 精品视频在线免费| 亚洲女人小视频在线观看| 粉嫩高潮美女一区二区三区| 精品国产免费一区二区三区香蕉 | 极品少妇一区二区三区精品视频| 在线欧美日韩国产| 亚洲素人一区二区| 成人黄色软件下载| 国产拍欧美日韩视频二区| 蜜臀av性久久久久蜜臀aⅴ四虎| 欧美午夜精品久久久久久超碰 | 日韩一区在线播放| 国产成人精品在线看| 一区二区三区中文字幕电影| 成人三级在线视频| 精品久久久久久久久久久久久久久久久| 亚洲午夜久久久| 一本色道综合亚洲| 中文字幕一区二区三区在线观看| 国内精品免费在线观看| 久久网这里都是精品| 久久精品国产77777蜜臀| 欧美日韩一区二区欧美激情 | 亚洲美女淫视频| 色综合久久六月婷婷中文字幕| 国产精品国产成人国产三级 | 久久蜜臀中文字幕| 国产一区二区0| 国产欧美日韩精品在线| 盗摄精品av一区二区三区| 国产精品激情偷乱一区二区∴| 成人黄页在线观看| 亚洲欧美另类久久久精品 | 91麻豆高清视频| 一区二区免费在线播放| 欧美日韩久久不卡| 日本欧美在线看| 亚洲精品一区二区三区蜜桃下载| 国产在线播精品第三| 国产精品久久久一本精品 | 欧美性猛交一区二区三区精品| 亚洲小少妇裸体bbw| 欧美一区二区三区在线观看| 老司机精品视频线观看86 | 日本女人一区二区三区| 精品国产乱码久久久久久久| 国产麻豆精品视频| 亚洲色欲色欲www| 欧美三级电影在线看| 午夜精品久久久久久久99水蜜桃| 在线播放欧美女士性生活| 久久国产视频网| 国产精品丝袜在线| 欧美日韩一区二区在线视频| 麻豆91在线播放| 久久久美女艺术照精彩视频福利播放| 国产精品综合久久| 亚洲欧洲精品天堂一级 | 国产91精品一区二区| 亚洲男人电影天堂| 欧美大片免费久久精品三p| 国产成人av一区二区三区在线观看| ㊣最新国产の精品bt伙计久久| 欧美色综合网站| 韩国三级中文字幕hd久久精品| 国产精品二三区| 7777精品久久久大香线蕉| 色哦色哦哦色天天综合| 午夜精品福利一区二区蜜股av | 亚洲精品一区二区三区精华液| 国产不卡一区视频| 日韩电影在线一区二区| 国产精品网曝门| 欧美另类变人与禽xxxxx| 国产成人免费在线| 午夜电影网一区| 成人欧美一区二区三区黑人麻豆| 欧美日韩电影在线播放| 成人av在线看| 久久99国产乱子伦精品免费| 一区二区三区四区在线播放 | 午夜精品久久久久久久| 国产精品午夜免费| 日韩女优av电影| 91免费观看国产| 国产美女精品一区二区三区| 亚洲高清在线精品| 国产精品美女久久久久久久久| 欧美电影一区二区| 91视视频在线直接观看在线看网页在线看| 日韩国产欧美一区二区三区| 依依成人精品视频|