AllocationSequence::CreateUDPPorts
UDPPort::Create
UDPPort::Init

socket绑定信号:发送数据包信号,准备发送的信号,以及candidate准备好后的信号。
BasicPortAllocatorSession::AddAllocatedPort
H:\webrtc-20210315\webrtc-20210315\webrtc\webrtc-checkout\src\p2p\client\basic_port_allocator.cc
是AddAllocatedPort。
void BasicPortAllocatorSession::AddAllocatedPort(Port* port,AllocationSequence* seq,bool prepare_address) {RTC_DCHECK_RUN_ON(network_thread_);if (!port)return;RTC_LOG(LS_INFO) << "Adding allocated port for " << content_name();port->set_content_name(content_name());port->set_component(component());port->set_generation(generation());if (allocator_->proxy().type != rtc::PROXY_NONE)port->set_proxy(allocator_->user_agent(), allocator_->proxy());port->set_send_retransmit_count_attribute((flags() & PORTALLOCATOR_ENABLE_STUN_RETRANSMIT_ATTRIBUTE) != 0);PortData data(port, seq);ports_.push_back(data);port->SignalCandidateReady.connect(this, &BasicPortAllocatorSession::OnCandidateReady);port->SignalCandidateError.connect(this, &BasicPortAllocatorSession::OnCandidateError);port->SignalPortComplete.connect(this,&BasicPortAllocatorSession::OnPortComplete);port->SubscribePortDestroyed([this](PortInterface* port) { OnPortDestroyed(port); });port->SignalPortError.connect(this, &BasicPortAllocatorSession::OnPortError);RTC_LOG(LS_INFO) << port->ToString() << ": Added port to allocator";if (prepare_address)port->PrepareAddress();}
UDPPort::PrepareAddress
AsyncPacketSocket状态
UDPPort::OnLocalAddressReady
Port::AddAddress
H:\webrtc-20210315\webrtc-20210315\webrtc\webrtc-checkout\src\p2p\base\port.cc
这里面的foundation是给candidate排序使用的,计算公式是在ice规范里面的。
void Port::AddAddress(const rtc::SocketAddress& address,const rtc::SocketAddress& base_address,const rtc::SocketAddress& related_address,const std::string& protocol,const std::string& relay_protocol,const std::string& tcptype,const std::string& type,uint32_t type_preference,uint32_t relay_preference,const std::string& url,bool is_final) {if (protocol == TCP_PROTOCOL_NAME && type == LOCAL_PORT_TYPE) {RTC_DCHECK(!tcptype.empty());}std::string foundation =ComputeFoundation(type, protocol, relay_protocol, base_address);Candidate c(component_, protocol, address, 0U, username_fragment(), password_,type, generation_, foundation, network_->id(), network_cost_);c.set_priority(c.GetPriority(type_preference, network_->preference(), relay_preference));c.set_relay_protocol(relay_protocol);c.set_tcptype(tcptype);c.set_network_name(network_->name());c.set_network_type(network_->type());c.set_url(url);c.set_related_address(related_address);bool pending = MaybeObfuscateAddress(&c, type, is_final);if (!pending) {FinishAddingAddress(c, is_final);}}
调用 FinishAddingAddress(c, is_final); 将创建好的Candidate传给应用层。
