⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pjsip-perf.c

📁 基于sip协议的网络电话源码
💻 C
📖 第 1 页 / 共 4 页
字号:
	    } else {		/* Respond with 500 (Internal Server Error) */		pjsip_endpt_respond_stateless(app.sip_endpt, rdata, 500, NULL,					      NULL, NULL);	    }	    return PJ_TRUE;	}     }    /* 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 PJ_TRUE;    }    /* Alloc call structure. */    call = pj_pool_zalloc(dlg->pool, sizeof(struct call));    /* Create SDP from PJMEDIA */    if (app.real_sdp) {	status = pjmedia_endpt_create_sdp(app.med_endpt, rdata->tp_info.pool, 					  app.skinfo_cnt, app.skinfo, 					  &sdp);    } else {	sdp = app.dummy_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 PJ_TRUE;    }        /* Send 100/Trying if needed */    if (app.server.send_trying) {	status = send_response(call->inv, rdata, 100, &has_initial);	if (status != PJ_SUCCESS)	    return PJ_TRUE;    }    /* Send 180/Ringing if needed */    if (app.server.send_ringing) {	status = send_response(call->inv, rdata, 180, &has_initial);	if (status != PJ_SUCCESS)	    return PJ_TRUE;    }    /* Simulate call processing delay */    if (app.server.delay) {	pj_time_val delay;	call->ans_timer.id = 1;	call->ans_timer.user_data = call;	call->ans_timer.cb = &answer_timer_cb;		delay.sec = 0;	delay.msec = app.server.delay;	pj_time_val_normalize(&delay);	pjsip_endpt_schedule_timer(app.sip_endpt, &call->ans_timer, &delay);    } else {	/* Send the 200 response immediately . */  	status = send_response(call->inv, rdata, 200, &has_initial);	PJ_ASSERT_ON_FAIL(status == PJ_SUCCESS, return PJ_TRUE);    }    /* Done */    app.server.cur_state.call_cnt++;    return PJ_TRUE;}/************************************************************************** * Default handler when incoming request is not handled by any other * modules. */static pj_bool_t mod_responder_on_rx_request(pjsip_rx_data *rdata);/* Module to handle incoming requests statelessly. */static pjsip_module mod_responder ={    NULL, NULL,			    /* prev, next.		*/    { "mod-responder", 13 },	    /* Name.			*/    -1,				    /* Id			*/    PJSIP_MOD_PRIORITY_APPLICATION+1, /* Priority		*/    NULL,			    /* load()			*/    NULL,			    /* start()			*/    NULL,			    /* stop()			*/    NULL,			    /* unload()			*/    &mod_responder_on_rx_request,   /* on_rx_request()		*/    NULL,			    /* on_rx_response()		*/    NULL,			    /* on_tx_request.		*/    NULL,			    /* on_tx_response()		*/    NULL,			    /* on_tsx_state()		*/};static pj_bool_t mod_responder_on_rx_request(pjsip_rx_data *rdata){    const pj_str_t reason = pj_str("Not expecting request at this URI");    /*     * Respond any requests (except ACK!) with 500.     */    if (rdata->msg_info.msg->line.req.method.id != PJSIP_ACK_METHOD) {	pjsip_endpt_respond_stateless(app.sip_endpt, rdata, 500, &reason,				      NULL, NULL);    }    return PJ_TRUE;}/***************************************************************************** * Below is a simple module to log all incoming and outgoing SIP messages *//* Notification on incoming messages */static pj_bool_t logger_on_rx_msg(pjsip_rx_data *rdata){    PJ_LOG(3,(THIS_FILE, "RX %d bytes %s from %s %s:%d:\n"			 "%.*s\n"			 "--end msg--",			 rdata->msg_info.len,			 pjsip_rx_data_get_info(rdata),			 rdata->tp_info.transport->type_name,			 rdata->pkt_info.src_name,			 rdata->pkt_info.src_port,			 (int)rdata->msg_info.len,			 rdata->msg_info.msg_buf));        /* Always return false, otherwise messages will not get processed! */    return PJ_FALSE;}/* Notification on outgoing messages */static pj_status_t logger_on_tx_msg(pjsip_tx_data *tdata){        /* Important note:     *	tp_info field is only valid after outgoing messages has passed     *	transport layer. So don't try to access tp_info when the module     *	has lower priority than transport layer.     */    PJ_LOG(3,(THIS_FILE, "TX %d bytes %s to %s %s:%d:\n"			 "%.*s\n"			 "--end msg--",			 (tdata->buf.cur - tdata->buf.start),			 pjsip_tx_data_get_info(tdata),			 tdata->tp_info.transport->type_name,			 tdata->tp_info.dst_name,			 tdata->tp_info.dst_port,			 (int)(tdata->buf.cur - tdata->buf.start),			 tdata->buf.start));    /* Always return success, otherwise message will not get sent! */    return PJ_SUCCESS;}/* The module instance. */static pjsip_module msg_logger = {    NULL, NULL,				/* prev, next.		*/    { "mod-siprtp-log", 14 },		/* Name.		*/    -1,					/* Id			*/    PJSIP_MOD_PRIORITY_TRANSPORT_LAYER-1,/* Priority	        */    NULL,				/* load()		*/    NULL,				/* start()		*/    NULL,				/* stop()		*/    NULL,				/* unload()		*/    &logger_on_rx_msg,			/* on_rx_request()	*/    &logger_on_rx_msg,			/* on_rx_response()	*/    &logger_on_tx_msg,			/* on_tx_request.	*/    &logger_on_tx_msg,			/* on_tx_response()	*/    NULL,				/* on_tsx_state()	*/};/************************************************************************** * Test Client. */static pj_bool_t mod_test_on_rx_response(pjsip_rx_data *rdata);static void call_on_media_update( pjsip_inv_session *inv,				  pj_status_t status);static void call_on_state_changed( pjsip_inv_session *inv, 				   pjsip_event *e);static void call_on_forked(pjsip_inv_session *inv, pjsip_event *e);/* Module to handle incoming requests callly. */static pjsip_module mod_test ={    NULL, NULL,			    /* prev, next.		*/    { "mod-test", 8 },		    /* Name.			*/    -1,				    /* Id			*/    PJSIP_MOD_PRIORITY_APPLICATION, /* Priority			*/    NULL,			    /* load()			*/    NULL,			    /* start()			*/    NULL,			    /* stop()			*/    NULL,			    /* unload()			*/    NULL,			    /* on_rx_request()		*/    &mod_test_on_rx_response,	    /* on_rx_response()		*/    NULL,			    /* on_tx_request.		*/    NULL,			    /* on_tx_response()		*/    NULL,			    /* on_tsx_state()		*/};static void report_completion(int status_code){    app.client.job_finished++;    if (status_code >= 200 && status_code < 800)	app.client.response_codes[status_code]++;    app.client.total_responses++;    pj_gettimeofday(&app.client.last_completion);}/* Handler when response is received. */static pj_bool_t mod_test_on_rx_response(pjsip_rx_data *rdata){    if (pjsip_rdata_get_tsx(rdata) == NULL) {	report_completion(rdata->msg_info.msg->line.status.code);    }    return PJ_TRUE;}/* * Create app */static pj_status_t create_app(void){    pj_status_t status;    status = pj_init();    if (status != PJ_SUCCESS) {	app_perror(THIS_FILE, "Error initializing pjlib", status);	return status;    }    /* init PJLIB-UTIL: */    status = pjlib_util_init();    PJ_ASSERT_RETURN(status == PJ_SUCCESS, status);    /* Must create a pool factory before we can allocate any memory. */    pj_caching_pool_init(&app.cp, &pj_pool_factory_default_policy, 			 CACHING_POOL_SIZE);    /* Create application pool for misc. */    app.pool = pj_pool_create(&app.cp.factory, "app", 1000, 1000, NULL);    /* Create the endpoint: */    status = pjsip_endpt_create(&app.cp.factory, pj_gethostname()->ptr, 				&app.sip_endpt);    PJ_ASSERT_RETURN(status == PJ_SUCCESS, status);    return status;}/* * Init SIP stack */static pj_status_t init_sip(){    pj_status_t status;    /* Add UDP/TCP transport. */    {	pj_sockaddr_in addr;	pjsip_host_port addrname;	const char *transport_type;	pj_bzero(&addr, sizeof(addr));	addr.sin_family = PJ_AF_INET;	addr.sin_addr.s_addr = 0;	addr.sin_port = pj_htons((pj_uint16_t)app.local_port);	if (app.local_addr.slen) {	    addrname.host = app.local_addr;	    addrname.port = 5060;	} 	if (app.local_port != 0)	    addrname.port = app.local_port;	if (0) {#if defined(PJ_HAS_TCP) && PJ_HAS_TCP!=0	} else if (app.use_tcp) {	    pj_sockaddr_in local_addr;	    pjsip_tpfactory *tpfactory;	    	    transport_type = "tcp";	    pj_sockaddr_in_init(&local_addr, 0, (pj_uint16_t)app.local_port);	    status = pjsip_tcp_transport_start(app.sip_endpt, &local_addr,					       app.thread_count, &tpfactory);	    if (status == PJ_SUCCESS) {		app.local_addr = tpfactory->addr_name.host;		app.local_port = tpfactory->addr_name.port;	    }#endif	} else {	    pjsip_transport *tp;	    transport_type = "udp";	    status = pjsip_udp_transport_start(app.sip_endpt, &addr, 					       (app.local_addr.slen ? &addrname:NULL),					       app.thread_count, &tp);	    if (status == PJ_SUCCESS) {		app.local_addr = tp->local_name.host;		app.local_port = tp->local_name.port;	    }	}	if (status != PJ_SUCCESS) {	    app_perror(THIS_FILE, "Unable to start transport", status);	    return status;	}	app.local_uri.ptr = pj_pool_alloc(app.pool, 128);	app.local_uri.slen = pj_ansi_sprintf(app.local_uri.ptr, 				    	     "<sip:pjsip-perf@%.*s:%d;transport=%s>",					     (int)app.local_addr.slen,					     app.local_addr.ptr,					     app.local_port,					     transport_type);	app.local_contact = app.local_uri;    }    /*      * Init transaction layer.     * This will create/initialize transaction hash tables etc.     */    status = pjsip_tsx_layer_init_module(app.sip_endpt);    PJ_ASSERT_RETURN(status == PJ_SUCCESS, status);    /*  Initialize UA layer. */    status = pjsip_ua_init_module( app.sip_endpt, NULL );    PJ_ASSERT_RETURN(status == PJ_SUCCESS, status);    /*  Init invite session module. */    {	pjsip_inv_callback inv_cb;	/* Init the callback for INVITE session: */	pj_bzero(&inv_cb, sizeof(inv_cb));	inv_cb.on_state_changed = &call_on_state_changed;	inv_cb.on_new_session = &call_on_forked;	inv_cb.on_media_update = &call_on_media_update;	/* Initialize invite session module:  */	status = pjsip_inv_usage_init(app.sip_endpt, &inv_cb);	PJ_ASSERT_RETURN(status == PJ_SUCCESS, 1);    }    /* Register our module to receive incoming requests. */    status = pjsip_endpt_register_module( app.sip_endpt, &mod_test);    PJ_ASSERT_RETURN(status == PJ_SUCCESS, status);    /* Register stateless server module */    status = pjsip_endpt_register_module( app.sip_endpt, &mod_stateless_server);    PJ_ASSERT_RETURN(status == PJ_SUCCESS, status);    /* Register default responder module */    status = pjsip_endpt_register_module( app.sip_endpt, &mod_responder);    PJ_ASSERT_RETURN(status == PJ_SUCCESS, status);    /* Register stateless server module */    status = pjsip_endpt_register_module( app.sip_endpt, &mod_stateful_server);    PJ_ASSERT_RETURN(status == PJ_SUCCESS, status);    /* Register call server module */    status = pjsip_endpt_register_module( app.sip_endpt, &mod_call_server);    PJ_ASSERT_RETURN(status == PJ_SUCCESS, status);    /* Done */    return PJ_SUCCESS;}/* * Destroy SIP */static void destroy_app(){    unsigned i;    app.thread_quit = 1;    for (i=0; i<app.thread_count; ++i) {	if (app.thread[i]) {	    pj_thread_join(app.thread[i]);	    pj_thread_destroy(app.thread[i]);	    app.thread[i] = NULL;	}    }    if (app.sip_endpt) {	pjsip_endpt_destroy(app.sip_endpt);	app.sip_endpt = NULL;    }    if (app.pool) {	pj_pool_release(app.pool);	app.pool = NULL;	PJ_LOG(3,(THIS_FILE, "Peak memory size: %uMB",			     app.cp.peak_used_size / 1000000));	pj_caching_pool_destroy(&app.cp);    }    /* Shutdown PJLIB */    pj_shutdown();}/* * Init media stack. */static pj_status_t init_media(){    unsigned	i;    pj_uint16_t	rtp_port;    pj_status_t	status;    /* Initialize media endpoint so that at least error subsystem is properly     * initialized.     */    status = pjmedia_endpt_create(&app.cp.factory, 				  pjsip_endpt_get_ioqueue(app.sip_endpt), 0, 				  &app.med_endpt);    PJ_ASSERT_RETURN(status == PJ_SUCCESS, status);    /* Must register all codecs to be supported */#if defined(PJMEDIA_HAS_G711_CODEC) && PJMEDIA_HAS_G711_CODEC!=0    pjmedia_codec_g711_init(app.med_endpt);#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -