exosip在osip基础上,实现了rfc3261中的传输层(下文简称传输层,请不要和TCP传输层混淆)。本文初步分析下exosip传输层中的TCP传输机制
exosip的TCP主要是在eXtl_tcp.c中实现。
首先是核心变量
struct eXtl_protocol eXtl_tcp = {
1,
5060,
"TCP",
"0.0.0.0",
IPPROTO_TCP,
AF_INET,
0,
0,
&tcp_tl_init,
&tcp_tl_free,
&tcp_tl_open,
&tcp_tl_set_fdset,
&tcp_tl_read_message,
&tcp_tl_send_message,
&tcp_tl_keepalive,
&tcp_tl_set_socket,
&tcp_tl_masquerade_contact,
&tcp_tl_get_masquerade_contact,
&tcp_tl_reset
};
这个结构体变量实际起了中间件的作用,对上层屏蔽了tcp/udp。所以对应其他传输方式(tls udp),有eXtl_tls eXtl_udp。
这些函数名相当清楚。
tcp_tl_init
初始化变量eXtltcp_reserved(C语言,没工厂,只能这样了)。这个变量保存TCP的监听、连接句柄和连接信息(ip\端口).
tcp_tl_free
清空、释放内存(这代码写的很谨慎,在释放前再对待释放区做清零,不太明白这样意义)
tcp_tl_open
创建监听socket(excontext->eXtltcp_reserved->tcp_socket