Xossip:登录总是在第一次尝试时失败

时间:2014-09-03 19:25:59

标签: c++ login sip

我正在使用eXosip开发SIP应用程序。当我尝试登录服务器时,第一次尝试总是失败。

eXosip_lock(ctx);
eXosip_add_authentication_info(ctx, username, login, passwd, NULL, domain);

osip_message_t *reg;
int rid = eXosip_register_build_initial_register(ctx, account, server, NULL, 3600, &reg);

// Not sure what they do, but they seem to be necessary
osip_message_set_supported (reg, "100rel");
osip_message_set_supported (reg, "path");

eXosip_register_send_register(ctx, rid, reg);
eXosip_unlock(ctx);

(我已删除错误检查以使其更具可读性。)上述代码会导致EXOSIP_REGISTER_FAILED事件。通过执行以下代码对此事件做出反应会导致注册成功。

eXosip_lock(ctx);

osip_message_t *reg;
eXosip_register_build_register(ctx, rid, 3600, &reg);
eXosip_register_send_register(ctx, rid, reg);

eXosip_unlock(ctx);

我在不同的提供商处尝试过不同的帐户,而且总是一样的。 当然,它可以工作,但它会使程序流动混乱并且错误处理更加困难(例如,对于错误的登录凭证),如果可能的话我想避免这种情况。

现在我不知道这种行为是否可以预期(我无法找到任何相关内容),但......有人可以提供帮助吗?提前谢谢!

2 个答案:

答案 0 :(得分:0)

好的,这有点愚蠢。对于任何想要或遇到相同内容的人,大多数服务器将使用401(未授权)或407(需要代理身份验证)回复初始注册。知道了这一点,我能够使用以下代码成功注册:

eXosip_automatic_action(ctx);

if (evt->type == EXOSIP_REGISTER_FAILED)
{
   if (evt->response != NULL &&
          (evt->response->status_code == 401 || evt->response->status_code == 407))
   {
       eXosip_default_action(ctx, evt);
   }
   else
       // login really failed
}

eXosip_automatic_action将在注册过期前处理401,407,422,3xx并重新注册。 eXosip_default_action将处理有关401/407的更多内容。非常方便!

答案 1 :(得分:0)

这是一个很老的问题,但我想提供一个确切的答案:

关于问题本身:

eXosip_automatic_action(ctx); 将处理每个自动操作,但只有2个用例无法处理,EXOSIP_REGISTRATION_FAILURE不属于它们。

以下是激活基于eXosip的应用程序所需的所有自动操作的正确方法:

int status_code = 0;
if (evt->response != NULL)
  status_code = evt->response->status_code;

eXosip_automatic_action(ctx);

if (evt->type == EXOSIP_CALL_MESSAGE_REQUESTFAILURE && evt->did < 0) {
  /* evt->did<0 means dialog is over, but authentication is required (BYE was rejected) */
  if (status_code == 407 || status_code == 401)
    eXosip_default_action (evt);
}

if (evt->type == EXOSIP_MESSAGE_REQUESTFAILURE && evt->request != NULL) {
  /* authentication is required for a message without context in exosip (MESSAGE, OPTIONS...) */
  if (!MSG_IS_PUBLISH (evt->request) && (status_code == 407 || status_code == 401))
    eXosip_default_action (evt);
}

如代码注释中所示,上面的代码还将验证对话框外的sip消息(MESSAGE,OPTIONS等等),并在终止的对话框内(主要是BYE)sip消息