AllocationSequeue类
成员变量:
BasicPortAllocatorSession *session_;
NetWork *network_;
PortConfiguration *config_;
UDPPort *udp_port_;
AsyncPacketSocket *udp_socket_;
AllocationSequeue::State state_; //[kInit, kRunning, kStoped, kCompleted]
unsigned int flags_;
int phase_; //[PHASE_UDP, PHASE_RELAY, PHASE_TCP]
关键接口函数:
void Init();
void Start();
void Stop();
void OnMessage(Message *msg);
信号:
sigslot::signal1<AllocationSequeue *> SignalPortAllocationComplete;
对应的槽:
BasicPortAllocatorSession::OnPortAllocationComplete;
使用方法:
AllocationSequeue *sequeue = new AllocationSequeue(BasicPortAllocatorSession *p, NetWork *p1, config, flags);
sequeue->SignalPortAllocationComplete.connect(&BasicPortAllocatorSession::OnPortAllocationComplete);
sequeue->Init();
sequeue->Start();
void Init()方法:
udp_socket_.reset(); //创建udp_socket_
udp_socket_->SignalReadPacket.connect(this, &AllocationSequeue::OnReadPacket);
void Start()方法流程:
state_ = kRunning;
session_->network_thread()->Post(this, MSG_ALLOCATION_PHASE);
previous_best_ip_ = network_->GetBestIP();
void OnMessage()方法流程主要时处理MSG_ALLOCATION_PHASE消息
CreateUDPPorts()流程:
udp_port_ = UDPPort::Create();
udp_port_->SignalDestroyed.connect(this, &AllocationSequeue::OnPortDestroyed);
udp_port_->set_server_address(stun server ip);
session_->AddAllocatedPort(udp_port_, this, true); //!!!
udp_socket_相关的信号槽:
SignalReadPacket.connect(this, &AllocationSequeue::OnReadPacket);
void OnReadPacket()内部逻辑:
udp_port_->HandleIncomingPacket(); //将收到数据传递给UDPPort对象
-----------------------分割线------------------------
void Start() ----Post----> void OnMessage() -> CreateUDPPorts() -> BasicPortAllocatorSession::AddAllocatedPort()