eXosip入门(四):eXosip示例程序——注册/认证 .

http://blog.csdn.net/ppy521/article/details/7959062

 

 首先建议先看一下我翻译的文章 《eXoisp用户手册:1.3 如何发送或者升级注册》,先对eXosip的注册/认证过程有一个大致的了解。
     其次,在 exosip\tools目录下有官方提供的一个示例程序sip_reg.c,用户可以仔细阅读该源码,熟悉exosip注册API函数的使用及事件的处理流程。

     eXosip基本注册流程如下:发送默认注册请求——>收到注册失败事件(缺少认证信息)——>再次发送带认证信息的注册请求——>注册成功。
     注意在调用eXosip_register_build_initial_register函数时,该函数会返回一个注册id,用户应保存该id,因为后面更新/取消注册时要用到。
     
     下图1为sipReg程序与服务器的通信抓包截图,图2为通信流程图。

                                                                                      图1

SIP注册流程图

                                              图2
    1、客户端首先发送一条不带认证信息的注册请求;


     2、服务器返回401状态,即未授权,需要用户认证;


     3、客户端再次发送带认证信息的注册请求;


     4、服务器返回200 OK状态,表明注册成功。

     

      在eXosip中,当用户第一次发送注册请求后,eXosip会产生EXOSIP_REGISTRATION_FAILURE事件,注意这并不一定是注册失败,用户需要根据event->response->status_code 来判断具体的状态,如果是401状态,则是服务器需要用户再次发送带认证信息的注册请求;如果是其他值,则认为注册失败,比如无法连接服务器等。

    对于EXOSIP_REGISTRATION_FAILURE事件,有两种处理方式:
    1、自动处理。
    在eXosip事件处理循环中调用eXosip_automatic_action()函数,该函数会自动帮助用户处理401/407状态,用户并不再需要手动发送带认证信息的注册请求,只需要在第一次注册时就添加好认证信息即可;

    2、手动处理,需要在EXOSIP_REGISTRATION_FAILURE事件中增加以下代码:

  1. if ((event->response != NULL) && (event->response->status_code == 401)) { // 收到401状态   
  2.     osip_message_t *reg = NULL;  
  3.             eXosip_lock();  
  4.             eXosip_clear_authentication_info(); // 清空认证信息         
  5.     eXosip_add_authentication_info(username, username, password, "MD5", NULL); // 添加认证信息   
  6.     eXosip_register_build_register(event->rid, expires, &reg);  
  7.     eXosip_register_send_register(event->rid, reg); // 发送注册请求   
  8.     eXosip_unlock();  
  9. }  
  10. else { // 注册失败处理   
  11.     ...  
  12. }  
if ((event->response != NULL) && (event->response->status_code == 401)) { // 收到401状态
	osip_message_t *reg = NULL;
        	eXosip_lock();
        	eXosip_clear_authentication_info(); // 清空认证信息      
	eXosip_add_authentication_info(username, username, password, "MD5", NULL); // 添加认证信息
	eXosip_register_build_register(event->rid, expires, &reg);
	eXosip_register_send_register(event->rid, reg); // 发送注册请求
	eXosip_unlock();
}
else { // 注册失败处理
	...
}


     注意事项:
     1、有的SIP服务器可以设置成不需要用户注册即可登陆,所以会导致与上述流程不一样; 
     2、eXosip_register_build_initial_register函数的expires参数为注册过期时间,单位为秒,也就是说过了这段时间,注册信息失效,用户需要重新注册。
                         

     测试程序暂时不知道如何上传,敬请等待^_^。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值