`

SoftPhone(eXosip)学习笔记系列之用户注册

    博客分类:
  • SIP
 
阅读更多

用户注册:注册类整理
int CSipRegister::Register(ConfigMessage CfgMsg,UserMessage UsMsg)
{
 int i;
 int retVal;
 osip_message_t *reg = NULL;
 
 i = eXosip_init ();
 if (i != 0)
  {
  TRACE0("--Couldn't initialize eXosip!\n");
  return -1;
  }
 else
  {
  TRACE0("--eXosip_init successfully!\n");
  }
 //侦听的端口
 i = eXosip_listen_addr (IPPROTO_UDP, NULL, CfgMsg.contact_port, AF_INET, 0);
 if (i != 0)
  {
  eXosip_quit ();
  TRACE0 ("--Couldn't initialize transport layer!\n");
  return -2;
  }
 eXosip_lock();
 char from_url[160]={0};
 char proxy_url[160]={0};
 char contact_url[160]={0};
 sprintf(from_url,"%s <sip:%s@%s>",UsMsg.m_TelNum,UsMsg.m_TelNum, CfgMsg.from_url);
 sprintf(proxy_url,"sip:%s:%d", CfgMsg.proxy_url,CfgMsg.proxy_port);
 sprintf(contact_url, "\"%s\" <sip:%s@%s:%d>", UsMsg.m_TelNum,UsMsg.m_TelNum, CfgMsg.contact_url,CfgMsg.contact_port);
 int regid = eXosip_register_build_initial_register(from_url,proxy_url, contact_url, 3600, ®);
 if (regid<0)
 {
  eXosip_unlock();
  return -3;
 }
 eXosip_clear_authentication_info(); //去除上次加入的错误认证信息
 //添加认证信息
 if (eXosip_add_authentication_info(UsMsg.m_TelNum, UsMsg.m_TelNum, UsMsg.m_PassWd, "md5", NULL))
 {
  TRACE0("--Add_authentication_info failed\n");
  eXosip_unlock();
  return -4;
 }
 //发送注册信息
 retVal = eXosip_register_send_register (regid, reg);
 if (retVal != 0)
 {
  TRACE0 ("register_send_register failed\n");
  eXosip_unlock();
  return -5;
 }
 eXosip_unlock ();
 return retVal;
}
我把这个注册过程分为六步:
1.sip初始化.
   eXosip_init ();
2.侦听的端口
   eXosip_listen_addr (IPPROTO_UDP, NULL, CfgMsg.contact_port, AF_INET, 0);
   这里需要注意的是CfgMsg.contact_port是一个与对方建立连接所需的端口,这里我设置为12463.
3.构造注册信息
   eXosip_register_build_initial_register()
4.去除上次加入的错误认证信息
   eXosip_clear_authentication_info(); 
5.添加注册证书
   eXosip_add_authentication_info()
6.发送注册信息
   eXosip_register_send_register ();

这6步之后一个注册就建立了.
下面的做法是捕获PROXY发送回来的消息,
这里我通过开辟新线程的方法捕获,因为这个一个循环.
while (pDlg->m_LoginEventsFlag)
{
  eXosip_event_t *event;
  event = eXosip_event_wait (0, 50); //侦听是否有消息到来
  eXosip_lock ();
  eXosip_default_action(event);
  eXosip_unlock();
  if (event==NULL) {
   continue;
  }
  //下面是一个SWITCH语句对捕获的消息进行处理.
 }
 主要就这两个消息:EXOSIP_REGISTRATION_SUCCESS,EXOSIP_REGISTRATION_FAILURE

捕获PROXY发送回来的消息,抓包可以看到先得到一个401应答,之后再得到一个200OK应答,这样就可以判断注册成功了.
这样,一个注册就建立了.

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics