gnugk代码解读之三:媒体通道数据和媒体控制通道数据的路由

 H.245控制信令处理

       在ProxyHandleThread::Exec()函数中,进入H245Socket::ReceiveData()函数中
sigSocket->HandleH245Mesg(strm)),再由m_h245handler处理这个消息流m_h245handler->HandleMesg(strm) 解码流,判断四种类型的消息(如果是H245ProxyHandler类的m_h245handler,处理流程一样,但处理函数都重写了)

case H245_MultimediaSystemControlMessage::e_request:
case H245_MultimediaSystemControlMessage::e_response:
case H245_MultimediaSystemControlMessage::e_command:
case H245_MultimediaSystemControlMessage::e_indication:

        如果消息处理时改变了,就会重新编码,否则就转发收到的信令。
只路由H.245信令的情况下,会调用H245Handler::HandleRequest(…)。request消息是OpenLogicalChannel消息,如果是对端是在NAT后面的,这时会用NATHandler来处理。NATHandler::HandleOpenLogicalChannel(…)中,将媒体控制信道和媒体信道的地址转换为NAT的地址。(由于这里无法得到NAT端口,只是改变NAT的IP地址,对后续媒体通道穿NAT有什么作用?)

         路由媒体通道的情况下,会调用H245ProxyHandler::HandleRequest(…),接着H245ProxyHandler::HandleOpenLogicalChannel(…),这时就判断是打开T120信道,还是打开媒体控制逻辑信道和媒体逻辑信道了。

媒体通道的路由

        涉及LogicalChannel和RTPLogicalChannel类。按顺序调用:

H245ProxyHandler::HandleRequest(…)
H245ProxyHandler::HandleOpenLogicalChannel(…)
H245ProxyHandler::OnLogicalChannelParameters(…)

       这时建立RTPLogicalChannel。这时候只是建立了接收socket 并没有开始真正接收数据。在gk收到OpenLogicalChannelAck后,调用245ProxyHandler::HandleOpenLogicalChannelAck()。然后找到对应的逻辑通道:LogicalChannel *lc = peer->FindLogicalChannel(flcn); 再调用RTPLogicalChannel::StartReading(ProxyHandleThread *handler)将RTPLogicalChannel中的rtp和rtcp socket(UDPProxySocket)交给路由处理线程ProxyHandleThread从网络收数据。T.120数据路由与媒体通道数据路由类似,细节可参照源代码。

几点提示

1) ProxyHandleThread线程不仅路由H.225.0和H.245信令,而且还负责路由媒体通道和媒体控制通道的数据。

2) GK根据OpenLogicalChannel建立RTPLogicalChannel,内部创建接收数据的socket;收到OpenLogicalChannelAck后,开始真正接收数据。GK只需要建立接收数据的socket并不需要专门建立发送数据的socket。

3) 对于同一个sessionId,GK创建两个RTPLogicalChannel,一个称为前向(forward),一个称为反向(reverse)。先建立的就是前向,后建立的就是反向。GK分别调用
UDPProxySocket::SetForwardDestination()
UDPProxySocket::SetReverseDestination
设置前向和反向的目的地址,供转发数据时使用。这里为什么不直接设置一个目的,而要区分正向和反向?
 

你可能感兴趣的:(gnugk代码解读之三:媒体通道数据和媒体控制通道数据的路由)