📄 pjsip-perf.c
字号:
} 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 + -