exosip_automatic_action无法通过TCP接收到4xx时重新启动呼叫

问题描述 投票:0回答:1

对于通过TCP的SIP呼叫邀请请求,如果我们从注册服务商处收到401,则通过身份验证进行的呼叫重新邀请失败。

理想情况下,exosip_automatic_action应该处理此问题(并且确实会调用它,但是以下问题阻止了它继续进行。

  /* an EARLY dialog may have failed with 401,407 or 3Xx */
  osip_transaction_t *out_tr = NULL;

  out_tr = jc->c_out_tr; // where eXosip_call_t *jc;

在这种情况下,如果呼叫状态为COMPLETED并且out_tr->last_response为401或407,则将发送重新邀请

但是,我看到以我的方式进入的呼叫状态为PROCEEDING或CALLING,并且out_tr->last_responseNULL

如果使用UDP,则永远不会发生。这仅在TCP或TLS上发生。

c++ sip voip
1个回答
0
投票

在某些情况下,eXosip_automatic_action无法正常工作。这是设计使然。

相反,对于您遇到的用例,当您收到带有负“ did”参数的EXOSIP_CALL_MESSAGE_REQUESTFAILURE事件时,需要使用这样的代码:

  if (exosip_event->type == EXOSIP_CALL_MESSAGE_REQUESTFAILURE && exosip_event->did < 0) {
    if (exosip_event->response != NULL && (exosip_event->response->status_code == 407 || exosip_event->response->status_code == 401))
      eXosip_default_action (exosip_event);
  }

以上代码将添加到您的“ exosip事件循环”

eXosip_default_action应该执行自动丢失重试!

编辑:对不起,对于事件EXOSIP_MESSAGE_REQUESTFAILURE也需要完成此操作:

if (exosip_event->type == EXOSIP_MESSAGE_REQUESTFAILURE && exosip_event->request != NULL) {
  if (exosip_event->response != NULL) {
    if (MSG_IS_PUBLISH (exosip_event->request)) {
    } else if (exosip_event->response->status_code == 407 || exosip_event->response->status_code == 401)
        eXosip_default_action (exosip_event);
  }
}

-我是osip / exosip-]的作者>

© www.soinside.com 2019 - 2024. All rights reserved.