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

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

?? resolver.c

?? 基于sip協(xié)議的網(wǎng)絡(luò)電話源碼
?? C
?? 第 1 頁(yè) / 共 3 頁(yè)
字號(hào):
    PJ_ASSERT_ON_FAIL(resolver, return);    pj_mutex_lock(resolver->mutex);    pj_timer_heap_poll(resolver->timer, NULL);    pj_mutex_unlock(resolver->mutex);    pj_ioqueue_poll(resolver->ioqueue, timeout);}/* Get one query node from the free node, if any, or allocate  * a new one. */static pj_dns_async_query *alloc_qnode(pj_dns_resolver *resolver,				       unsigned options,				       void *user_data,				       pj_dns_callback *cb){    pj_dns_async_query *q;    /* Merge query options with resolver options */    options |= resolver->settings.options;    if (!pj_list_empty(&resolver->query_free_nodes)) {	q = resolver->query_free_nodes.next;	pj_list_erase(q);	pj_bzero(q, sizeof(*q));    } else {	q = pj_pool_zalloc(resolver->pool, sizeof(*q));    }    /* Init query */    q->resolver = resolver;    q->options = options;    q->user_data = user_data;    q->cb = cb;    pj_list_init(&q->child_head);    return q;}/* * Transmit query. */static pj_status_t transmit_query(pj_dns_resolver *resolver,				  pj_dns_async_query *q){    unsigned pkt_size;    unsigned i, server_cnt;    unsigned servers[PJ_DNS_RESOLVER_MAX_NS];    pj_time_val now;    pj_str_t name;    pj_time_val delay;    pj_status_t status;    /* Create DNS query packet */    pkt_size = sizeof(resolver->udp_tx_pkt);    name = pj_str(q->key.name);    status = pj_dns_make_query(resolver->udp_tx_pkt, &pkt_size, 			       q->id, q->key.qtype, &name);    if (status != PJ_SUCCESS) {	return status;    }    /* Select which nameserver(s) to send requests to. */    server_cnt = PJ_ARRAY_SIZE(servers);    status = select_nameservers(resolver, &server_cnt, servers);    if (status != PJ_SUCCESS) {	return status;    }    if (server_cnt == 0) {	return PJLIB_UTIL_EDNSNOWORKINGNS;    }    /* Start retransmit/timeout timer for the query */    pj_assert(q->timer_entry.id == 0);    q->timer_entry.id = 1;    q->timer_entry.user_data = q;    q->timer_entry.cb = &on_timeout;    delay.sec = 0;    delay.msec = resolver->settings.qretr_delay;    pj_time_val_normalize(&delay);    status = pj_timer_heap_schedule(resolver->timer, &q->timer_entry, &delay);    if (status != PJ_SUCCESS) {	return status;    }    /* Get current time. */    pj_gettimeofday(&now);    /* Send the packet to name servers */    for (i=0; i<server_cnt; ++i) {	pj_ssize_t sent  = (pj_ssize_t) pkt_size;	struct nameserver *ns = &resolver->ns[servers[i]];	pj_sock_sendto(resolver->udp_sock, resolver->udp_tx_pkt, &sent, 0,		       &resolver->ns[servers[i]].addr, sizeof(pj_sockaddr_in));	PJ_LOG(4,(resolver->name.ptr, 		  "%s %d bytes to NS %d (%s:%d): DNS %s query for %s",		  (q->transmit_cnt==0? "Transmitting":"Re-transmitting"),		  (int)sent, servers[i],		  pj_inet_ntoa(ns->addr.sin_addr), 		  (int)pj_ntohs(ns->addr.sin_port),		  pj_dns_get_type_name(q->key.qtype), 		  q->key.name));	if (ns->q_id == 0) {	    ns->q_id = q->id;	    ns->sent_time = now;	}    }    ++q->transmit_cnt;    return PJ_SUCCESS;}/* * Initialize resource key for hash table lookup. */static void init_res_key(struct res_key *key, int type, const pj_str_t *name){    unsigned i, len;    char *dst = key->name;    const char *src = name->ptr;    pj_bzero(key, sizeof(struct res_key));    key->qtype = (pj_uint16_t)type;    len = name->slen;    if (len > PJ_MAX_HOSTNAME) len = PJ_MAX_HOSTNAME;    /* Copy key, in lowercase */    for (i=0; i<len; ++i) {	*dst++ = (char)pj_tolower(*src++);    }}/* * Create and start asynchronous DNS query for a single resource. */PJ_DEF(pj_status_t) pj_dns_resolver_start_query( pj_dns_resolver *resolver,						 const pj_str_t *name,						 int type,						 unsigned options,						 pj_dns_callback *cb,						 void *user_data,						 pj_dns_async_query **p_query){    pj_time_val now;    struct res_key key;    struct cached_res *cache;    pj_dns_async_query *q;    pj_uint32_t hval;    pj_status_t status = PJ_SUCCESS;    /* Validate arguments */    PJ_ASSERT_RETURN(resolver && name && type, PJ_EINVAL);    /* Check name is not too long. */    PJ_ASSERT_RETURN(name->slen>0 && name->slen < PJ_MAX_HOSTNAME,		     PJ_ENAMETOOLONG);    /* Check type */    PJ_ASSERT_RETURN(type > 0 && type < 0xFFFF, PJ_EINVAL);    if (p_query)	*p_query = NULL;    /* Build resource key for looking up hash tables */    init_res_key(&key, type, name);    /* Start working with the resolver */    pj_mutex_lock(resolver->mutex);    /* Get current time. */    pj_gettimeofday(&now);    /* First, check if we have cached response for the specified name/type,     * and the cached entry has not expired.     */    hval = 0;    cache = pj_hash_get(resolver->hrescache, &key, sizeof(key), &hval);    if (cache) {	/* We've found a cached entry. */	/* Check for expiration */	if (PJ_TIME_VAL_GT(cache->expiry_time, now)) {	    /* Log */	    PJ_LOG(5,(resolver->name.ptr, 		      "Picked up DNS %s record for %.*s from cache, ttl=%d",		      pj_dns_get_type_name(type),		      (int)name->slen, name->ptr,		      (int)(cache->expiry_time.sec - now.sec)));	    /* Map DNS Rcode in the response into PJLIB status name space */	    status = PJ_DNS_GET_RCODE(cache->pkt->hdr.flags);	    status = PJ_STATUS_FROM_DNS_RCODE(status);	    /* This cached response is still valid. Just return this	     * response to caller.	     */	    if (cb) {		(*cb)(user_data, status, cache->pkt);	    }	    /* Done. No host resolution is necessary */	    /* Must return PJ_SUCCESS */	    status = PJ_SUCCESS;	    goto on_return;	}	/* At this point, we have a cached entry, but this entry has expired.	 * Remove this entry from the cached list.	 */	pj_hash_set(NULL, resolver->hrescache, &key, sizeof(key), 0, NULL);	/* Store the entry into free nodes */	pj_list_push_back(&resolver->res_free_nodes, cache);	/* Must continue with creating a query now */    }    /* Next, check if we have pending query on the same resource */    q = pj_hash_get(resolver->hquerybyres, &key, sizeof(key), NULL);    if (q) {	/* Yes, there's another pending query to the same key.	 * Just create a new child query and add this query to	 * pending query's child queries.	 */	pj_dns_async_query *nq;	nq = alloc_qnode(resolver, options, user_data, cb);	pj_list_push_back(&q->child_head, nq);	/* Done. This child query will be notified once the "parent"	 * query completes.	 */	status = PJ_SUCCESS;	goto on_return;    }     /* There's no pending query to the same key, initiate a new one. */    q = alloc_qnode(resolver, options, user_data, cb);    /* Save the ID and key */    q->id = resolver->last_id++;    if (resolver->last_id == 0)	resolver->last_id = 1;    pj_memcpy(&q->key, &key, sizeof(struct res_key));    /* Send the query */    status = transmit_query(resolver, q);    if (status != PJ_SUCCESS) {	pj_list_push_back(&resolver->query_free_nodes, q);	goto on_return;    }    /* Add query entry to the hash tables */    pj_hash_set_np(resolver->hquerybyid, &q->id, sizeof(q->id), 		   0, q->hbufid, q);    pj_hash_set_np(resolver->hquerybyres, &q->key, sizeof(q->key),		   0, q->hbufkey, q);    if (p_query)	*p_query = q;on_return:    pj_mutex_unlock(resolver->mutex);    return status;}/* * Cancel a pending query. */PJ_DEF(pj_status_t) pj_dns_resolver_cancel_query(pj_dns_async_query *query,						 pj_bool_t notify){    pj_dns_callback *cb;    PJ_ASSERT_RETURN(query, PJ_EINVAL);    pj_mutex_lock(query->resolver->mutex);    cb = query->cb;    query->cb = NULL;    if (notify)	(*cb)(query->user_data, PJ_ECANCELLED, NULL);    pj_mutex_unlock(query->resolver->mutex);    return PJ_SUCCESS;}/* Set nameserver state */static void set_nameserver_state(pj_dns_resolver *resolver,				 unsigned index,				 enum ns_state state,				 const pj_time_val *now){    struct nameserver *ns = &resolver->ns[index];    ns->state = state;    ns->state_expiry = *now;    if (state == STATE_PROBING)	ns->state_expiry.sec += ((PJ_DNS_RESOLVER_QUERY_RETRANSMIT_COUNT + 2) *				 PJ_DNS_RESOLVER_QUERY_RETRANSMIT_DELAY) / 1000;    else if (state == STATE_ACTIVE)	ns->state_expiry.sec += PJ_DNS_RESOLVER_GOOD_NS_TTL;    else	ns->state_expiry.sec += PJ_DNS_RESOLVER_BAD_NS_TTL;}/* Select which nameserver(s) to use. Note this may return multiple * name servers. The algorithm to select which nameservers to be * sent the request to is as follows: *  - select the first nameserver that is known to be good for the *    last PJ_DNS_RESOLVER_GOOD_NS_TTL interval. *  - for all NSes, if last_known_good >= PJ_DNS_RESOLVER_GOOD_NS_TTL,  *    include the NS to re-check again that the server is still good, *    unless the NS is known to be bad in the last PJ_DNS_RESOLVER_BAD_NS_TTL *    interval. *  - for all NSes, if last_known_bad >= PJ_DNS_RESOLVER_BAD_NS_TTL,  *    also include the NS to re-check again that the server is still bad. */static pj_status_t select_nameservers(pj_dns_resolver *resolver,				      unsigned *count,				      unsigned servers[]){    unsigned i, max_count=*count;    int min;    pj_time_val now;    pj_assert(max_count > 0);    *count = 0;    servers[0] = 0xFFFF;    /* Check that nameservers are configured. */    if (resolver->ns_count == 0)	return PJLIB_UTIL_EDNSNONS;    pj_gettimeofday(&now);    /* Select one Active nameserver with best response time. */    for (min=-1, i=0; i<resolver->ns_count; ++i) {	struct nameserver *ns = &resolver->ns[i];	if (ns->state != STATE_ACTIVE)	    continue;	if (min == -1)	    min = i;	else if (PJ_TIME_VAL_LT(ns->rt_delay, resolver->ns[min].rt_delay))	    min = i;    }    if (min != -1) {	servers[0] = min;	++(*count);    }    /* Scan nameservers. */    for (i=0; i<resolver->ns_count && *count < max_count; ++i) {	struct nameserver *ns = &resolver->ns[i];	if (PJ_TIME_VAL_LTE(ns->state_expiry, now)) {	    if (ns->state == STATE_PROBING) {		set_nameserver_state(resolver, i, STATE_BAD, &now);	    } else {		set_nameserver_state(resolver, i, STATE_PROBING, &now);		if ((int)i != min) {		    servers[*count] = i;		    ++(*count);		}	    }	} else if (ns->state == STATE_PROBING && (int)i != min) {	    servers[*count] = i;	    ++(*count);	}    }    return PJ_SUCCESS;}/* Update name server status */static void report_nameserver_status(pj_dns_resolver *resolver,				     const pj_sockaddr_in *ns_addr,				     const pj_dns_parsed_packet *pkt){    unsigned i;    int rcode;    pj_uint32_t q_id;    pj_time_val now;    pj_bool_t is_good;    /* Only mark nameserver as "bad" if it returned non-parseable response or     * it returned the following status codes     */    if (pkt) {	rcode = PJ_DNS_GET_RCODE(pkt->hdr.flags);	q_id = pkt->hdr.id;    } else {	rcode = 0;	q_id = (pj_uint32_t)-1;    }    if (!pkt || rcode == PJ_DNS_RCODE_SERVFAIL ||	        rcode == PJ_DNS_RCODE_REFUSED ||	        rcode == PJ_DNS_RCODE_NOTAUTH)     {	is_good = PJ_FALSE;    } else {	is_good = PJ_TRUE;    }    /* Mark time */    pj_gettimeofday(&now);    /* Recheck all nameservers. */    for (i=0; i<resolver->ns_count; ++i) {	struct nameserver *ns = &resolver->ns[i];	if (ns->addr.sin_addr.s_addr == ns_addr->sin_addr.s_addr &&	    ns->addr.sin_port == ns_addr->sin_port &&	    ns->addr.sin_family == ns_addr->sin_family)	{	    if (q_id == ns->q_id) {		/* Calculate response time */		pj_time_val rt = now;		PJ_TIME_VAL_SUB(rt, ns->sent_time);		ns->rt_delay = rt;		ns->q_id = 0;	    }	    set_nameserver_state(resolver, i, 				 (is_good ? STATE_ACTIVE : STATE_BAD), &now);	    break;	}    }}/* Update response cache */static void update_res_cache(pj_dns_resolver *resolver,			     const struct res_key *key,			     pj_status_t status,			     pj_bool_t set_expiry,			     const pj_dns_parsed_packet *pkt){    struct cached_res *cache;    pj_pool_t *res_pool;    pj_uint32_t hval=0, ttl;    PJ_USE_EXCEPTION;    /* If status is unsuccessful, clear the same entry from the cache */

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色综合视频在线观看| 国模套图日韩精品一区二区 | 欧美日韩国产电影| 国产高清成人在线| 亚洲国产精品一区二区久久恐怖片| 精品国产髙清在线看国产毛片| 91老师片黄在线观看| 国产乱码精品一区二区三区五月婷| 一区二区成人在线| 国产精品沙发午睡系列990531| 日韩欧美成人午夜| 欧美三级中文字| 色欲综合视频天天天| 国产不卡高清在线观看视频| 精品在线观看视频| 日韩精品一级中文字幕精品视频免费观看| 国产精品色眯眯| 久久亚洲综合av| 日韩一级完整毛片| 欧美一区二区美女| 欧美精品在线一区二区| 色综合色狠狠天天综合色| 国产999精品久久久久久| 精品一区二区三区免费毛片爱| 亚洲va在线va天堂| 亚洲sss视频在线视频| 亚洲视频在线一区观看| 中文字幕综合网| 一色屋精品亚洲香蕉网站| 中文字幕一区二区在线播放| 欧美韩国日本综合| 国产精品视频一区二区三区不卡| 欧美激情艳妇裸体舞| 欧美国产日本视频| 国产精品卡一卡二| 亚洲欧美日韩久久精品| 亚洲欧洲成人av每日更新| 亚洲同性同志一二三专区| 成人欧美一区二区三区白人| 亚洲人成精品久久久久久| 国产精品天美传媒| **网站欧美大片在线观看| 亚洲人妖av一区二区| 亚洲激情欧美激情| 亚洲va国产天堂va久久en| 亚洲123区在线观看| 婷婷成人综合网| 秋霞午夜鲁丝一区二区老狼| 毛片基地黄久久久久久天堂| 国产美女精品人人做人人爽| 国产成人精品免费| 91蜜桃网址入口| 欧美日本视频在线| 精品免费日韩av| 国产精品免费视频观看| 亚洲少妇30p| 天天色 色综合| 国内精品久久久久影院一蜜桃| 高清国产一区二区三区| 97久久人人超碰| 亚洲欧美日韩在线播放| 久久免费的精品国产v∧| 国产偷国产偷精品高清尤物| 中文成人av在线| 亚洲福利视频三区| 国模一区二区三区白浆| 99精品视频中文字幕| 欧美无人高清视频在线观看| 日韩一区二区三区电影| 久久久91精品国产一区二区精品 | 亚洲精品高清视频在线观看| 亚洲高清久久久| 国模一区二区三区白浆| 91在线看国产| 欧美一区二区三区公司| 中文字幕成人网| 午夜电影久久久| 国v精品久久久网| 欧美电影一区二区三区| 国产日韩在线不卡| 亚洲午夜精品网| 国产精品一品视频| 欧美人与性动xxxx| 国产精品女人毛片| 免费成人深夜小野草| 91啪亚洲精品| 精品国产精品网麻豆系列 | 亚洲色图欧洲色图| 老司机精品视频导航| 91欧美一区二区| 久久噜噜亚洲综合| 亚洲成人激情综合网| 成人激情午夜影院| 日韩精品一区二区三区四区| 亚洲蜜臀av乱码久久精品蜜桃| 精品亚洲成a人| 欧美日本在线播放| 亚洲免费视频中文字幕| 国产又黄又大久久| 91精品国产手机| 亚洲线精品一区二区三区八戒| 国产成人av在线影院| 欧美本精品男人aⅴ天堂| 亚洲一二三区在线观看| 99国产精品99久久久久久| 精品国产3级a| 日韩国产精品大片| 国产精品女同互慰在线看| 亚洲bdsm女犯bdsm网站| www.欧美日韩| 国产视频一区二区在线| 久久国产日韩欧美精品| 91精品国产综合久久久久| 亚洲香肠在线观看| 日本电影欧美片| 中文字幕一区三区| 成人激情黄色小说| 国产人妖乱国产精品人妖| 久久国内精品视频| 日韩一区二区三区免费看 | 国产在线一区二区综合免费视频| 欧美日韩成人一区二区| 亚洲一区二区在线免费观看视频| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 色一情一伦一子一伦一区| 国产精品麻豆一区二区| 国产成人av一区二区三区在线观看| 日韩视频国产视频| 免费不卡在线视频| 日韩欧美的一区| 九一久久久久久| 精品电影一区二区| 国产自产v一区二区三区c| 久久网站热最新地址| 国产乱码精品一区二区三区忘忧草| 欧美成人一区二区三区在线观看 | 日韩福利电影在线观看| 91精品在线免费| 激情伊人五月天久久综合| 久久老女人爱爱| 成人激情开心网| 亚洲另类春色校园小说| 在线看一区二区| 日韩福利电影在线| 欧美tk—视频vk| 成人自拍视频在线| 亚洲天堂成人在线观看| 精品视频资源站| 免费精品视频在线| 国产色综合一区| 不卡的av网站| 99久久精品国产导航| 一区二区国产盗摄色噜噜| 欧美日韩高清一区| 久久精品国产一区二区三区免费看| 久久亚洲一级片| eeuss鲁片一区二区三区在线观看| 亚洲色图视频网站| 欧美日韩精品欧美日韩精品| 精品一区二区三区日韩| 国产精品久久久久久久久免费桃花| 日本韩国精品在线| 日韩电影免费在线看| 久久免费午夜影院| 日本精品裸体写真集在线观看| 三级影片在线观看欧美日韩一区二区| 欧美va在线播放| 99精品欧美一区二区三区综合在线| 亚洲第一二三四区| 久久久久久久久99精品| 91国偷自产一区二区使用方法| 强制捆绑调教一区二区| 欧美国产成人精品| 欧美电影影音先锋| 成人午夜伦理影院| 亚洲成人一区在线| 中文字幕第一区第二区| 欧美妇女性影城| 国产不卡一区视频| 午夜久久久久久| 国产精品日韩成人| 91麻豆精品91久久久久久清纯| 高清beeg欧美| 三级一区在线视频先锋| 国产精品国产三级国产| 欧美一区二区三区在线观看| 成人精品电影在线观看| 日产国产欧美视频一区精品| 中文字幕一区二区三区在线观看 | 一区二区三区成人| 精品国产伦一区二区三区观看体验 | 亚洲高清免费在线| 欧美极品少妇xxxxⅹ高跟鞋| 欧美福利一区二区| 色综合天天性综合| 国产成人啪免费观看软件| 日韩经典一区二区| 一区二区三区在线观看视频| 久久精品欧美日韩| 日韩一级二级三级精品视频|