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

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

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

                                                                                      图1

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

eXosip入门(四):eXosip示例程序——注册/认证_第1张图片
     2、服务器返回401状态,即未授权,需要用户认证;


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

eXosip入门(四):eXosip示例程序——注册/认证_第2张图片
     4、服务器返回200 OK状态,表明注册成功。
eXosip入门(四):eXosip示例程序——注册/认证_第3张图片
     

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

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

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

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参数为注册过期时间,单位为秒,也就是说过了这段时间,注册信息失效,用户需要重新注册。
                         

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

     参考文章 :http://blog.csdn.net/guangfakeji/article/details/7382586 

你可能感兴趣的:(eXosip入门(四):eXosip示例程序——注册/认证)