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

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

?? resolver.c

?? 基于sip協議的網絡電話源碼
?? C
?? 第 1 頁 / 共 3 頁
字號:
/* $Id: resolver.c 1033 2007-03-02 14:51:03Z bennylp $ *//*  * Copyright (C) 2003-2007 Benny Prijono <benny@prijono.org> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA  */#include <pjlib-util/resolver.h>#include <pjlib-util/errno.h>#include <pj/assert.h>#include <pj/ctype.h>#include <pj/except.h>#include <pj/hash.h>#include <pj/ioqueue.h>#include <pj/log.h>#include <pj/os.h>#include <pj/pool.h>#include <pj/pool_buf.h>#include <pj/string.h>#include <pj/sock.h>#include <pj/timer.h>#define THIS_FILE	    "resolver.c"/* Check that maximum DNS nameservers is not too large.  * This has got todo with the datatype to index the nameserver in the query. */#if PJ_DNS_RESOLVER_MAX_NS > 256#   error "PJ_DNS_RESOLVER_MAX_NS is too large (max=256)"#endif#define RES_HASH_TABLE_SIZE 127		/**< Hash table size (must be 2^n-1 */#define PORT		    53		/**< Default NS port.		    */#define Q_HASH_TABLE_SIZE   127		/**< Query hash table size	    */#define TIMER_SIZE	    127		/**< Initial number of timers.	    */#define MAX_FD		    3		/**< Maximum internal sockets.	    */#define RES_BUF_SZ	    PJ_DNS_RESOLVER_RES_BUF_SIZE#define UDPSZ		    PJ_DNS_RESOLVER_MAX_UDP_SIZE#define TMP_SZ		    PJ_DNS_RESOLVER_TMP_BUF_SIZE/* Nameserver state */enum ns_state{    STATE_PROBING,    STATE_ACTIVE,    STATE_BAD,};/*  * Each nameserver entry. * A name server is identified by its socket address (IP and port). * Each NS will have a flag to indicate whether it's properly functioning. */struct nameserver{    pj_sockaddr_in  addr;		/**< Server address.		    */    enum ns_state   state;		/**< Nameserver state.		    */    pj_time_val	    state_expiry;	/**< Time set next state.	    */    pj_time_val	    rt_delay;		/**< Response time.		    */        /* For calculating rt_delay: */    pj_uint16_t	    q_id;		/**< Query ID.			    */    pj_time_val	    sent_time;		/**< Time this query is sent.	    */};/* Child query list head  * See comments on pj_dns_async_query below. */struct query_head{    PJ_DECL_LIST_MEMBER(pj_dns_async_query);};/* Key to look for outstanding query and/or cached response */struct res_key{    pj_uint16_t		     qtype;		    /**< Query type.	    */    char		     name[PJ_MAX_HOSTNAME]; /**< Name being queried */};/*  * This represents each asynchronous query entry. * This entry will be put in two hash tables, the first one keyed on the DNS  * transaction ID to match response with the query, and the second one keyed * on "res_key" structure above to match a new request against outstanding  * requests. * * An asynchronous entry may have child entries; child entries are subsequent * queries to the same resource while there is pending query on the same * DNS resource name and type. When a query has child entries, once the * response is received (or error occurs), the response will trigger callback * invocations for all childs entries. * * Note: when application cancels the query, the callback member will be *       set to NULL, but for simplicity, the query will be let running. */struct pj_dns_async_query{    PJ_DECL_LIST_MEMBER(pj_dns_async_query);	/**< List member.	    */    pj_dns_resolver	*resolver;	/**< The resolver instance.	    */    pj_uint16_t		 id;		/**< Transaction ID.		    */    unsigned		 transmit_cnt;	/**< Number of transmissions.	    */    struct res_key	 key;		/**< Key to index this query.	    */    char		 hbufid[PJ_HASH_ENTRY_SIZE];	/**< Hash buffer 1  */    char		 hbufkey[PJ_HASH_ENTRY_SIZE];	/**< Hash buffer 2  */    pj_timer_entry	 timer_entry;	/**< Timer to manage timeouts	    */    unsigned		 options;	/**< Query options.		    */    void		*user_data;	/**< Application data.		    */    pj_dns_callback	*cb;		/**< Callback to be called.	    */    struct query_head	 child_head;	/**< Child queries list head.	    */};/* This structure is used to keep cached response entry. * The cache is a hash table keyed on "res_key" structure above. */struct cached_res{    PJ_DECL_LIST_MEMBER(struct cached_res);    struct res_key	     key;	    /**< Resource key.		    */    char		     buf[RES_BUF_SZ];/**< Resource buffer.	    */    char		     hbuf[PJ_HASH_ENTRY_SIZE];	/**< Hash buffer    */    pj_time_val		     expiry_time;   /**< Expiration time.	    */    pj_dns_parsed_packet    *pkt;	    /**< The response packet.	    */};/* Resolver entry */struct pj_dns_resolver{    pj_str_t		 name;		/**< Resolver instance name for id. */    /* Internals */    pj_pool_t		*pool;		/**< Internal pool.		    */    pj_mutex_t		*mutex;		/**< Mutex protection.		    */    pj_bool_t		 own_timer;	/**< Do we own timer?		    */    pj_timer_heap_t	*timer;		/**< Timer instance.		    */    pj_bool_t		 own_ioqueue;	/**< Do we own ioqueue?		    */    pj_ioqueue_t	*ioqueue;	/**< Ioqueue instance.		    */    char		 tmp_pool[TMP_SZ];/**< Temporary pool buffer.	    */    /* Socket */    pj_sock_t		 udp_sock;	/**< UDP socket.		    */    pj_ioqueue_key_t	*udp_key;	/**< UDP socket ioqueue key.	    */    unsigned char	 udp_rx_pkt[UDPSZ];/**< UDP receive buffer.	    */    unsigned char	 udp_tx_pkt[UDPSZ];/**< UDP receive buffer.	    */    pj_ssize_t		 udp_len;	/**< Length of received packet.	    */    pj_ioqueue_op_key_t	 udp_op_key;	/**< UDP read operation key.	    */    pj_sockaddr_in	 udp_src_addr;	/**< Source address of packet	    */    int			 udp_addr_len;	/**< Source address length.	    */    /* Settings */    pj_dns_settings	 settings;	/**< Resolver settings.		    */    /* Nameservers */    unsigned		 ns_count;	/**< Number of name servers.	    */    struct nameserver	 ns[PJ_DNS_RESOLVER_MAX_NS];	/**< Array of NS.   */    /* Last DNS transaction ID used. */    pj_uint16_t		 last_id;    /* Hash table for cached response */    pj_hash_table_t	*hrescache;	/**< Cached response in hash table  */    /* Cached response free list */    struct cached_res	 res_free_nodes;    /* Pending asynchronous query, hashed by transaction ID. */    pj_hash_table_t	*hquerybyid;    /* Pending asynchronous query, hashed by "res_key" */    pj_hash_table_t	*hquerybyres;    /* Query entries free list */    struct query_head	 query_free_nodes;};/* Callback from ioqueue when packet is received */static void on_read_complete(pj_ioqueue_key_t *key,                              pj_ioqueue_op_key_t *op_key,                              pj_ssize_t bytes_read);/* Callback to be called when query has timed out */static void on_timeout( pj_timer_heap_t *timer_heap,			struct pj_timer_entry *entry);/* Select which nameserver to use */static pj_status_t select_nameservers(pj_dns_resolver *resolver,				      unsigned *count,				      unsigned servers[]);/* * Create the resolver. */PJ_DEF(pj_status_t) pj_dns_resolver_create( pj_pool_factory *pf,					    const char *name,					    unsigned options,					    pj_timer_heap_t *timer,					    pj_ioqueue_t *ioqueue,					    pj_dns_resolver **p_resolver){    pj_pool_t *pool;    pj_dns_resolver *resv;    pj_ioqueue_callback socket_cb;    pj_status_t status;    /* Sanity check */    PJ_ASSERT_RETURN(pf && p_resolver, PJ_EINVAL);    if (name == NULL)	name = THIS_FILE;    /* Create and initialize resolver instance */    pool = pj_pool_create(pf, name, 4000, 4000, NULL);    if (!pool)	return PJ_ENOMEM;    /* Create pool and name */    resv = pj_pool_zalloc(pool, sizeof(struct pj_dns_resolver));    resv->pool = pool;    resv->udp_sock = PJ_INVALID_SOCKET;    pj_strdup2_with_null(pool, &resv->name, name);        /* Create the mutex */    status = pj_mutex_create_recursive(pool, name, &resv->mutex);    if (status != PJ_SUCCESS)	goto on_error;    /* Timer, ioqueue, and settings */    resv->timer = timer;    resv->ioqueue = ioqueue;    resv->last_id = 1;    resv->settings.options = options;    resv->settings.qretr_delay = PJ_DNS_RESOLVER_QUERY_RETRANSMIT_DELAY;    resv->settings.qretr_count = PJ_DNS_RESOLVER_QUERY_RETRANSMIT_COUNT;    resv->settings.cache_max_ttl = PJ_DNS_RESOLVER_MAX_TTL;    /* Create the timer heap if one is not specified */    if (resv->timer == NULL) {	status = pj_timer_heap_create(pool, TIMER_SIZE, &resv->timer);	if (status != PJ_SUCCESS)	    goto on_error;    }    /* Create the ioqueue if one is not specified */    if (resv->ioqueue == NULL) {	status = pj_ioqueue_create(pool, MAX_FD, &resv->ioqueue);	if (status != PJ_SUCCESS)	    goto on_error;    }    /* Response cache hash table and item list */    resv->hrescache = pj_hash_create(pool, RES_HASH_TABLE_SIZE);    pj_list_init(&resv->res_free_nodes);    /* Query hash table and free list. */    resv->hquerybyid = pj_hash_create(pool, Q_HASH_TABLE_SIZE);    resv->hquerybyres = pj_hash_create(pool, Q_HASH_TABLE_SIZE);    pj_list_init(&resv->query_free_nodes);    /* Create the UDP socket */    status = pj_sock_socket(PJ_AF_INET, PJ_SOCK_DGRAM, 0, &resv->udp_sock);    if (status != PJ_SUCCESS)	goto on_error;    /* Register to ioqueue */    pj_bzero(&socket_cb, sizeof(socket_cb));    socket_cb.on_read_complete = &on_read_complete;    status = pj_ioqueue_register_sock(pool, resv->ioqueue, resv->udp_sock,				      resv, &socket_cb, &resv->udp_key);    if (status != PJ_SUCCESS)	goto on_error;    pj_ioqueue_op_key_init(&resv->udp_op_key, sizeof(resv->udp_op_key));    /* Start asynchronous read to the UDP socket */    resv->udp_len = sizeof(resv->udp_rx_pkt);    resv->udp_addr_len = sizeof(resv->udp_src_addr);    status = pj_ioqueue_recvfrom(resv->udp_key, &resv->udp_op_key, 				 resv->udp_rx_pkt, &resv->udp_len, 				 PJ_IOQUEUE_ALWAYS_ASYNC,				 &resv->udp_src_addr, &resv->udp_addr_len);    if (status != PJ_EPENDING)	goto on_error;    /* Looks like everything is okay */    *p_resolver = resv;    return PJ_SUCCESS;on_error:    pj_dns_resolver_destroy(resv, PJ_FALSE);    return status;}/* * Destroy DNS resolver instance. */PJ_DEF(pj_status_t) pj_dns_resolver_destroy( pj_dns_resolver *resolver,					     pj_bool_t notify){    PJ_ASSERT_RETURN(resolver, PJ_EINVAL);    if (notify) {	/*	 * Notify pending queries if requested.	 */	pj_hash_iterator_t it_buf, *it;	it = pj_hash_first(resolver->hquerybyid, &it_buf);	while (it) {	    pj_dns_async_query *q = pj_hash_this(resolver->hquerybyid, it);	    pj_dns_async_query *cq;	    if (q->cb)		(*q->cb)(q->user_data, PJ_ECANCELLED, NULL);	    cq = q->child_head.next;	    while (cq != (pj_dns_async_query*)&q->child_head) {		if (cq->cb)		    (*cq->cb)(cq->user_data, PJ_ECANCELLED, NULL);		cq = cq->next;	    }	    it = pj_hash_next(resolver->hquerybyid, it);	}    }    if (resolver->own_timer && resolver->timer) {	pj_timer_heap_destroy(resolver->timer);	resolver->timer = NULL;    }    if (resolver->own_ioqueue && resolver->ioqueue) {	pj_ioqueue_destroy(resolver->ioqueue);	resolver->ioqueue = NULL;    }    if (resolver->udp_key != NULL) {	pj_ioqueue_unregister(resolver->udp_key);	resolver->udp_key = NULL;	resolver->udp_sock = PJ_INVALID_SOCKET;    } else if (resolver->udp_sock != PJ_INVALID_SOCKET) {	pj_sock_close(resolver->udp_sock);	resolver->udp_sock = PJ_INVALID_SOCKET;    }    if (resolver->mutex) {	pj_mutex_destroy(resolver->mutex);	resolver->mutex = NULL;    }    if (resolver->pool) {	pj_pool_t *pool = resolver->pool;	resolver->pool = NULL;	pj_pool_release(pool);    }    return PJ_SUCCESS;}/* * Configure name servers for the DNS resolver.  */PJ_DEF(pj_status_t) pj_dns_resolver_set_ns( pj_dns_resolver *resolver,					    unsigned count,					    const pj_str_t servers[],					    const pj_uint16_t ports[]){    unsigned i;    pj_time_val now;    pj_status_t status;    PJ_ASSERT_RETURN(resolver && count && servers, PJ_EINVAL);    pj_mutex_lock(resolver->mutex);    if (count > PJ_DNS_RESOLVER_MAX_NS)	count = PJ_DNS_RESOLVER_MAX_NS;    resolver->ns_count = 0;    pj_bzero(resolver->ns, sizeof(resolver->ns));    pj_gettimeofday(&now);    for (i=0; i<count; ++i) {	struct nameserver *ns = &resolver->ns[i];	status = pj_sockaddr_in_init(&ns->addr, &servers[i], 				     (pj_uint16_t)(ports ? ports[i] : PORT));	if (status != PJ_SUCCESS) {	    pj_mutex_unlock(resolver->mutex);	    return PJLIB_UTIL_EDNSINNSADDR;	}	ns->state = STATE_ACTIVE;	ns->state_expiry = now;	ns->rt_delay.sec = 10;    }        resolver->ns_count = count;    pj_mutex_unlock(resolver->mutex);    return PJ_SUCCESS;}/* * Modify the resolver settings. */PJ_DEF(pj_status_t) pj_dns_resolver_set_settings(pj_dns_resolver *resolver,						 const pj_dns_settings *st){    PJ_ASSERT_RETURN(resolver && st, PJ_EINVAL);    pj_mutex_lock(resolver->mutex);    pj_memcpy(&resolver->settings, st, sizeof(*st));    pj_mutex_unlock(resolver->mutex);    return PJ_SUCCESS;}/* * Get the resolver current settings. */PJ_DEF(pj_status_t) pj_dns_resolver_get_settings( pj_dns_resolver *resolver,						  pj_dns_settings *st){    PJ_ASSERT_RETURN(resolver && st, PJ_EINVAL);    pj_mutex_lock(resolver->mutex);    pj_memcpy(st, &resolver->settings, sizeof(*st));    pj_mutex_unlock(resolver->mutex);    return PJ_SUCCESS;}/* * Poll for events from the resolver.  */PJ_DEF(void) pj_dns_resolver_handle_events(pj_dns_resolver *resolver,					   const pj_time_val *timeout){

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久69国产一区二区蜜臀| 色先锋久久av资源部| www.日韩在线| 678五月天丁香亚洲综合网| 国产亚洲女人久久久久毛片| 亚洲国产一二三| 成人深夜在线观看| 精品99一区二区| 日日摸夜夜添夜夜添精品视频| 成人成人成人在线视频| 日韩欧美一区二区在线视频| 一区二区在线看| 成人一区二区三区| 久久久美女艺术照精彩视频福利播放| 亚洲一区二区成人在线观看| 91亚洲精品一区二区乱码| 久久久亚洲国产美女国产盗摄 | 欧美一区二区三区在| 亚洲欧美一区二区三区孕妇| 国产传媒欧美日韩成人| 欧美成人精品二区三区99精品| 亚洲va欧美va人人爽午夜| 色屁屁一区二区| 亚洲色图19p| 99精品视频一区二区三区| 日本一区二区久久| 国产精品123| 久久久久久一级片| 韩国av一区二区三区在线观看| 欧美日韩视频专区在线播放| 亚洲国产精品嫩草影院| 在线视频你懂得一区二区三区| 亚洲日本电影在线| 色婷婷一区二区三区四区| 一级精品视频在线观看宜春院| 91视频观看视频| 亚洲综合在线五月| 欧美日韩一级视频| 免费黄网站欧美| 精品久久久久久久久久久久久久久久久 | 综合在线观看色| 91在线国产福利| 亚洲亚洲精品在线观看| 欧美日韩在线三区| 免费高清不卡av| 久久精品夜夜夜夜久久| 成人免费高清在线| 一区二区三区在线高清| 欧美久久久久久蜜桃| 蜜桃av噜噜一区二区三区小说| 精品国产三级电影在线观看| 国产精品中文字幕一区二区三区| 日本一区二区视频在线| 91免费视频观看| 同产精品九九九| 2021中文字幕一区亚洲| 97se亚洲国产综合在线| 日韩中文字幕亚洲一区二区va在线 | 日精品一区二区| 久久久久久一级片| 一本一本久久a久久精品综合麻豆| 亚洲精品亚洲人成人网| 精品伦理精品一区| 国产成人啪午夜精品网站男同| 综合色天天鬼久久鬼色| 欧美一个色资源| 99久久99精品久久久久久 | 国产成人综合在线观看| 亚洲在线视频一区| 精品精品国产高清a毛片牛牛| 99精品久久只有精品| 日本不卡高清视频| 亚洲丝袜制服诱惑| 精品久久久久久久久久久久久久久久久| 成人免费观看男女羞羞视频| 午夜视频一区二区三区| 国产精品视频观看| 欧美一区二区不卡视频| 色婷婷激情综合| 成人自拍视频在线观看| 日韩国产精品久久| 亚洲免费在线播放| 国产亚洲综合在线| 91精品婷婷国产综合久久性色 | 欧美日韩国产免费一区二区 | 久99久精品视频免费观看| 亚洲免费三区一区二区| 欧美一级生活片| 91网站最新地址| 国产成人在线色| 韩国av一区二区三区在线观看| 亚洲与欧洲av电影| 中文字幕亚洲不卡| 久久综合久色欧美综合狠狠| 6080国产精品一区二区| 色婷婷综合久久| 91在线免费看| 99久久久国产精品免费蜜臀| 国产成人亚洲综合a∨婷婷| 久久成人18免费观看| 日本欧美一区二区三区乱码| 一区二区三区四区在线| 亚洲视频免费在线| 国产精品乱码久久久久久| 中文字幕免费一区| 久久人人97超碰com| 日韩欧美久久久| 欧美成人国产一区二区| 日韩一级片网站| 日韩一区二区麻豆国产| 日韩欧美国产精品| 日韩欧美黄色影院| 精品成人一区二区三区四区| 欧美精品一区二区三区蜜臀| 日韩欧美一区二区视频| 日韩精品资源二区在线| 6080亚洲精品一区二区| 日韩一级完整毛片| 精品99999| 国产丝袜美腿一区二区三区| 国产午夜精品一区二区三区视频 | 国产91清纯白嫩初高中在线观看| 国产乱码精品一区二区三区五月婷| 麻豆精品在线播放| 麻豆一区二区三| 国产精品69久久久久水密桃| 成人一区二区在线观看| 色综合天天在线| 日韩欧美的一区| 久久亚洲精品小早川怜子| 久久久影院官网| 亚洲欧洲99久久| 亚洲一区二区三区视频在线播放| 亚洲一区二区av在线| 蜜桃av一区二区在线观看| 国产精品一区二区黑丝| 成人晚上爱看视频| 欧美主播一区二区三区美女| 欧美嫩在线观看| 久久香蕉国产线看观看99| 日韩一区欧美一区| 亚洲成人久久影院| 国产在线视频一区二区| 91最新地址在线播放| 91.com视频| 国产精品久久久久久久蜜臀 | 一区二区三区四区精品在线视频| 天天色天天爱天天射综合| 韩国成人在线视频| 一本到不卡精品视频在线观看| 678五月天丁香亚洲综合网| 国产亚洲短视频| 亚洲国产精品精华液网站| 国产一区二区美女诱惑| 色呦呦网站一区| 久久无码av三级| 亚洲高清一区二区三区| 国产suv一区二区三区88区| 欧美三级电影网| 日本一区二区三区在线观看| 日本一道高清亚洲日美韩| 91丨九色丨蝌蚪丨老版| 欧美大片免费久久精品三p| 亚洲伦理在线精品| 国产一区激情在线| 欧美日韩久久久一区| 国产精品久久久久aaaa| 美女视频第一区二区三区免费观看网站 | 国产欧美一区二区三区在线老狼| 亚洲午夜在线电影| 成av人片一区二区| 日韩一区二区三区免费看| 亚洲精品国产精华液| 国产成人免费在线视频| 日韩一区二区精品在线观看| 亚洲综合久久久久| 91在线精品秘密一区二区| 国产色婷婷亚洲99精品小说| 轻轻草成人在线| 亚洲精品一区二区精华| 亚洲第四色夜色| 91久久精品一区二区| 国产精品理论在线观看| 国产不卡免费视频| 久久综合中文字幕| 麻豆国产精品视频| 日韩一二三区不卡| 午夜日韩在线电影| 欧美日韩免费高清一区色橹橹 | 欧美图区在线视频| 一区二区三区.www| 在线精品视频一区二区三四| 亚洲丝袜美腿综合| 91蜜桃传媒精品久久久一区二区| 国产精品少妇自拍| gogo大胆日本视频一区| 日韩一区在线看| 91丨九色丨黑人外教| 亚洲嫩草精品久久| 欧美最猛性xxxxx直播|