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

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

?? siprtp.c

?? 基于sip協議的網絡電話源碼
?? C
?? 第 1 頁 / 共 4 頁
字號:
    /* Attach call data to invite session */    call->inv->mod_data[mod_siprtp.id] = call;    /* Mark start of call */    pj_gettimeofday(&call->start_time);    /* Create initial INVITE request.     * This INVITE request will contain a perfectly good request and      * an SDP body as well.     */    status = pjsip_inv_invite(call->inv, &tdata);    PJ_ASSERT_RETURN(status == PJ_SUCCESS, status);    /* Send initial INVITE request.      * From now on, the invite session's state will be reported to us     * via the invite session callbacks.     */    status = pjsip_inv_send_msg(call->inv, tdata);    PJ_ASSERT_RETURN(status == PJ_SUCCESS, status);    return PJ_SUCCESS;}/* * Receive incoming call */static void process_incoming_call(pjsip_rx_data *rdata){    unsigned i, options;    struct call *call;    pjsip_dialog *dlg;    pjmedia_sdp_session *sdp;    pjsip_tx_data *tdata;    pj_status_t status;    /* Find free call slot */    for (i=0; i<app.max_calls; ++i) {	if (app.call[i].inv == NULL)	    break;    }    if (i == app.max_calls) {	const pj_str_t reason = pj_str("Too many calls");	pjsip_endpt_respond_stateless( app.sip_endpt, rdata, 				       500, &reason,				       NULL, NULL);	return;    }    call = &app.call[i];    /* Verify that we can handle the request. */    options = 0;    status = pjsip_inv_verify_request(rdata, &options, NULL, NULL,  				   app.sip_endpt, &tdata);    if (status != PJ_SUCCESS) {	/*	 * No we can't handle the incoming INVITE request.	 */	if (tdata) {	    pjsip_response_addr res_addr;	    	    pjsip_get_response_addr(tdata->pool, rdata, &res_addr);	    pjsip_endpt_send_response(app.sip_endpt, &res_addr, tdata,		NULL, NULL);	    	} else {	    	    /* Respond with 500 (Internal Server Error) */	    pjsip_endpt_respond_stateless(app.sip_endpt, rdata, 500, NULL,		NULL, NULL);	}		return;    }    /* Create UAS dialog */    status = pjsip_dlg_create_uas( pjsip_ua_instance(), rdata,				   &app.local_contact, &dlg);    if (status != PJ_SUCCESS) {	const pj_str_t reason = pj_str("Unable to create dialog");	pjsip_endpt_respond_stateless( app.sip_endpt, rdata, 				       500, &reason,				       NULL, NULL);	return;    }    /* Create SDP */    create_sdp( dlg->pool, call, &sdp);    /* Create UAS invite session */    status = pjsip_inv_create_uas( dlg, rdata, sdp, 0, &call->inv);    if (status != PJ_SUCCESS) {	pjsip_dlg_create_response(dlg, rdata, 500, NULL, &tdata);	pjsip_dlg_send_response(dlg, pjsip_rdata_get_tsx(rdata), tdata);	return;    }        /* Attach call data to invite session */    call->inv->mod_data[mod_siprtp.id] = call;    /* Mark start of call */    pj_gettimeofday(&call->start_time);    /* Create 200 response .*/    status = pjsip_inv_initial_answer(call->inv, rdata, 200, 				      NULL, NULL, &tdata);    if (status != PJ_SUCCESS) {	status = pjsip_inv_initial_answer(call->inv, rdata, 					  PJSIP_SC_NOT_ACCEPTABLE,					  NULL, NULL, &tdata);	if (status == PJ_SUCCESS)	    pjsip_inv_send_msg(call->inv, tdata); 	else	    pjsip_inv_terminate(call->inv, 500, PJ_FALSE);	return;    }    /* Send the 200 response. */      status = pjsip_inv_send_msg(call->inv, tdata);     PJ_ASSERT_ON_FAIL(status == PJ_SUCCESS, return);    /* Done */}/* Callback to be called when dialog has forked: */static void call_on_forked(pjsip_inv_session *inv, pjsip_event *e){    PJ_UNUSED_ARG(inv);    PJ_UNUSED_ARG(e);    PJ_TODO( HANDLE_FORKING );}/* Callback to be called to handle incoming requests outside dialogs: */static pj_bool_t on_rx_request( pjsip_rx_data *rdata ){    /* Ignore strandled ACKs (must not send respone */    if (rdata->msg_info.msg->line.req.method.id == PJSIP_ACK_METHOD)	return PJ_FALSE;    /* Respond (statelessly) any non-INVITE requests with 500  */    if (rdata->msg_info.msg->line.req.method.id != PJSIP_INVITE_METHOD) {	pj_str_t reason = pj_str("Unsupported Operation");	pjsip_endpt_respond_stateless( app.sip_endpt, rdata, 				       500, &reason,				       NULL, NULL);	return PJ_TRUE;    }    /* Handle incoming INVITE */    process_incoming_call(rdata);    /* Done */    return PJ_TRUE;}/* Callback timer to disconnect call (limiting call duration) */static void timer_disconnect_call( pj_timer_heap_t *timer_heap,				   struct pj_timer_entry *entry){    struct call *call = entry->user_data;    PJ_UNUSED_ARG(timer_heap);    entry->id = 0;    hangup_call(call->index);}/* Callback to be called when invite session's state has changed: */static void call_on_state_changed( pjsip_inv_session *inv, 				   pjsip_event *e){    struct call *call = inv->mod_data[mod_siprtp.id];    PJ_UNUSED_ARG(e);    if (!call)	return;    if (inv->state == PJSIP_INV_STATE_DISCONNECTED) {		pj_time_val null_time = {0, 0};	if (call->d_timer.id != 0) {	    pjsip_endpt_cancel_timer(app.sip_endpt, &call->d_timer);	    call->d_timer.id = 0;	}	PJ_LOG(3,(THIS_FILE, "Call #%d disconnected. Reason=%d (%.*s)",		  call->index,		  inv->cause,		  (int)inv->cause_text.slen,		  inv->cause_text.ptr));	PJ_LOG(3,(THIS_FILE, "Call #%d statistics:", call->index));	print_call(call->index);	call->inv = NULL;	inv->mod_data[mod_siprtp.id] = NULL;	destroy_call_media(call->index);	call->start_time = null_time;	call->response_time = null_time;	call->connect_time = null_time;	++app.uac_calls;    } else if (inv->state == PJSIP_INV_STATE_CONFIRMED) {	pj_time_val t;	pj_gettimeofday(&call->connect_time);	if (call->response_time.sec == 0)	    call->response_time = call->connect_time;	t = call->connect_time;	PJ_TIME_VAL_SUB(t, call->start_time);	PJ_LOG(3,(THIS_FILE, "Call #%d connected in %d ms", call->index,		  PJ_TIME_VAL_MSEC(t)));	if (app.duration != 0) {	    call->d_timer.id = 1;	    call->d_timer.user_data = call;	    call->d_timer.cb = &timer_disconnect_call;	    t.sec = app.duration;	    t.msec = 0;	    pjsip_endpt_schedule_timer(app.sip_endpt, &call->d_timer, &t);	}    } else if (	inv->state == PJSIP_INV_STATE_EARLY ||		inv->state == PJSIP_INV_STATE_CONNECTING) {	if (call->response_time.sec == 0)	    pj_gettimeofday(&call->response_time);    }}/* Utility */static void app_perror(const char *sender, const char *title, 		       pj_status_t status){    char errmsg[PJ_ERR_MSG_SIZE];    pj_strerror(status, errmsg, sizeof(errmsg));    PJ_LOG(3,(sender, "%s: %s [status=%d]", title, errmsg, status));}/* Worker thread for SIP */static int sip_worker_thread(void *arg){    PJ_UNUSED_ARG(arg);    while (!app.thread_quit) {	pj_time_val timeout = {0, 10};	pjsip_endpt_handle_events(app.sip_endpt, &timeout);    }    return 0;}/* Init application options */static pj_status_t init_options(int argc, char *argv[]){    static char ip_addr[32];    static char local_uri[64];    enum { OPT_START,	   OPT_APP_LOG_LEVEL, OPT_LOG_FILE, 	   OPT_A_PT, OPT_A_NAME, OPT_A_CLOCK, OPT_A_BITRATE, OPT_A_PTIME,	   OPT_REPORT_FILE };    struct pj_getopt_option long_options[] = {	{ "count",	    1, 0, 'c' },	{ "duration",	    1, 0, 'd' },	{ "auto-quit",	    0, 0, 'q' },	{ "local-port",	    1, 0, 'p' },	{ "rtp-port",	    1, 0, 'r' },	{ "ip-addr",	    1, 0, 'i' },	{ "log-level",	    1, 0, 'l' },	{ "app-log-level",  1, 0, OPT_APP_LOG_LEVEL },	{ "log-file",	    1, 0, OPT_LOG_FILE },	{ "report-file",    1, 0, OPT_REPORT_FILE },	/* Don't support this anymore, see comments in USAGE above.	{ "a-pt",	    1, 0, OPT_A_PT },	{ "a-name",	    1, 0, OPT_A_NAME },	{ "a-clock",	    1, 0, OPT_A_CLOCK },	{ "a-bitrate",	    1, 0, OPT_A_BITRATE },	{ "a-ptime",	    1, 0, OPT_A_PTIME },	*/	{ NULL, 0, 0, 0 },    };    int c;    int option_index;    /* Get local IP address for the default IP address */    {	const pj_str_t *hostname;	pj_sockaddr_in tmp_addr;	char *addr;	hostname = pj_gethostname();	pj_sockaddr_in_init(&tmp_addr, hostname, 0);	addr = pj_inet_ntoa(tmp_addr.sin_addr);	pj_ansi_strcpy(ip_addr, addr);    }    /* Init defaults */    app.max_calls = 1;    app.thread_count = 1;    app.sip_port = 5060;    app.rtp_start_port = RTP_START_PORT;    app.local_addr = pj_str(ip_addr);    app.log_level = 5;    app.app_log_level = 3;    app.log_filename = NULL;    /* Default codecs: */    app.audio_codec = audio_codecs[0];    /* Parse options */    pj_optind = 0;    while((c=pj_getopt_long(argc,argv, "c:d:p:r:i:l:q", 			    long_options, &option_index))!=-1)     {	switch (c) {	case 'c':	    app.max_calls = atoi(pj_optarg);	    if (app.max_calls < 0 || app.max_calls > MAX_CALLS) {		PJ_LOG(3,(THIS_FILE, "Invalid max calls value %s", pj_optarg));		return 1;	    }	    break;	case 'd':	    app.duration = atoi(pj_optarg);	    break;	case 'q':	    app.auto_quit = 1;	    break;	case 'p':	    app.sip_port = atoi(pj_optarg);	    break;	case 'r':	    app.rtp_start_port = atoi(pj_optarg);	    break;	case 'i':	    app.local_addr = pj_str(pj_optarg);	    break;	case 'l':	    app.log_level = atoi(pj_optarg);	    break;	case OPT_APP_LOG_LEVEL:	    app.app_log_level = atoi(pj_optarg);	    break;	case OPT_LOG_FILE:	    app.log_filename = pj_optarg;	    break;	case OPT_A_PT:	    app.audio_codec.pt = atoi(pj_optarg);	    break;	case OPT_A_NAME:	    app.audio_codec.name = pj_optarg;	    break;	case OPT_A_CLOCK:	    app.audio_codec.clock_rate = atoi(pj_optarg);	    break;	case OPT_A_BITRATE:	    app.audio_codec.bit_rate = atoi(pj_optarg);	    break;	case OPT_A_PTIME:	    app.audio_codec.ptime = atoi(pj_optarg);	    break;	case OPT_REPORT_FILE:	    app.report_filename = pj_optarg;	    break;	default:	    puts(USAGE);	    return 1;	}    }    /* Check if URL is specified */    if (pj_optind < argc)	app.uri_to_call = pj_str(argv[pj_optind]);    /* Build local URI and contact */    pj_ansi_sprintf( local_uri, "sip:%s:%d", app.local_addr.ptr, app.sip_port);    app.local_uri = pj_str(local_uri);    app.local_contact = app.local_uri;    return PJ_SUCCESS;}/***************************************************************************** * MEDIA STUFFS *//* * Create SDP session for a call. */static pj_status_t create_sdp( pj_pool_t *pool,			       struct call *call,			       pjmedia_sdp_session **p_sdp){    pj_time_val tv;    pjmedia_sdp_session *sdp;    pjmedia_sdp_media *m;    pjmedia_sdp_attr *attr;    pjmedia_transport_udp_info tpinfo;    struct media_stream *audio = &call->media[0];    PJ_ASSERT_RETURN(pool && p_sdp, PJ_EINVAL);    /* Get transport info */    pjmedia_transport_udp_get_info(audio->transport, &tpinfo);    /* Create and initialize basic SDP session */    sdp = pj_pool_zalloc (pool, sizeof(pjmedia_sdp_session));    pj_gettimeofday(&tv);    sdp->origin.user = pj_str("pjsip-siprtp");    sdp->origin.version = sdp->origin.id = tv.sec + 2208988800UL;    sdp->origin.net_type = pj_str("IN");    sdp->origin.addr_type = pj_str("IP4");    sdp->origin.addr = *pj_gethostname();    sdp->name = pj_str("pjsip");    /* Since we only support one media stream at present, put the     * SDP connection line in the session level.     */    sdp->conn = pj_pool_zalloc (pool, sizeof(pjmedia_sdp_conn));    sdp->conn->net_type = pj_str("IN");    sdp->conn->addr_type = pj_str("IP4");    sdp->conn->addr = app.local_addr;    /* SDP time and attributes. */    sdp->time.start = sdp->time.stop = 0;    sdp->attr_count = 0;    /* Create media stream 0: */    sdp->media_count = 1;    m = pj_pool_zalloc (pool, sizeof(pjmedia_sdp_media));    sdp->media[0] = m;    /* Standard media info: */    m->desc.media = pj_str("audio");    m->desc.port = pj_ntohs(tpinfo.skinfo.rtp_addr_name.sin_port);    m->desc.port_count = 1;    m->desc.transport = pj_str("RTP/AVP");    /* Add format and rtpmap for each codec. */    m->desc.fmt_count = 1;    m->attr_count = 0;    {	pjmedia_sdp_rtpmap rtpmap;	pjmedia_sdp_attr *attr;	char ptstr[10];	sprintf(ptstr, "%d", app.audio_codec.pt);	pj_strdup2(pool, &m->desc.fmt[0], ptstr);	rtpmap.pt = m->desc.fmt[0];	rtpmap.clock_rate = app.audio_codec.clock_rate;	rtpmap.enc_name = pj_str(app.audio_codec.name);	rtpmap.param.slen = 0;	pjmedia_sdp_rtpmap_to_attr(pool, &rtpmap, &attr);	m->attr[m->attr_count++] = attr;    }    /* Add sendrecv attribute. */    attr = pj_pool_zalloc(pool, sizeof(pjmedia_sdp_attr));    attr->name = pj_str("sendrecv");    m->attr[m->attr_count++] = attr;#if 1    /*     * Add support telephony event     */    m->desc.fmt[m->desc.fmt_count++] = pj_str("121");    /* Add rtpmap. */    attr = pj_pool_zalloc(pool, sizeof(pjmedia_sdp_attr));    attr->name = pj_str("rtpmap");    attr->value = pj_str("121 telephone-event/8000");    m->attr[m->attr_count++] = attr;    /* Add fmtp */    attr = pj_pool_zalloc(pool, sizeof(pjmedia_sdp_attr));    attr->name = pj_str("fmtp");    attr->value = pj_str("121 0-15");    m->attr[m->attr_count++] = attr;#endif    /* Done */    *p_sdp = sdp;    return PJ_SUCCESS;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲国产精品激情在线观看| 99在线精品观看| 欧美日韩中文字幕一区二区| 亚洲欧美精品午睡沙发| 日本视频一区二区| 91.麻豆视频| 午夜精品福利一区二区三区av| 欧美群妇大交群中文字幕| 亚洲精品日日夜夜| 色婷婷国产精品综合在线观看| 久久久一区二区三区捆绑**| 国产suv精品一区二区883| 久久久久久99精品| 精品一区二区三区视频| 久久久av毛片精品| 成人在线综合网站| 国产欧美一区二区精品秋霞影院| 97久久精品人人澡人人爽| 中文字幕在线不卡视频| caoporn国产精品| 亚洲成人在线网站| 欧美电视剧免费全集观看| 日本网站在线观看一区二区三区 | 久久成人免费网| 精品久久久久久久一区二区蜜臀| 激情成人午夜视频| 中文字幕亚洲欧美在线不卡| 国产999精品久久| 中文字幕在线一区免费| 91网址在线看| 韩国成人精品a∨在线观看| 国产三级三级三级精品8ⅰ区| 国产不卡免费视频| 亚洲成人综合在线| 久久精品在线观看| 欧美亚洲综合网| 国产乱子伦一区二区三区国色天香| 欧美国产乱子伦| 欧美性欧美巨大黑白大战| 国产精品伊人色| 综合欧美亚洲日本| 欧美一区二区三区性视频| 成人av影院在线| 午夜激情久久久| 国产色产综合色产在线视频| 91精品久久久久久久99蜜桃| 国产成人精品免费视频网站| 国产欧美精品国产国产专区 | 成人国产电影网| 日本中文字幕一区二区有限公司| 久久中文娱乐网| 91蜜桃在线观看| 国产专区欧美精品| 一个色综合网站| 久久亚洲捆绑美女| 337p亚洲精品色噜噜| 国产91富婆露脸刺激对白| 亚洲午夜久久久久久久久久久| 久久精品亚洲乱码伦伦中文| 在线观看91视频| 成人一区二区视频| 国产乱淫av一区二区三区| 亚洲第一主播视频| 777午夜精品视频在线播放| 成人精品鲁一区一区二区| 丝瓜av网站精品一区二区| 欧美激情一区二区三区全黄| 日韩欧美中文一区二区| 91蜜桃网址入口| 三级在线观看一区二区 | 亚洲成人av电影| 久久九九久久九九| 日韩欧美视频在线| 大陆成人av片| 国产精品亚洲人在线观看| 亚洲欧美日韩中文播放| 国产目拍亚洲精品99久久精品| 欧美一级欧美一级在线播放| 在线视频你懂得一区| 国产成人av福利| 国产剧情av麻豆香蕉精品| 婷婷一区二区三区| 日本不卡免费在线视频| 亚洲综合久久久| 夜夜揉揉日日人人青青一国产精品 | 一片黄亚洲嫩模| 国产精品国产三级国产普通话99 | 国产精品久线在线观看| 亚洲天堂免费看| 国产精品网站导航| 日本一区二区三区在线观看| 26uuu成人网一区二区三区| 91蝌蚪porny成人天涯| 成人h动漫精品一区二| 国产在线麻豆精品观看| 国产在线观看一区二区| 日本视频中文字幕一区二区三区| 日韩综合在线视频| 亚洲黄色免费网站| 亚洲国产日韩一区二区| 亚洲天堂av一区| 国产精品成人免费在线| 26uuu久久天堂性欧美| 中文字幕一区二区在线观看| 亚洲欧美在线高清| 亚洲精品成人天堂一二三| 亚洲电影一级片| 日本欧美加勒比视频| 中文文精品字幕一区二区| 国产精品每日更新在线播放网址| 国产精品久久久久婷婷二区次| 国产情人综合久久777777| 成人欧美一区二区三区黑人麻豆| 亚洲欧美日韩在线播放| 中日韩免费视频中文字幕| 一区二区三区日本| 午夜久久电影网| 国产精品一色哟哟哟| 成人丝袜18视频在线观看| 色先锋aa成人| 欧美电影一区二区三区| 欧美r级电影在线观看| 久久蜜桃av一区二区天堂| 亚洲欧美色综合| 久久精品国产成人一区二区三区| 国产精品一区三区| 一本色道久久综合亚洲91| 91麻豆精品国产91久久久资源速度 | 国产免费成人在线视频| 亚洲人成7777| 午夜精品在线看| 久久99国产精品久久99| 成人av电影免费观看| 制服丝袜中文字幕亚洲| 久久久www免费人成精品| 亚洲自拍欧美精品| 国产综合色视频| 欧美性色黄大片手机版| 国产精品乱人伦一区二区| 亚洲成人777| 丁香婷婷综合网| 777a∨成人精品桃花网| 国产精品国产a| 亚洲国产乱码最新视频 | 亚洲三级在线免费| 亚洲最大成人网4388xx| 蜜桃精品在线观看| 91久久精品一区二区| 久久嫩草精品久久久精品| 337p粉嫩大胆噜噜噜噜噜91av| 亚洲激情图片qvod| 国产乱国产乱300精品| eeuss鲁一区二区三区| 26uuu精品一区二区| 图片区日韩欧美亚洲| 国产精品一级在线| 在线观看国产91| 久久午夜免费电影| 天堂av在线一区| 色婷婷av一区二区| 国产精品超碰97尤物18| 日韩电影在线观看一区| 97se狠狠狠综合亚洲狠狠| 日本一区二区三区四区在线视频| 蜜臀av一区二区三区| 99久久免费国产| 国产农村妇女毛片精品久久麻豆| 奇米亚洲午夜久久精品| 欧美色图免费看| 亚洲精品免费看| 色综合天天综合网天天看片| 成人欧美一区二区三区| 国产盗摄一区二区| 精品国产免费视频| 亚洲大型综合色站| 欧美性受xxxx黑人xyx性爽| 国产亚洲人成网站| 看国产成人h片视频| 日韩一区二区在线播放| 日韩黄色片在线观看| 日韩一区二区三区三四区视频在线观看| 亚洲精品成人少妇| 欧美在线999| 亚洲国产精品一区二区www在线| 色88888久久久久久影院野外| 又紧又大又爽精品一区二区| 欧美在线视频日韩| 亚洲v日本v欧美v久久精品| 日韩精品中文字幕一区二区三区 | 亚洲少妇屁股交4| 国产成人在线视频网站| 久久综合久久久久88| 午夜成人免费电影| 在线看不卡av| 一区二区三区欧美在线观看| 欧美亚洲国产一区二区三区| 蜜桃视频一区二区| 久久久久久黄色| 91久久免费观看| 免费观看久久久4p|