1

我正在使用eXosip. 当我尝试登录服务器时,第一次尝试总是失败。

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);

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

现在我不知道这种行为是否可以预期(我找不到任何关于它的信息),但是......有人可以帮忙吗?提前致谢!

4

2 回答 2

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 的事情。很方便!

于 2014-09-04T12:57:30.280 回答
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 等)和终止对话内的 sip 消息(主要是 BYE)

于 2015-03-25T13:53:59.467 回答