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

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

?? dns.c

?? uCOSII_lwip_lpc1768
?? C
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
 * to make sure an answer from the DNS server matches the current dns_table * entry (otherwise, answers might arrive late for hostname not on the list * any more). * * @param query hostname (not encoded) from the dns_table * @param response encoded hostname in the DNS response * @return 0: names equal; 1: names differ */static u8_tdns_compare_name(unsigned char *query, unsigned char *response){  unsigned char n;  do {    n = *response++;    /** @see RFC 1035 - 4.1.4. Message compression */    if ((n & 0xc0) == 0xc0) {      /* Compressed name */      break;    } else {      /* Not compressed name */      while (n > 0) {        if ((*query) != (*response)) {          return 1;        }        ++response;        ++query;        --n;      };      ++query;    }  } while (*response != 0);  return 0;}#endif /* DNS_DOES_NAME_CHECK *//** * Walk through a compact encoded DNS name and return the end of the name. * * @param query encoded DNS name in the DNS server response * @return end of the name */static unsigned char *dns_parse_name(unsigned char *query){  unsigned char n;  do {    n = *query++;    /** @see RFC 1035 - 4.1.4. Message compression */    if ((n & 0xc0) == 0xc0) {      /* Compressed name */      break;    } else {      /* Not compressed name */      while (n > 0) {        ++query;        --n;      };    }  } while (*query != 0);  return query + 1;}/** * Send a DNS query packet. * * @param numdns index of the DNS server in the dns_servers table * @param name hostname to query * @param id index of the hostname in dns_table, used as transaction ID in the *        DNS query packet * @return ERR_OK if packet is sent; an err_t indicating the problem otherwise */static err_tdns_send(u8_t numdns, const char* name, u8_t id){  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\r\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_DNS_HDR + DNS_MAX_NAME_LENGTH +                 SIZEOF_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_DNS_HDR);    hdr->id = htons(id);    hdr->flags1 = DNS_FLAG1_RD;    hdr->numquestions = htons(1);    query = (char*)hdr + SIZEOF_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_DNS_QUERY);    /* resize pbuf to the exact dns query */    pbuf_realloc(p, (query + SIZEOF_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 voiddns_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\r\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\r\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 voiddns_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 voiddns_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\r\n"));    /* free pbuf and return */    goto memerr1;  }  /* 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\r\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\r\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\r\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\r\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. */          MEMCPY(&ans, pHostname, SIZEOF_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_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, ("\r\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_DNS_ANSWER + htons(ans.len);          }          --nanswers;        }        LWIP_DEBUGF(DNS_DEBUG, ("dns_recv: \"%s\": error in response\r\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_tdns_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\r\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"\r\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_tdns_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 = htonl(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)) != INADDR_NONE)) {    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一区二区三区免费野_久草精品视频
国产女同性恋一区二区| 国产一区二区精品久久| 亚洲综合久久av| 亚洲伦理在线精品| ●精品国产综合乱码久久久久| 国产三区在线成人av| 久久婷婷久久一区二区三区| 久久综合国产精品| 国产清纯白嫩初高生在线观看91| 久久久三级国产网站| 国产婷婷一区二区| 亚洲国产精品精华液2区45| 国产午夜精品久久久久久久 | 欧美大片顶级少妇| 精品国产三级a在线观看| 久久伊人蜜桃av一区二区| 久久久久国产精品人| 国产午夜精品一区二区三区嫩草| 国产精品免费视频一区| 综合久久国产九一剧情麻豆| 一卡二卡三卡日韩欧美| 天天色天天爱天天射综合| 男女男精品视频网| 国产成人啪午夜精品网站男同| av影院午夜一区| 欧美视频一区在线观看| 日韩精品中午字幕| 国产精品全国免费观看高清 | 国产精品国产三级国产| 亚洲精品免费在线观看| 日韩一区精品字幕| 国产毛片精品视频| 色就色 综合激情| 日韩一区二区中文字幕| 亚洲国产精品av| 亚洲成人av电影在线| 精品中文av资源站在线观看| 成人国产一区二区三区精品| 91精品福利视频| 日韩欧美国产一区二区三区| 中文字幕乱码久久午夜不卡 | 天天综合天天做天天综合| 狠狠色综合色综合网络| 99久久久无码国产精品| 91麻豆精品久久久久蜜臀| 久久久精品黄色| 亚洲国产日韩a在线播放| 国产一区福利在线| 在线免费亚洲电影| 久久免费看少妇高潮| 亚洲一区在线看| 国产福利一区二区三区| 欧美日韩美女一区二区| 国产欧美一区二区三区网站| 亚洲国产sm捆绑调教视频| 国产精品系列在线观看| 欧美欧美午夜aⅴ在线观看| 久久精品视频在线看| 日韩精品一级二级| 91亚洲午夜精品久久久久久| 26uuu亚洲综合色欧美| 亚洲一区二区三区中文字幕| 国产精品99久久久久久似苏梦涵| 欧美午夜精品久久久| 国产精品美女久久久久久久久久久 | 97se亚洲国产综合自在线| 欧美成人女星排行榜| 亚洲愉拍自拍另类高清精品| 成人性生交大片免费| 日韩精品资源二区在线| 性感美女极品91精品| av欧美精品.com| 久久夜色精品国产欧美乱极品| 亚洲综合偷拍欧美一区色| 成人少妇影院yyyy| 欧美成人video| 日本午夜一本久久久综合| 一本久久精品一区二区| 久久精品亚洲国产奇米99| 麻豆成人av在线| 欧美系列亚洲系列| 亚洲欧美韩国综合色| 成人av网站在线| 久久久久久久电影| 久久超碰97人人做人人爱| 91精品黄色片免费大全| 亚洲123区在线观看| 欧美色综合久久| 一区二区三区欧美久久| 色素色在线综合| 亚洲免费视频成人| 色老汉av一区二区三区| 日韩伦理免费电影| 99久久精品情趣| 国产精品视频yy9299一区| 国产精品亚洲视频| 日本一区二区三区高清不卡 | 欧美精品 国产精品| 亚洲一区二区三区四区五区中文| 97久久精品人人爽人人爽蜜臀| 国产精品免费丝袜| 97se亚洲国产综合在线| 综合久久给合久久狠狠狠97色 | 精品久久久三级丝袜| 久久99久久精品| 精品欧美乱码久久久久久| 麻豆精品国产91久久久久久| 欧美mv和日韩mv国产网站| 久久er精品视频| 亚洲精品一区二区精华| 国产一区二区导航在线播放| 久久久精品黄色| 成人av资源下载| 国产精品女人毛片| 色嗨嗨av一区二区三区| 亚洲一区二区黄色| 91精品国产色综合久久不卡电影| 美女被吸乳得到大胸91| 国产无遮挡一区二区三区毛片日本| 国v精品久久久网| 亚洲另类春色国产| 在线91免费看| 国产一区二区电影| 亚洲欧美一区二区三区孕妇| 欧美三区在线观看| 久国产精品韩国三级视频| 久久九九全国免费| 一本大道久久a久久综合婷婷| 亚洲图片欧美一区| 精品久久久久久久久久久久包黑料| 精品在线播放免费| 国产精品久久夜| 欧美日韩中文另类| 久久99在线观看| 国产精品久久久久久一区二区三区 | 青娱乐精品视频| 国产午夜精品一区二区三区视频 | 日韩综合一区二区| 欧美精品一区二区三区视频| 成人网页在线观看| 图片区小说区区亚洲影院| 亚洲色大成网站www久久九九| 在线观看亚洲专区| 久久国产福利国产秒拍| 亚洲天堂a在线| 日韩无一区二区| 91在线国内视频| 日本不卡一区二区三区 | 精品一区二区三区在线观看| 中文字幕va一区二区三区| 欧美精选一区二区| 国产不卡一区视频| 无吗不卡中文字幕| 国产日韩欧美电影| 欧美精品亚洲一区二区在线播放| 国产精品夜夜嗨| 日韩激情视频在线观看| 国产精品另类一区| 日韩视频一区二区三区 | 中国av一区二区三区| 7777精品伊人久久久大香线蕉| 国产98色在线|日韩| 午夜精品免费在线观看| 欧美国产视频在线| 日韩欧美久久久| 色屁屁一区二区| 国产成人夜色高潮福利影视| 午夜久久电影网| 国产精品成人午夜| 久久综合色天天久久综合图片| 欧美图片一区二区三区| 成人av片在线观看| 国产一区二区看久久| 日日噜噜夜夜狠狠视频欧美人| 国产精品卡一卡二卡三| 久久伊人中文字幕| 91精品国产欧美一区二区18| 91成人免费电影| 不卡电影免费在线播放一区| 国产在线视频精品一区| 天堂成人免费av电影一区| 中文字幕av一区二区三区高| 精品欧美一区二区三区精品久久| 欧美日韩高清不卡| 欧美性一级生活| 色视频成人在线观看免| eeuss影院一区二区三区| 国产精品99久久久久久似苏梦涵| 麻豆精品在线看| 蜜臀a∨国产成人精品| 香蕉影视欧美成人| 亚洲国产视频网站| 夜夜嗨av一区二区三区| 亚洲视频一区二区在线观看| 国产精品视频免费看| 中文字幕巨乱亚洲| 中文字幕欧美区| 国产精品久久看| 中文字幕一区二区在线播放| 久久综合色天天久久综合图片|