顾名思义, portAllocator 就是用来分配端口的, 因为每个candidate都是有IP、端口号、协议簇、类型所组成, 端口号的分配就是通过portAllocator完成的.
真正使用的是PortAllocator的子类---BasicPortAllocator.
PortAllocator:
-
stun_server : 使用该服务获取网络中的映射地址.
-
turn_servers : 对于PortAllocator来说可以访问多个turn server, vector中的每一项就是一个turn server 的配置信息, 通过配置信息即可连接到某个具体的turn服务器.
-
candidate_pool_size : 主动收集candidate之前, 会人工设置一个candidate pool, 默认设置0 ,不需要人工设置这个池子.
-
pooled_sessions : 上下文数组, PortAllocator分配端口时 真正执行这个操作的对象是PortAllocatorSession, 通过上下文才能创建出一个具体的可以使用的端口.
-
min_port : 指定端口最小值. 默认: 0.
-
max_port : 指定端口最大值, 即 设置端口号的使用范围, 默认: 0.
-
max_ipv6_networks : PortAllocator最多可以分配多少个ipv6地址, 默认:5.
-
candidate_filter : 对收集到的candidate进行过滤, 即把无效的candidate过滤掉.
-
allow_tcp_listen : 是否开启TCP监听.
-
CreateSession( ) : 创建一个PortAllocatorSession
-
TakePoolSession( ) : 因为candidate_pool_size默认设置0, 所以poolsession相关的函数极少使用.
BasicPortAllocator:
-
network_manager : 访问网络设备管理器.
-
socket_factory : 用于创建socket.
-
relay_port_factory : 用于创建中转端口.
-
CreateSessionInternal( ) : 真正用来创建PortAllocatorSession的方法.
-
AddTurnServer( ) : 将多个turn服务添加到BasicPortAllocator中.
PortAllocatorSession:
-
content_name : sdp中每一段媒体信息的名字, 通常音频是“0”, 视频是“1”
-
ice_ufrag : 用户名
-
ice_pwd : 密码, 用于验证用户是否有效
BasicPortAllocatorSession :
-
allocator: 指向BasicPortAllocator的指针
-
network_thread : 网络线程指针, 需要进行网络操作的时候,通过该指针获取网络线程
创建BasicPortAllocator对象
-
portAllocator是在peerConnection创建的时候创建的
-
有一个peerConnection就有一个与之对应的portAllocator
-
portAllocator的参数有default_network_manager 和packet_socket_factory
-
收集candidate的时候通过default_network_manager获取本机都有哪些net_work, 每一个net_work都对应一个socket,每一个socket都需要通过packet_socket_factory创建出来
构造BasicPortAllocator的参数
-
default_network_manager / default_socket_factory 是全局对象
BasicPortAllocator的构造函数
-
relay_port_factory : 用于构造relay类型的端口
-
setConfiguration : 配置参数- stun服务器地址、relay server的配置信息、 customizer定制信息
PortAllocator构造函数
InitRelayPortFactory
SetConfiguration
-
如果是内网连接, stun和turn不需要配置
-
candidate_pool_size 也同样不进行人工干预, 内部会根据ICE规范自动获取所有可用的candidate
initializePortAllocator
- portAllocator是在peerConnection初始化的时候初始化的
-
修改状态 : 通过port_allocator_->Initialize();将状态设置为true
-
通过port_allocator_->flags() 获取flag并设置
-
通过port_allocator_->set_flags将设置好的flag填进去
-
port_allocator_->SetConfiguration(),将变化后的参数设置给port_allocator
小结
-
每个PeerConnection中包括一个PortAllocator对象
-
PortAllocator对象是在CreatePeerConnection中创建的
-
PeerConnection初始化时会同时初始化PortAllocator
-
NetworkMananger和PacketSocketFactory全局唯一
-
两者在PeerConnectionFactory的Initialize中创建