0

对于通过 TCP 的 SIP 呼叫 INVITE 请求,如果我们从注册商处收到 401,则在 exosip 中,带有身份验证的呼叫重新邀请失败。

理想情况下,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;

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

但是,我可以看到我的呼叫状态是 PROCEEDING 或 CALLING 并且out_tr->last_responseNULL.

如果我使用 UDP,这永远不会发生。它只发生在 TCP 或 TLS 上。

4

1 回答 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);
  }
}

EDIT2:有可能,如果你调用eXosip_automatic_action太晚了,那么在你实际执行eXosip_automatic_action方法之前,事务就变成了 COMPLETED ?

这是我自己的代码的摘录,显示了何时必须调用该方法。

je = eXosip_event_wait (tv_s, tv_ms);
eXosip_lock ();
eXosip_automatic_action ();

-我是osip/exosip的作者-

于 2020-03-30T11:42:30.727 回答