轉載自:http://mysuperbaby.iteye.com/blog/932449
1.
SessionManager管理多個Session:

class SessionManager
{
typedef std::map<std::string, Session*> SessionMap;
SessionMap session_map_;
}
每個Session在SessionManager里通過sid來區分:
session_map_[session->id()] = session;
通過SessionManager::CreateSession(content_type)創建一個Session, 每個Session對應一個content_type:

class Session
{
std::string content_type_;
}
content_type目前傳入的為"urn:xmpp:jingle:apps:rtp:1", 其實就是<content>下<description>元素的"xmlns"屬性值.
2.
一個Session管理多個Transport:
typedef std::map<std::string, TransportProxy*> TransportMap;

class Session
{
TransportMap transports_;
}
每個Transport在Session里通過content_name來區分:
transports_[content_name] = transproxy;
通過Session::GetOrCreateTransportProxy(content_name)來創建一個Transport. content_name就是<content>元素的name屬性值, 如"audio", "video"等. 比如, 在視頻聊天中:
<jingle>
<content name="audio" creator="initiator">
</content>
<content name="video" creator="initiator">
</content>
</jingle>
3.
一個Transport管理多個Transportchannel:
typedef std::map<std::string, TransportChannelImpl*> ChannelMap;

class Transport
{
ChannelMap channels_;
}
每個Transportchannel通過channel_name來區分:
channels_[name] = channel;
通過 Transport::CreateChannel(name)創建一個Transport, channel_name沒有對應的XMPP stanza, 其值有"rtp", "rtcp"等.
4.
一個TransportChannel(主要是P2PTransportChannel)管理多個Port:

class P2PTransportChannel
{
std::vector<Port *> ports_;
}
Port分為StunPort, TCPPort, UDPPort等, 與<transport>元素的xmlns屬性值(如"urn:xmpp:jingle:transports:ice-udp:1")以及子元素<candidate>的protocol屬性值(如"udp")有關.
5.
一個Port管理多個Connection:

class Port
{
typedef std::map<talk_base::SocketAddress, Connection*> AddressMap;
AddressMap connections_;
}
6.
一個Connection包括一個local_candidate和一個remote_candidate:
class Connection

class Connection
{
size_t local_candidate_index_;
Candidate remote_candidate_;
}