文章目录
首次注册 (eXosip_register_build_initial_register)
冲突检查(a)
查询已有注册记录,若存在相同服务器地址的注册,删除原有事务(transaction),避免重复注册冲突。
结构初始化(b)
调用 eXosip_reg_init 生成新的注册管理结构,并加入 eXosip 的 j_reg 链表(统一管理所有注册)。
时间调整(c)
根据 expires 设置重注册时间:
- 若
expires≤ 0(注销),重注册时间设为 0(无需后续重注册); - 若
expires< 100s,强制调整为 100s(满足协议最小超时要求)。
消息生成(d)
调用 _eXosip_register_build_register 生成标准 Register 消息,返回新注册管理结构的 ID(用于后续操作)。
调整超时 (eXosip_register_build_register)
结构查询(a)
通过传入的注册ID查询对应的SIP注册管理结构体。若查询结果为空或无效,立即返回错误码(如EXOSIP_REGISTRATION_NOT_FOUND),终止后续操作。
参数重置(b)
将超时时间expires更新为传入值,并强制约束在协议规范的[100, 3600]秒范围内。若输入值超出范围,自动截断为最近边界值(如传入5000则设为3600,传入50则设为100)。
状态检查(c)
检查该注册的当前状态机是否处于空闲状态(如无 pending 请求)。若存在未完成的请求(如上次注册未收到响应),返回错误码(如EXOSIP_REGISTRATION_BUSY),避免消息并发冲突。
消息生成(d)
调用底层接口生成新的REGISTER消息,填充更新后的expires参数。生成成功后返回注册ID及消息句柄,供上层调用eXosip_register_send_register发送请求。
发送注册消息
以下是根据要求整理的流程说明,采用Markdown格式组织:
状态校验
检查该注册的上一个请求是否已进入结束状态(如收到服务器响应)。若未结束,拒绝发送新请求以确保注册操作的串行化执行。
事务创建
为当前请求创建新的transaction,确保每个请求对应唯一事务。将该事务挂载到注册管理结构的jr->r_last_tr,仅保留最近一个事务以简化状态跟踪。
事件触发
根据消息内容生成对应的事务事件,并将事件加入事务的事件队列。该队列用于后续处理线程的调度和执行。
线程唤醒
触发处理线程处理事务事件,完成消息发送及后续响应处理。确保事务的完整生命周期管理。
流程图


code
使用 eXosip 库实现 SIP 注册的完整示例代码,包含了初始注册、更新注册和注销的功能
- 初始化部分:设置本地 SIP 代理,绑定地址和端口
- 注册功能:
初始注册:创建并发送注册请求
更新注册:修改现有注册的超时时间 - 注销功能:通过将超时时间设为 0 来终止注册
- 事件处理:使用单独线程处理 SIP 事件,包括注册成功 / 失败通知,
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <exosip2/exosip.h>
// 全局上下文变量
osip_t *osip;
eXosip_t *excontext;
// 错误处理函数
void handle_error(const char *msg, int code) {
printf("Error: %s (code: %d)\n", msg, code);
exit(EXIT_FAILURE);
}
// 初始化eXosip
int init_exosip(const char *local_ip, int port) {
int ret;
// 初始化osip库
ret = osip_init(&osip);
if (ret != 0) handle_error(

最低0.47元/天 解锁文章
2万+

被折叠的 条评论
为什么被折叠?



