linphone用户注册与sip交互过程分析

在linphone_core_init
在linphone_configuring_terminated
在linphone_core_start
在 sip_config_read
在linphone_core_set_sip_transports
在_linphone_core_apply_transports
在sal_listen_port
在sal_add_listen_port
在 belle_sip_stack_create_listening_point
在belle_sip_udp_listening_point_new
在belle_sip_udp_listening_point_init
在belle_sip_udp_listening_point_init_socket
在create_udp_socket
实现随机端口原理是 将udp的端口号设为-1,这样处理的时候会随机赋值,具体处理在create_udp_socket函数中 原理是,bind时使用端口号为0,这样会随机绑定一个未占用的端口,然后通过getsockname 获取具体绑定的端口返回

linphone监听端口是在linphone_core_init函数中就已经处理完成的,在这个函数中会先读取文本配置,然后根据配置再进行处理

使用belle_sip_main_loop_add_source 将lp->source(携带了监听的socket)加入到ml->fd_sources链表中,该结构最终在linphonecore.c文件 linphone_core_iterate函数下sal_iterate(lc->sal)中调用,跟代码可以发现前面监听的socket是在lc->sal->prov->lp 下,
sal_iterate最终执行代码如下:
void belle_sip_main_loop_run(belle_sip_main_loop_t *ml){
if (ml->in_loop){
belle_sip_warning(“belle_sip_main_loop_run(): reentrancy detected, doing nothing”);
return;
}
ml->run = TRUE;
ml->in_loop = TRUE;
while(ml->run){
belle_sip_main_loop_iterate(ml);
}
ml->in_loop = FALSE;
}

其中belle_sip_main_loop_iterate(ml)中对于监听的socket 采用了eventselect模型进行io处理
当有read write事件时,会调用s->notify 指针绑定的方法,udp的话就是udp_listeningpoint.c 文件下的 on_udp_data方法;

->on_udp_data
->belle_sip_channel_process_data (在 make_logbuf 会将接受的sip信息用char*然后输出log)
->belle_sip_channel_recv
在这里如果是udp端口对应处理结构是
BELLE_SIP_INSTANCIATE_CUSTOM_VPTR_BEGIN(belle_sip_udp_channel_t)
{
{
BELLE_SIP_VPTR_INIT(belle_sip_udp_channel_t,belle_sip_channel_t,FALSE),
(belle_sip_object_destroy_t)udp_channel_uninit,
NULL,
NULL,
BELLE_SIP_DEFAULT_BUFSIZE_HINT
},
“UDP”,
0, /is_reliable/
udp_channel_connect,
udp_channel_send,
udp_channel_recv,
NULL /no close method/
}

即udp_channel_recv

接收完数据后转到
->belle_sip_channel_process_stream(obj,FALSE);
->belle_sip_channel_parse_stream 在其中会通过查\r\n\r\n的结尾符号 获取整个sip文本部分

后面处理request
siplistener.c process_request_event
sal_impl.c process_request_event
sal_op_call.c process_request_event

关于监听端口 跟踪

关键函数:
sal_register

_sal_op_send_request_with_contact
方法中 next_hop_uri保存了sip服务器ip和端口
op->base.root->prov 保存了本地使用的ip和端口

belle_sip_client_transaction_send_request_to

关键结构
salop->base.root->prov 保存了端口相关信息

listeningpoint.c文件
int belle_sip_listening_point_get_well_known_port(const char *transport){
if (strcasecmp(transport,”UDP”)==0 || strcasecmp(transport,”TCP”)==0 ) return 5060;
if (strcasecmp(transport,”DTLS”)==0 || strcasecmp(transport,”TLS”)==0 ) return 5061;
belle_sip_error(“No well known port for transport %s”, transport);
return -1;
}

linphone用户注册与sip交互过程分析相关推荐

  1. 智能会议系统(17)--- Linphone用户注册

    Linphone用户注册 前言 Linphone的用户注册包含3个部分  1. 用户创建  2. 用户修改  3. 服务器注册 1. 用户创建 在Linphone示例程序中,当我们第一次运行的时候,软 ...

  2. Skype交互过程分析

    这篇文章写的还不错,基本把Skype协议的重点交互过程分析清楚了,列入本人博客用于记录参考,对于Skype协议已经研究多年,大家有什么问题也可以和我探讨. 转自:http://blog.csdn.ne ...

  3. L2TP NAS initial中整个交互过程分析

    1.PPPoe的LCP协商 在这个阶段客户端也就是拨号的发起端会发送PADI报文,也就是发现报文,于是NAS会对其进行响应,然后就是类似DHCP的交互过程,总共涉及四个报文,四个报文的目的就是协商出P ...

  4. Android 蓝牙 A2DP基础概念、A2DP音频流的建立及传输流程、A2DP播放暂停音乐命令交互过程分析 - 史上最全分析

    同学,别退出呀,我可是全网最牛逼的 Android 蓝牙分析博主,我写了上百篇蓝牙文章,请点击下面了解本专栏,进入本博主主页看看再走呗,一定不会让你后悔的,记得一定要去看主页置顶文章哦. Androi ...

  5. VXLAN+EVPN控制平面和数据平面交互过程分析

    1. VXLAN+EVPN控制平面和数据平面分析 1.1 vxlan节点动态发现隧道动态建立过程(type3路由 Type3路由的作用:用于自动建立vxlan隧道和自动生成头端复制列表 Type3路由 ...

  6. 跨平台SIP 客户端-linphone下载、使用

    linphone 官网地址:https://www.linphone.org/ Github:https://github.com/BelledonneCommunications 开发指南:http ...

  7. Linphone android去电增加自定义SIP消息头的流程分析

    一.首先看一下如何在发起去电的sip请求中添加自定义的消息头 增加自定义头消息发方法,so已经提供了native方法, 发起呼叫的示例如下: LinphoneCallParams params = l ...

  8. Linphone分析

    一linphone 架构及组成模块 2 二linphone 系统框图 3 三linphone 中各个模块说明 3 四linphone 中数据结构说明 7 五linphone 的初始化过程 7 六lin ...

  9. sip gw功能包括_完整SIP/SDP媒体协商概论-SIP/WebRTC概要

    ​Session Description Protocol(简称是SDP)全称是会话描述协议,此协议用来创建一种协商机制,这种协商机制是由呼叫控制协议创建的介于两个呼叫用户之间的会话进行,协商机制支持 ...

最新文章

  1. 杂七杂八的前端基础01——函数作用域
  2. 定域性和实在性之矛盾的世界
  3. windows 配置C++环境
  4. 揭秘!文字识别在高德地图数据生产中的演进
  5. 模拟集成电路的经典教材
  6. hadoop可以解决什么问题_快速解决皮带机轴磨损问题可以这样做
  7. 1.0 Hadoop的介绍、搭建、环境
  8. wordpress ?php the_time() ?,WordPress时间函数the_time与get_the_time解析
  9. find 命令_除了 find,还有这些文件查找命令
  10. Java程序设计语言基础01:绪论
  11. LiveNVR高性能稳定RTSP、Onvif探测流媒体服务配置通道接入海康、大华等摄像机进行全终端无插件直播...
  12. Google也是个人使用非商业?
  13. 用c#创建支持多语言的WinForm应用程序 .
  14. 开帖记录每天工作学习日常
  15. js实现 base64 转码解码
  16. 3.10矩阵与线性代数运算
  17. 电子计算机机房设备接地线,电子计算机机房的防雷接地措施
  18. 事件10016,RuntimeBroker无法编辑
  19. 天之痕MV-三个人的时光
  20. python画图,中文字体乱码,设置plt.rcParams不成功时

热门文章

  1. div向左、向右移动的动画效果
  2. Java中向上转型与向下转型
  3. 嗯,一个在北京,一个在南京
  4. 华为的研发基地“欧洲小镇”
  5. PPT文件打开密码忘记了如何找回
  6. 利用魔法数实现快速开平方
  7. 让你的电脑运行飞快 鼠标右键菜单清理
  8. 使用TensorRT对AlphaPose模型进行加速
  9. 【趣味数学】快速判断一个数是否是另一个数的倍数
  10. binance 币本位交割合约期限套利交易(三)--获取基差数据