C++ eXosip:首次尝试登录总是失败

C++ eXosip:首次尝试登录总是失败,c++,login,sip,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, &r

我正在使用
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);
我在不同的提供商尝试了不同的账户,结果总是一样的。 诚然,这是可行的,但它使程序流变得混乱,错误处理更加困难(例如,对于错误的登录凭据),如果可能的话,我希望避免这种情况


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

好吧,这有点愚蠢。对于任何想知道或遇到相同问题的人,大多数服务器都会使用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\u automatic\u action
将在注册到期之前处理401、407、422、3xx并重新注册
eXosip\u default\u action
将处理更多关于401/407的事情。非常方便

这是一个很老的问题,但我想给出一个准确的答案:

关于问题本身:

eXosip\u自动动作(ctx)将处理每个自动操作,但只有2个用例不能用它来处理,EXOSIP_注册_失败不是其中的一部分

以下是激活基于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);
}
int status\u code=0;
如果(evt->响应!=NULL)
状态代码=evt->响应->状态代码;
eXosip_自动_动作(ctx);
if(evt->type==EXOSIP\u CALL\u MESSAGE\u REQUESTFAILURE&&evt->did<0){
/*evt->didtype==EXOSIP\u MESSAGE\u REQUESTFAILURE&&evt->request!=NULL){
/*exosip中没有上下文的消息需要身份验证(消息、选项…)*/
如果(!MSG_IS_PUBLISH(evt->request)&(status_code==407 | | status_code==401))
eXosip_默认_动作(evt);
}
如代码注释所示,上述代码还将对对话框外部的sip消息(消息、选项等)和终止的对话框内的sip消息(主要是BYE)进行身份验证