Osip源代码框架20- Register的处理

首次注册 (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 注册的完整示例代码,包含了初始注册、更新注册和注销的功能

  1. 初始化部分:设置本地 SIP 代理,绑定地址和端口
  2. 注册功能:
    初始注册:创建并发送注册请求
    更新注册:修改现有注册的超时时间
  3. 注销功能:通过将超时时间设为 0 来终止注册
  4. 事件处理:使用单独线程处理 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(
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

八月的雨季997

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值