doubango(4)--SIP协议栈传输层的启动
2014-04-09 18:32
309 查看
协议栈的默认传输结构
对于一个刚启动的协议栈来说,它需要有一个传输层,支持若干的传输结点。每一个传输结点对应于一个端口,若采用TCP连接,一个传输结点就针对于一个点到点的连接,这个连接负责sip信令的可靠交换;若采用UDP进行sip信令的交换,则需要由应用程序维护一个定时器,以防数据包丢失的时候用于重传。Doubango里一个协议栈对应于一个tsip_stack_t实例,而这样一个实例又拥有有三个层次,从上到下依次为:
事物层,对话层,传输层。
各种关系如下图所示:
在实际中,在协议栈启动的时候,会首先生成一个默认的传输实例,并挂接到传输层的transports队列中,完成该工作的函数是:
[html] view plaincopy
tsip_transport_layer_add(tsip_transport_layer_t* self,
const char* local_host,
tnet_port_t local_port,
tnet_socket_type_ttype,
const char* description);
在创建默认传输实例时,各个形参对应的实参为:
[cpp] view plaincopy
l tsip_transport_layer_t *self------传输层实例:stack->layer_transport
l const char* local_host--------------服务器主机IP: stack->network.local_ip,
l tnet_port_t local_port------本机绑定端口,若不指定一般为0,并由stack->network.local_port返回记录
l tnet_socket_type_t type---------套接口类型,指定为IPV4的UDP或TCP,或者IPSEC
l description ----------------------------指定为“siptransport”,记录到传输实例中。
Sip消息的传输载体—tsip_transport_t结构
[cpp] view plaincopytypedef struct tsip_transport_s
{
TSK_DECLARE_OBJECT;
tsk_bool_t initialized;//指定是否已经初始化
const tsip_stack_t*stack;//记录所属sip协议栈
tnet_socket_type_t type;//套接口类型,tcp,udp
struct sockaddr_storagepcscf_addr;//通用套接字地址结构,用于记录服务器端地址
tnet_fd_t connectedFD;//套接口描述字
tnet_transport_handle_t *net_transport;//对应一个网络的传输实例
const char *scheme;
const char *protocol;
const char *via_protocol;
const char *service; /**< NAPTRservice name */
tsk_buffer_t *buff_stream;
}
tsip_transport_t;
在创建一个tsip_transport_t实例的时候,会随便创建一个tnet_transport_t实例,tsip_transpor_t与tnet_transport_t是一一对应的关系。
而tnet_transport_t对应了两个线程,一个线程成为mainthread线程,一个称为run线程。他们的作用描述如下:
Mainthread线程:在其主循环内用于从套接口缓冲区读取数据,并生成tnet_transport_event_t实例,这个实例代表到达的一个网络层消息。生成以后把它连接入tnet_transport_t的一个队列,该队列负责管理各个tnet_transport_event_t实例。
Run线程:把tnet_transport_event_t实例从上所述队列中出队列,通过回调传入tsip_transpor_t的处理函数,对于UDP和TCP对应的回调函数分别是,
tsip_transport_layer_dgram_cb(…)和tsip_transport_layer_stream_cb(…)
这两个函数是在启动第一个默认传输实例tsip_transport_t实例时记录到tnet_transport_t的callback字段的,callback是一个函数指针,tnet_transport_t用它来把消息回传给tsip_transport_t进行处理。
相关文章推荐
- doubango(5)--SIP协议栈传输层的启动
- 四 SIP协议栈传输层的启动(1)
- 四 SIP协议栈传输层的启动(1)
- 串口传输文件来启动系统
- 使用Filezilla向VMWare中的虚拟机中上传文件提示“无法启动传输”的解决办法
- Exchange 2016边缘传输服务器“MSExchange运行状况管理器”无法启动
- Doubango ims 框架分析之 sip协议栈
- 使用bcdedit修改TFTP传输blksize和windowsize以加快PXE启动速度
- ogg 传输进程启动报错 Missing filename opening checkpoint file.
- Exchange 邮件服务器传输服务启动失败
- 通过 bootloader 向其传输启动参数
- 在辅助服务器上启动区域传输
- Windows 2003中如何启动IIS6的GZIP压缩网页传输
- 通过 bootloader 向其传输启动参数
- Doubango RTP包传输使用UDT可靠传输协议,解决RTP丢包问题
- linux服务器初步印象,远程连接mysql数据库,传输文件,启动/关闭tomcat命令
- Activity的启动、关闭、数据传输
- Windows 2003中如何启动IIS6的GZIP压缩网页传输
- C语言学习之结构体与指针部分----结合doubango sip协议栈源代码学习---------阿冬专栏!!
- 启动另一个Activity并利用Intent传输数据