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

? 歡迎來(lái)到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? dns.c

?? 在luminary平臺(tái)下移植lwip到freertos,集成開發(fā)環(huán)境KEIL
?? C
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
  err_t err;
  struct dns_hdr *hdr;
  struct dns_query qry;
  struct pbuf *p;
  char *query, *nptr;
  const char *pHostname;
  u8_t n;

  LWIP_DEBUGF(DNS_DEBUG, ("dns_send: dns_servers[%"U16_F"] \"%s\": request\n",
              (u16_t)(numdns), name));
  LWIP_ASSERT("dns server out of array", numdns < DNS_MAX_SERVERS);
  LWIP_ASSERT("dns server has no IP address set", dns_servers[numdns].addr != 0);

  /* if here, we have either a new query or a retry on a previous query to process */
  p = pbuf_alloc(PBUF_TRANSPORT, sizeof(struct dns_hdr) + DNS_MAX_NAME_LENGTH +
                 sizeof(struct dns_query), PBUF_RAM);
  if (p != NULL) {
    LWIP_ASSERT("pbuf must be in one piece", p->next == NULL);
    /* fill dns header */
    hdr = (struct dns_hdr*)p->payload;
    memset(hdr, 0, sizeof(struct dns_hdr));
    hdr->id = htons(id);
    hdr->flags1 = DNS_FLAG1_RD;
    hdr->numquestions = htons(1);
    query = (char*)hdr + sizeof(struct dns_hdr);
    pHostname = name;
    --pHostname;

    /* convert hostname into suitable query format. */
    do {
      ++pHostname;
      nptr = query;
      ++query;
      for(n = 0; *pHostname != '.' && *pHostname != 0; ++pHostname) {
        *query = *pHostname;
        ++query;
        ++n;
      }
      *nptr = n;
    } while(*pHostname != 0);
    *query++='\0';

    /* fill dns query */
    qry.type  = htons(DNS_RRTYPE_A);
    qry.class = htons(DNS_RRCLASS_IN);
    MEMCPY( query, &qry, sizeof(struct dns_query));

    /* resize pbuf to the exact dns query */
    pbuf_realloc(p, (query + sizeof(struct dns_query)) - ((char*)(p->payload)));

    /* connect to the server for faster receiving */
    udp_connect(dns_pcb, &dns_servers[numdns], DNS_SERVER_PORT);
    /* send dns packet */
    err = udp_sendto(dns_pcb, p, &dns_servers[numdns], DNS_SERVER_PORT);

    /* free pbuf */
    pbuf_free(p);
  } else {
    err = ERR_MEM;
  }

  return err;
}

/**
 * dns_check_entry() - see if pEntry has not yet been queried and, if so, sends out a query.
 * Check an entry in the dns_table:
 * - send out query for new entries
 * - retry old pending entries on timeout (also with different servers)
 * - remove completed entries from the table if their TTL has expired
 *
 * @param i index of the dns_table entry to check
 */
static void
dns_check_entry(u8_t i)
{
  struct dns_table_entry *pEntry = &dns_table[i];

  LWIP_ASSERT("array index out of bounds", i < DNS_TABLE_SIZE);

  switch(pEntry->state) {

    case DNS_STATE_NEW: {
      /* initialize new entry */
      pEntry->state   = DNS_STATE_ASKING;
      pEntry->numdns  = 0;
      pEntry->tmr     = 1;
      pEntry->retries = 0;
      
      /* send DNS packet for this entry */
      dns_send(pEntry->numdns, pEntry->name, i);
      break;
    }

    case DNS_STATE_ASKING: {
      if (--pEntry->tmr == 0) {
        if (++pEntry->retries == DNS_MAX_RETRIES) {
          if ((pEntry->numdns+1<DNS_MAX_SERVERS) && (dns_servers[pEntry->numdns+1].addr!=0)) {
            /* 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 */
        dns_send(pEntry->numdns, pEntry->name, i);
      }
      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, struct ip_addr *addr, u16_t port)
{
  u8_t i;
  char *pHostname;
  struct dns_hdr *hdr;
  struct dns_answer ans;
  struct dns_table_entry *pEntry;
  u8_t nquestions, nanswers;
#if (DNS_USES_STATIC_BUF == 0)
  u8_t dns_payload[DNS_MSG_SIZE];
#endif /* (DNS_USES_STATIC_BUF == 0) */
#if (DNS_USES_STATIC_BUF == 2)
  u8_t* dns_payload;
#endif /* (DNS_USES_STATIC_BUF == 2) */

  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 memerr1;
  }

  /* is the dns message big enough ? */
  if (p->tot_len < (sizeof(struct dns_hdr) + sizeof(struct dns_query) + sizeof(struct dns_answer))) {
    LWIP_DEBUGF(DNS_DEBUG, ("dns_recv: pbuf too small\n"));
    /* free pbuf and return */
    goto memerr1;
  }

#if (DNS_USES_STATIC_BUF == 2)
  dns_payload = mem_malloc(p->tot_len);
  if (dns_payload == NULL) {
    LWIP_DEBUGF(DNS_DEBUG, ("dns_recv: mem_malloc error\n"));
    /* free pbuf and return */
    goto memerr1;
  }
#endif /* (DNS_USES_STATIC_BUF == 2) */

  /* 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(struct 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(struct dns_hdr)) + sizeof(struct 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. */
          MEMCPY(&ans, pHostname, sizeof(struct dns_answer));
          if((ntohs(ans.type) == DNS_RRTYPE_A) && (ntohs(ans.class) == DNS_RRCLASS_IN) && (ntohs(ans.len) == sizeof(struct ip_addr)) ) {
            /* 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 */
            MEMCPY( &(pEntry->ipaddr), (pHostname+sizeof(struct dns_answer)), sizeof(struct ip_addr));
            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 memerr2;
          } else {
            pHostname = pHostname + sizeof(struct 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 memerr2;

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;

memerr2:
#if (DNS_USES_STATIC_BUF == 2)
  /* free dns buffer */
  mem_free(dns_payload);
#endif /* (DNS_USES_STATIC_BUF == 2) */

memerr1:
  /* 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;

  /* 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;
  strcpy(pEntry->name, name);

  /* 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.
 *
 * @param hostname the hostname that is to be queried
 * @param addr pointer to a struct ip_addr 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, struct ip_addr *addr, dns_found_callback found,
                  void *callback_arg)
{
  /* 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_VAL;
  }

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

  /* host name already in octet notation? set ip addr and return ERR_OK
   * already have this address cached? */
  if (((addr->addr = inet_addr(hostname)) != INADDR_NONE) ||
      ((addr->addr = dns_lookup(hostname)) != 0)) {
    return ERR_OK;
  }

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

#endif /* LWIP_DNS */

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩国产系列| 欧美丝袜丝交足nylons| 亚洲精品视频在线| 91精品国产综合久久精品app| 日韩电影在线一区二区三区| 国产日本亚洲高清| 欧美一级淫片007| 欧美精品乱码久久久久久按摩 | 不卡一区二区三区四区| 午夜精品久久久久久久99樱桃| 国产精品网站在线播放| 精品日韩一区二区三区| 91麻豆产精品久久久久久| 国产麻豆视频精品| 卡一卡二国产精品| 午夜亚洲福利老司机| 日韩国产欧美一区二区三区| 日韩av在线播放中文字幕| 美女视频黄 久久| 一区二区三区不卡视频在线观看| 中文av字幕一区| 亚洲私人黄色宅男| 国产精品伦理一区二区| 亚洲欧美日韩在线播放| 成人欧美一区二区三区白人| 中文字幕国产一区二区| 久久久久久久久久久久电影| 精品国精品国产| 精品欧美乱码久久久久久1区2区| 久久美女高清视频| 亚洲色图视频免费播放| 午夜精品成人在线视频| 国内久久婷婷综合| 国产在线视视频有精品| 成人av网在线| 欧美日韩精品欧美日韩精品一| 日韩欧美国产成人一区二区| 日韩欧美国产不卡| 中文一区一区三区高中清不卡| 亚洲免费三区一区二区| 美女一区二区三区| 成人免费看片app下载| 成人短视频下载| 欧美系列一区二区| 26uuuu精品一区二区| 久久这里只精品最新地址| 自拍偷拍欧美激情| 男女男精品视频| 国产精品中文字幕一区二区三区| 国产一区二区按摩在线观看| 色偷偷88欧美精品久久久| 欧美视频在线观看一区二区| 欧美成人乱码一区二区三区| 中文字幕在线观看一区| 日韩av一二三| av爱爱亚洲一区| 日本道精品一区二区三区| 91久久精品一区二区二区| 精品国产乱码久久久久久牛牛| 日韩理论在线观看| 久久国产尿小便嘘嘘尿| 91精品福利在线| 国产亚洲午夜高清国产拍精品 | 国产精品美女久久福利网站| 亚洲电影中文字幕在线观看| 青青草伊人久久| 99久久国产免费看| 欧美高清激情brazzers| 中文字幕一区二区三区在线播放| 免费一级欧美片在线观看| 91美女片黄在线观看91美女| 精品国产91久久久久久久妲己| 一区二区三区视频在线观看| 国产高清视频一区| 91黄视频在线观看| 国产午夜精品理论片a级大结局 | 狠狠色狠狠色综合| 欧美一区二区在线播放| 亚洲一区二区三区视频在线播放| 蜜桃91丨九色丨蝌蚪91桃色| 欧美三级电影网站| 欧美精品一区二区三区在线播放 | 亚洲欧美欧美一区二区三区| 国产精品夜夜嗨| 精品日韩在线观看| 蜜桃av一区二区在线观看| 欧美美女直播网站| 一区二区三区四区激情| 91毛片在线观看| 国产精品国产三级国产aⅴ入口| 亚瑟在线精品视频| 国产成人av电影免费在线观看| 91久久久免费一区二区| 亚洲欧洲成人自拍| av在线播放成人| 亚洲国产激情av| 成人av综合一区| 国产欧美精品国产国产专区 | 91在线国内视频| 亚洲国产岛国毛片在线| 国产伦精品一区二区三区免费迷| 日韩欧美国产午夜精品| 麻豆精品国产传媒mv男同| 91精品国产一区二区三区香蕉| 午夜精品123| 91麻豆精品91久久久久同性| 视频一区二区中文字幕| 99re成人在线| 1区2区3区国产精品| 97se亚洲国产综合自在线| 日韩伦理av电影| 欧美性大战久久久久久久蜜臀| 一区二区三区视频在线看| 欧美日韩精品专区| 日韩 欧美一区二区三区| 日韩三级免费观看| 亚洲午夜精品17c| 欧美日韩一区成人| 日韩成人av影视| 欧美精品一区二区三区一线天视频| 久久精品久久99精品久久| 26uuu亚洲| 岛国精品在线观看| 亚洲天堂免费看| 欧美日韩国产小视频在线观看| 日韩精品一二三四| 精品国产区一区| av一区二区三区在线| 一区二区三区欧美久久| 欧美一区二区三区在线看| 国产一二精品视频| 亚洲人成精品久久久久| 欧美区视频在线观看| 国模冰冰炮一区二区| 日韩一区在线看| 7777精品伊人久久久大香线蕉完整版| 蜜臀精品一区二区三区在线观看 | 精品一区二区国语对白| 91麻豆精品国产91久久久久| 狠狠色狠狠色综合日日91app| 国产精品色噜噜| 欧美乱熟臀69xxxxxx| 国产91丝袜在线18| 亚洲最大的成人av| 精品国内片67194| 91老司机福利 在线| 秋霞午夜鲁丝一区二区老狼| 国产欧美视频在线观看| 欧美日韩一区二区在线视频| 韩国女主播一区二区三区| 亚洲欧美日韩国产中文在线| 日韩午夜精品电影| 91视频免费播放| 久久草av在线| 亚洲欧美电影一区二区| 精品日韩99亚洲| 一本久久精品一区二区| 久久福利视频一区二区| 有坂深雪av一区二区精品| 久久欧美一区二区| 69久久夜色精品国产69蝌蚪网| 国产精品系列在线观看| 三级欧美在线一区| 成人欧美一区二区三区1314| 欧美岛国在线观看| 在线亚洲+欧美+日本专区| 午夜一区二区三区视频| 中文字幕不卡的av| 欧美一级国产精品| 欧美在线视频日韩| a级高清视频欧美日韩| 九色|91porny| 亚洲一级二级三级在线免费观看| 国产欧美视频一区二区三区| 日韩免费福利电影在线观看| 欧美唯美清纯偷拍| 91欧美激情一区二区三区成人| 狠狠色丁香婷综合久久| 天堂va蜜桃一区二区三区 | 成人做爰69片免费看网站| 免费看日韩a级影片| 亚洲一区二区五区| 亚洲精品伦理在线| 中文字幕二三区不卡| 国产亚洲人成网站| 日韩午夜在线影院| 91精品国产91久久久久久一区二区| 91蜜桃在线观看| 成人av综合在线| 丁香网亚洲国际| 国产成人av在线影院| 国产一区二区看久久| 蜜臀av一区二区三区| 三级在线观看一区二区| 婷婷久久综合九色综合伊人色| 一区二区三区中文免费| 一区二区三区在线观看国产| ●精品国产综合乱码久久久久 | 懂色一区二区三区免费观看| 国产剧情一区二区|