首先建议先看一下我翻译的文章《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、客户端首先发送一条不带认证信息的注册请求;
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, ®); 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