本文主要对 sip 中的 sip_transport 在发送与接收过程中的流程,其余内容暂时不关注。本章主要关注无状态的 request 的发送如何发送出去。
欢迎进入q群761341723,大家一起讨论问题。hpng该网站为我自己网站,一些想法也会发到这里
pjsip_endpt_send_request_stateless
pjsip_endpt_send_request_stateless
函数定义位于 pjsip/src/pjsip/sip_util.c 中,其中内容如下所示:
PJ_DEF(pj_status_t) pjsip_endpt_send_request_stateless(pjsip_endpoint *endpt,
pjsip_tx_data *tdata,
void *token,
pjsip_send_callback cb)
{
pjsip_host_info dest_info;
pjsip_send_state *stateless_data;
pj_status_t status;
PJ_ASSERT_RETURN(endpt && tdata, PJ_EINVAL);
/* Get destination name to contact. */
status = pjsip_process_route_set(tdata, &dest_info);
if (status != PJ_SUCCESS)
return status;
/* Keep stateless data. */
stateless_data = PJ_POOL_ZALLOC_T(tdata->pool, pjsip_send_state);
stateless_data->token = token;
stateless_data->endpt = endpt;
stateless_data->tdata = tdata;
stateless_data->app_cb = cb;
/* If destination info has not been initialized (this applies for most
* all requests except CANCEL), resolve destination host. The processing
* then resumed when the resolving callback is called. For CANCEL, the
* destination info must have been copied from the original INVITE so
* proceed to sending the request directly.
*/
if (tdata->dest_info.addr.count == 0) {
/* Copy the destination host name to TX data */
if (!tdata->dest_info.name.slen) {
pj_strdup(tdata->pool, &tdata->dest_info.name,
&dest_info.addr.host);
}
pjsip_endpt_resolve( endpt, tdata->pool, &dest_info, stateless_data,
&stateless_send_resolver_callback);
} else {
PJ_LOG(5,(THIS_FILE, "%s: skipping target resolution because "
"address is already set",
pjsip_tx_data_get_info(tdata)));
stateless_send_resolver_callback(PJ_SUCCESS, stateless_data,
&tdata->dest_info.addr);
}
return PJ_SUCCESS;
}
- pjsip_process_route_set: 设置目的地到 contact 中
- stateless_send_resolver_callback: 在解析地址完成后,就发送无状态数据。此处我们暂时不关注解析地址,先看数据发送
stateless_send_resolver_callback
stateless_send_resolver_callback
函数的定义位于 pjsip/src/pjsip/sip_util.c 中,其中内容如下所示:
/* Resolver callback for sending stateless request. */
static void
stateless_send_resolver_callback( pj_status_t status,
void *token,
const struct pjsip_server_addresses *addr)
{
pjsip_send_state *stateless_data = (pjsip_send_state*) token;
pjsip_tx_data *tdata = stateless_data->tdata;
/* Fail on server resolution. */
if (status != PJ_SUCCESS) {
if (stateless_data->app_cb) {
pj_bool_t cont = PJ_FALSE;
(*stateless_data->app_cb)(stateless_data, -status, &cont);
}
pjsip_tx_data_dec_ref(tdata);
return;
}
/* Copy server addresses */
if (addr && addr != &tdata->dest_info.addr) {
pj_memcpy( &tdata->dest_info.addr, addr,
sizeof(pjsip_server_addresses));
}
pj_assert(tdata->dest_info.addr.count != 0