PeerConnectionServer
的构造函数
一个Endpoint有多个transport(例如每次sub一个),但是只有一个RTPBundleTransport(bundle:native层传输组织对象)
Endpoint :
this.bundle = new Native.RTPBundleTransport();
//Start it
this.bundle.Init();
Transport:
*传输表示通过单个DTLS会话在本地ICE候选者和远程ICE候选者集合之间的连接。
*传输对象将在内部分配本地端的ICE和DTLS信息,以便将其单独发送到远程端并建立连接。
*每个传输都有一组传入和传出流,这些流允许向远程对等方发送或接收RTP流。
*您必须按照远程SDP上的指示创建传入流,因为任何具有未知ssrc的传入RTP都将被忽略。
*创建输出流时,传输将在内部为不同的RTP流分配ssrc,以避免冲突。您将能够从流对象中检索该信息,以便能够在发送到远程端的SDP上宣布它们。
*为了确定如何路由流,必须将一种传输的传出流附加到其他(或相同)传输的传入流上。
bundle: 主要处理: iceTransport; candidate
this.connection = bundle.AddICETransport(this.username,properties);
填上各属性,创建DTLSICETransport
std::shared_ptr<DTLSICETransport> transport = std::make_shared<DTLSICETransport>(sender, loop);
if (useDtls) {
ret = transport->SetRemoteCryptoDTLS(dtls.GetProperty("setup"),dtls.GetProperty("hash"),dtls.GetProperty("fingerprint"));
} else if (useSdes) {
std::string localKey(crypto.GetProperty("localKey"));
std::string remoteKey(crypto.GetProperty("remoteKey"));
ret = transport->SetCryptoSDES(localKey, remoteKey, crypto.GetProperty("suite"));
}
auto connection = std::make_shared<Connection>(username,transport,properties.GetProperty("disableSTUNKeepAlive", false));
transport->Start();
this.transport = this.connection.transport; 收发的具体情况
底层的 RTPBundleTransport
RTPBundleTransport::Init(int port) 在指定的端口收发数据, 后面的收发数据会用到
int RTPBundleTransport::Send(const ICERemoteCandidate* candidate, Packet&& buffer)
loop.Send(socket,candidate->GetIPAddress(),candidate->GetPort(),std::move(buffer));
具体的icetransport等都是通过这个Send函数来发送数据的
定时器里面,处理掉和候选人的连接 SendBindingRequest(connection.get(), candidate.get());
参考: https://cloud.tencent.com/developer/article/1608860
网友评论