pjsip源码解析之pjsip的信令的发送与接收之pjsip_endpt_send_request_stateless

本文主要对 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值