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

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

?? ice_strans.c

?? 一個開源的sip源代碼
?? C
?? 第 1 頁 / 共 3 頁
字號:
	    if (ifs[i].s_addr == comp->local_addr.ipv4.sin_addr.s_addr) {
		set_default = PJ_TRUE;
		local_pref = 65535;
	    } else {
		set_default = PJ_FALSE;
		local_pref = 0;
	    }

	    status = add_cand(ice_st, comp, comp_id, 
			      PJ_ICE_CAND_TYPE_HOST, 
			      local_pref, &cand_addr, set_default);
	    if (status != PJ_SUCCESS)
		goto on_error;
	}


    } else if ((options & PJ_ICE_ST_OPT_DONT_ADD_CAND)==0) {
	/* Socket is bound to specific address. 
	 * In this case only add that address as a single entry in the
	 * cand_list table.
	 */
	status = add_cand(ice_st, comp, comp_id, 
			  PJ_ICE_CAND_TYPE_HOST, 
			  65535, &comp->local_addr.ipv4,
			  PJ_TRUE);
	if (status != PJ_SUCCESS)
	    goto on_error;

    } else if (options & PJ_ICE_ST_OPT_DONT_ADD_CAND) {
	/* If application doesn't want to add candidate, just fix local_addr
	 * in case its value is zero.
	 */
	if (comp->local_addr.ipv4.sin_addr.s_addr == 0) {
	    status = pj_gethostip(&comp->local_addr.ipv4.sin_addr);
	    if (status != PJ_SUCCESS)
		return status;
	}
    }


    /* Done */
    if (p_comp)
	*p_comp = comp;

    return PJ_SUCCESS;

on_error:
    destroy_component(comp);
    return status;
}

/* 
 * This is callback called by ioqueue on incoming packet 
 */
static void on_read_complete(pj_ioqueue_key_t *key, 
                             pj_ioqueue_op_key_t *op_key, 
                             pj_ssize_t bytes_read)
{
    pj_ice_strans_comp *comp = (pj_ice_strans_comp*) 
			    pj_ioqueue_get_user_data(key);
    pj_ice_strans *ice_st = comp->ice_st;
    pj_ssize_t pkt_size;
    enum { RETRY = 4 };
    unsigned retry;
    pj_status_t status;

    if (bytes_read > 0) {
	/*
	 * Okay, we got a packet from the socket for the component. There is
	 * a bit of situation here, since this packet could be one of these:
	 *
	 * 1) this could be the response of STUN binding request sent by
	 *    this component to a) an initial request to get the STUN mapped
	 *    address of this component, or b) subsequent request to keep
	 *    the binding alive.
	 * 
	 * 2) this could be a packet (STUN or not STUN) sent from the STUN
	 *    relay server. In this case, still there are few options to do
	 *    for this packet: a) process this locally if this packet is
	 *    related to TURN session management (e.g. Allocate response),
	 *    b) forward this packet to ICE if this is related to ICE
	 *    discovery process.
	 *
	 * 3) this could be a STUN request or response sent as part of ICE
	 *    discovery process.
	 *
	 * 4) this could be application's packet, e.g. when ICE processing
	 *    is done and agents start sending RTP/RTCP packets to each
	 *    other, or when ICE processing is not done and this ICE stream
	 *    transport decides to allow sending data.
	 *
	 * So far we don't have good solution for this.
	 * The process below is just a workaround.
	 */
	status = pj_stun_msg_check(comp->pkt, bytes_read, 
				   PJ_STUN_IS_DATAGRAM);

	if (status == PJ_SUCCESS) {
	    if (ice_st->ice==NULL ||
		(comp->stun_sess &&
		 pj_memcmp(comp->pkt+8, comp->ka_tsx_id, 12) == 0)) 
	    {
		status = pj_stun_session_on_rx_pkt(comp->stun_sess, comp->pkt,
						   bytes_read, 
						   PJ_STUN_IS_DATAGRAM, NULL,
						   &comp->src_addr, 
						   comp->src_addr_len);
	    } else if (ice_st->ice) {
		PJ_TODO(DISTINGUISH_BETWEEN_LOCAL_AND_RELAY);

		TRACE_PKT((comp->ice_st->obj_name, 
			  "Component %d RX packet from %s:%d",
			  comp->comp_id,
			  pj_inet_ntoa(comp->src_addr.ipv4.sin_addr),
			  (int)pj_ntohs(comp->src_addr.ipv4.sin_port)));

		status = pj_ice_sess_on_rx_pkt(ice_st->ice, comp->comp_id, 
					       comp->pkt, bytes_read,
					       &comp->src_addr, 
					       comp->src_addr_len);
	    } else {
		/* This must have been a very late STUN reponse */
	    }
	} else {
	    (*ice_st->cb.on_rx_data)(ice_st, comp->comp_id, 
				     comp->pkt, bytes_read, 
				     &comp->src_addr, comp->src_addr_len);
	}

    } else if (bytes_read < 0) {
	ice_st_perror(comp->ice_st, "ioqueue read callback error", 
		      -bytes_read);
    }

    /* Read next packet */
    for (retry=0; retry<RETRY; ++retry) {
	pkt_size = sizeof(comp->pkt);
	comp->src_addr_len = sizeof(comp->src_addr);
	status = pj_ioqueue_recvfrom(key, op_key, comp->pkt, &pkt_size, 
				     PJ_IOQUEUE_ALWAYS_ASYNC,
				     &comp->src_addr, &comp->src_addr_len);
	if (status != PJ_SUCCESS && status != PJ_EPENDING) {
	    ice_st_perror(comp->ice_st, "ioqueue recvfrom() error", status);
	} else {
	    break;
	}
    }
}

/* 
 * Destroy a component 
 */
static void destroy_component(pj_ice_strans_comp *comp)
{
    if (comp->stun_sess) {
	pj_stun_session_destroy(comp->stun_sess);
	comp->stun_sess = NULL;
    }

    if (comp->key) {
	pj_ioqueue_unregister(comp->key);
	comp->key = NULL;
	comp->sock = PJ_INVALID_SOCKET;
    } else if (comp->sock != PJ_INVALID_SOCKET && comp->sock != 0) {
	pj_sock_close(comp->sock);
	comp->sock = PJ_INVALID_SOCKET;
    }
}


/* STUN keep-alive timer callback */
static void ka_timer_cb(pj_timer_heap_t *th, pj_timer_entry *te)
{
    pj_ice_strans *ice_st = (pj_ice_strans*)te->user_data;
    unsigned i;
    pj_status_t status;

    PJ_UNUSED_ARG(th);

    ice_st->ka_timer.id = PJ_FALSE;

    for (i=0; i<ice_st->comp_cnt; ++i) {
	pj_ice_strans_comp *comp = ice_st->comp[i];
	pj_stun_tx_data *tdata;
	unsigned j;

	/* Does this component have STUN server reflexive candidate? */
	for (j=0; j<comp->cand_cnt; ++j) {
	    if (comp->cand_list[j].type == PJ_ICE_CAND_TYPE_SRFLX)
		break;
	}
	if (j == comp->cand_cnt)
	    continue;

	/* Create STUN binding request */
	status = pj_stun_session_create_req(comp->stun_sess,
					    PJ_STUN_BINDING_REQUEST, 
					    comp->ka_tsx_id, &tdata);
	if (status != PJ_SUCCESS)
	    continue;

	/* tdata->user_data is NULL for keep-alive */
	tdata->user_data = NULL;

	/* Send STUN binding request */
	PJ_LOG(5,(ice_st->obj_name, "Sending STUN keep-alive"));
	status = pj_stun_session_send_msg(comp->stun_sess, PJ_FALSE, 
					  &ice_st->stun_srv, 
					  sizeof(pj_sockaddr_in), tdata);
    }

    /* Start next timer */
    start_ka_timer(ice_st);
}

/* Start STUN keep-alive timer */
static void start_ka_timer(pj_ice_strans *ice_st)
{
    pj_time_val delay;

    /* Skip if timer is already running */
    if (ice_st->ka_timer.id != PJ_FALSE)
	return;

    delay.sec = PJ_ICE_ST_KEEP_ALIVE_MIN;
    delay.msec = pj_rand() % (PJ_ICE_ST_KEEP_ALIVE_MAX_RAND * 1000);
    pj_time_val_normalize(&delay);

    ice_st->ka_timer.cb = &ka_timer_cb;
    ice_st->ka_timer.user_data = ice_st;
    
    if (pj_timer_heap_schedule(ice_st->stun_cfg.timer_heap, 
			       &ice_st->ka_timer, &delay)==PJ_SUCCESS)
    {
	ice_st->ka_timer.id = PJ_TRUE;
    }
}


/* Stop STUN keep-alive timer */
static void stop_ka_timer(pj_ice_strans *ice_st)
{
    /* Skip if timer is already stop */
    if (ice_st->ka_timer.id == PJ_FALSE)
	return;

    pj_timer_heap_cancel(ice_st->stun_cfg.timer_heap, &ice_st->ka_timer);
    ice_st->ka_timer.id = PJ_FALSE;
}


/*
 * Add STUN mapping to a component.
 */
static pj_status_t get_stun_mapped_addr(pj_ice_strans *ice_st,
					pj_ice_strans_comp *comp)
{
    pj_ice_strans_cand *cand;
    pj_stun_session_cb sess_cb;
    pj_stun_tx_data *tdata;
    pj_status_t status;

    PJ_ASSERT_RETURN(ice_st && comp, PJ_EINVAL);
    
    /* Bail out if STUN server is still being resolved */
    if (ice_st->has_rjob)
	return PJ_EBUSY;

    /* Just return (successfully) if STUN server is not configured */
    if (ice_st->stun_srv.sin_family == 0)
	return PJ_SUCCESS;


    /* Create STUN session for this component */
    pj_bzero(&sess_cb, sizeof(sess_cb));
    sess_cb.on_request_complete = &stun_on_request_complete;
    sess_cb.on_send_msg = &stun_on_send_msg;
    status = pj_stun_session_create(&ice_st->stun_cfg, ice_st->obj_name,
				    &sess_cb, PJ_FALSE, &comp->stun_sess);
    if (status != PJ_SUCCESS)
	return status;

    /* Associate component with STUN session */
    pj_stun_session_set_user_data(comp->stun_sess, (void*)comp);

    /* Create STUN binding request */
    status = pj_stun_session_create_req(comp->stun_sess, 
					PJ_STUN_BINDING_REQUEST, 
					comp->ka_tsx_id, 
					&tdata);
    if (status != PJ_SUCCESS)
	return status;

    /* Attach alias instance to tdata */
    cand = &comp->cand_list[comp->cand_cnt];
    tdata->user_data = (void*)cand;

    /* Send STUN binding request */
    status = pj_stun_session_send_msg(comp->stun_sess, PJ_FALSE, 
				      &ice_st->stun_srv, 
				      sizeof(pj_sockaddr_in), tdata);
    if (status != PJ_SUCCESS)
	return status;


    /* Add new alias to this component */
    cand->type = PJ_ICE_CAND_TYPE_SRFLX;
    cand->status = PJ_EPENDING;
    cand->ice_cand_id = -1;
    cand->local_pref = 65535;
    pj_ice_calc_foundation(ice_st->pool, &cand->foundation, 
			   PJ_ICE_CAND_TYPE_SRFLX, &comp->local_addr);

    ++comp->cand_cnt;

    /* Add pending count for this component */
    comp->pending_cnt++;

    return PJ_SUCCESS;
}


/*
 * Create the component.
 */
PJ_DEF(pj_status_t) pj_ice_strans_create_comp(pj_ice_strans *ice_st,
					      unsigned comp_id,
					      pj_uint32_t options,
					      const pj_sockaddr_in *addr)
{
    pj_ice_strans_comp *comp = NULL;
    pj_status_t status;

    /* Verify arguments */
    PJ_ASSERT_RETURN(ice_st && comp_id, PJ_EINVAL);

    /* Check that component ID present */
    PJ_ASSERT_RETURN(comp_id <= ice_st->comp_cnt, PJNATH_EICEINCOMPID);

    /* Can't add new component while ICE is running */
    PJ_ASSERT_RETURN(ice_st->ice == NULL, PJ_EBUSY);
    
    /* Can't add new component while resolver is running */
    PJ_ASSERT_RETURN(ice_st->has_rjob == PJ_FALSE, PJ_EBUSY);


    /* Create component */
    status = create_component(ice_st, comp_id, options, addr, &comp);
    if (status != PJ_SUCCESS)
	return status;

    if ((options & PJ_ICE_ST_OPT_DISABLE_STUN) == 0) {
	status = get_stun_mapped_addr(ice_st, comp);
	if (status != PJ_SUCCESS) {
	    destroy_component(comp);
	    return status;
	}
    }

    /* Store this component */
    ice_st->comp[comp_id-1] = comp;

    return PJ_SUCCESS;
}


PJ_DEF(pj_status_t) pj_ice_strans_add_cand( pj_ice_strans *ice_st,
					    unsigned comp_id,
					    pj_ice_cand_type type,
					    pj_uint16_t local_pref,
					    const pj_sockaddr_in *addr,
					    pj_bool_t set_default)
{
    pj_ice_strans_comp *comp;


    PJ_ASSERT_RETURN(ice_st && comp_id && addr, PJ_EINVAL);
    PJ_ASSERT_RETURN(comp_id <= ice_st->comp_cnt, PJ_EINVAL);
    PJ_ASSERT_RETURN(ice_st->comp[comp_id-1] != NULL, PJ_EINVALIDOP);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区三区在线观看视频| 国产精品伦一区二区三级视频| 亚洲男人天堂一区| 欧美午夜视频网站| 亚洲精品成人少妇| 欧美三级日韩三级国产三级| 日韩电影在线一区二区| 精品国产成人系列| 波多野结衣视频一区| 亚洲男人的天堂在线观看| 欧美日韩在线综合| 久草中文综合在线| 亚洲素人一区二区| 欧美一区二区视频在线观看2020 | 欧美mv日韩mv国产网站| 精品亚洲porn| 成人免费在线视频| 制服丝袜亚洲网站| 成人免费观看视频| 亚洲国产婷婷综合在线精品| 精品人在线二区三区| 99re免费视频精品全部| 午夜在线电影亚洲一区| 久久久久久免费网| 欧美亚洲日本一区| 国产成人综合精品三级| 亚洲一区国产视频| 欧美国产日韩亚洲一区| 欧美一区午夜视频在线观看| 国产99久久久久久免费看农村| 亚洲乱码国产乱码精品精98午夜 | 97se亚洲国产综合自在线| 午夜亚洲福利老司机| 国产欧美精品一区| 欧美精品久久天天躁| 成人免费视频网站在线观看| 美女免费视频一区| 一级日本不卡的影视| 国产亚洲精品资源在线26u| 欧美日韩一区在线观看| 国产91清纯白嫩初高中在线观看| 视频一区欧美精品| 亚洲视频在线一区二区| 2021国产精品久久精品| 欧美电影在哪看比较好| 99久久综合精品| 国产在线精品一区二区 | 日本中文在线一区| 亚洲激情在线激情| 国产日产精品一区| 精品久久久久久久久久久久久久久久久 | 国产精品人妖ts系列视频| 欧美精品粉嫩高潮一区二区| 91亚洲精品一区二区乱码| 国产做a爰片久久毛片| 首页亚洲欧美制服丝腿| 亚洲精选一二三| 国产精品久久久久久久久果冻传媒| 欧美v日韩v国产v| 日韩欧美亚洲一区二区| 欧美日韩一区小说| 欧美四级电影网| 在线观看亚洲成人| 欧美性大战xxxxx久久久| 一本色道综合亚洲| 91视频免费播放| 91小宝寻花一区二区三区| 成人激情免费视频| www.性欧美| jlzzjlzz欧美大全| 成人aaaa免费全部观看| 本田岬高潮一区二区三区| 成人激情校园春色| 成人免费的视频| 不卡一卡二卡三乱码免费网站| 丁香婷婷综合五月| 99免费精品视频| 日本福利一区二区| 欧美视频三区在线播放| 欧美日韩综合在线免费观看| 欧美视频日韩视频在线观看| 欧美日韩亚洲综合一区| 欧美最新大片在线看| 欧美色男人天堂| 日韩一区二区在线观看| 精品国产在天天线2019| 国产欧美一区二区精品久导航| 欧美激情中文不卡| 亚洲女同女同女同女同女同69| 亚洲精品伦理在线| 亚洲成人av免费| 狠狠色综合播放一区二区| 国产经典欧美精品| 91在线视频免费91| 欧美日韩国产片| 欧美大片日本大片免费观看| 国产片一区二区| 亚洲女性喷水在线观看一区| 天堂蜜桃一区二区三区| 狠狠狠色丁香婷婷综合激情| 高清成人在线观看| 欧美视频在线不卡| 日韩精品在线看片z| 亚洲国产精品ⅴa在线观看| 一区二区在线观看视频在线观看| 日韩国产精品久久久久久亚洲| 国产一区二区三区黄视频| 99re66热这里只有精品3直播 | 国产精品白丝jk白祙喷水网站| 成人夜色视频网站在线观看| 日本高清不卡视频| 日韩精品资源二区在线| 日韩一区欧美一区| 青青草97国产精品免费观看 | 国产精品视频免费| 亚洲一二三专区| 国产精品自在在线| 91极品视觉盛宴| 欧美精品一区二区三区四区 | 久久精品一区二区三区不卡 | 欧美电影精品一区二区| 国产精品的网站| 精品在线一区二区| 在线影院国内精品| 欧美极品xxx| 天堂影院一区二区| av电影在线观看一区| 91精品国产色综合久久不卡电影| 中文子幕无线码一区tr| 美国一区二区三区在线播放| 色综合久久久网| 久久精品夜夜夜夜久久| 日本最新不卡在线| 欧美午夜精品电影| 欧美激情一区二区三区全黄| 日本女优在线视频一区二区| 日本韩国欧美在线| 中文字幕一区二区三区在线观看| 国内精品国产三级国产a久久| 欧美性猛交xxxx乱大交退制版| 国产精品天美传媒| 国产麻豆视频一区| 欧美一区二区三区在线| 亚洲一区二区三区四区在线 | 成人性生交大合| 2022国产精品视频| 裸体一区二区三区| 欧美日韩高清影院| 亚洲一二三级电影| 欧美亚洲丝袜传媒另类| 亚洲欧美国产77777| 99在线视频精品| 国产精品久久福利| 国产成人在线网站| 国产午夜精品一区二区三区视频 | 尤物视频一区二区| 色哟哟国产精品免费观看| 国产欧美日韩在线观看| 国产精品中文有码| 国产午夜亚洲精品羞羞网站| 久久电影国产免费久久电影| 欧美精品乱码久久久久久| 午夜精品久久久久久久| 欧美在线观看一二区| 亚洲图片欧美色图| 欧美日本在线观看| 日韩国产精品久久| 日韩免费观看高清完整版在线观看| 爽爽淫人综合网网站| 91精品国产免费| 精品一二三四在线| 中文字幕精品一区二区精品绿巨人 | 免费欧美在线视频| 精品免费国产一区二区三区四区| 九九视频精品免费| 国产视频一区在线观看| 国产不卡在线一区| 亚洲欧美视频一区| 欧美三级电影网站| 美女在线一区二区| 久久老女人爱爱| 91网站黄www| 午夜成人免费电影| 欧美成人猛片aaaaaaa| 国产精品99久久久久| 国产精品久久久久影院老司| 91官网在线观看| 另类小说综合欧美亚洲| 国产清纯美女被跳蛋高潮一区二区久久w | 91视频在线观看免费| 亚洲成人福利片| 精品久久久久久久久久久久包黑料 | 亚洲六月丁香色婷婷综合久久 | 日韩一区和二区| 成人丝袜18视频在线观看| 亚洲精品日日夜夜| 日韩一区二区电影| 99国产精品久久久| 午夜精品久久久久久久久| 久久理论电影网|