gnugk代码解读之二:H.245控制信令路由的实现


H.245控制信令处理对象

        相关类H245Handler和H245ProxyHandler。H245Handle: This class handles H.245 messages which can either be transmitted on their  own TCP connection or can be tunneled in the Q.931 connection。

        H245ProxyHandler是H245Handler的派生类,它包括了对媒体通道的路由。

        前面提到在CallSignalSocket::OnSetup(…)处理中,创建一个新的CallSignalSocket。在其构造函数CallSignalSocket::CallSignalSocket(CallSignalSocket *socket, WORD port)中调用了void CallSignalSocket::SetRemote(CallSignalSocket *socket),创建socket的H.245处理对象m_h245handler。如果需要路由媒体通道,创建:
new H245ProxyHandler(socket, socket->localAddr, calling); //主叫的H.245信令处理
new H245ProxyHandler(this, localAddr, called, proxyhandler); //被叫的H.245信令处理
如果只路由H.245信令,则创建:
new H245Handler(socket->localAddr, calling); // 主叫的H.245信令处理
new H245Handler(localAddr, called); // 被叫的H.245信令处理

H.245控制信令路由的实现过程

        在了解H.225.0呼叫信令路由的过程后,再理解H.245控制信令路由就简单很多,因为两者基本上一样的。

        首先在线程ProxyHandleThread执行中(ProxyHandleThread::Exec())接收数据,CallSignalSocket::ReceiveData(),如果是CONNECT消息,进入CallSignalSocket::OnConnect(H225_Connect_UUIE & Connect),然后处理CONNECT信令中的H.245地址信息:CallSignalSocket::HandleH245Address(Connect)。

        接着是CallSignalSocket::SetH245Address(H225_TransportAddress & h245addr),这里创建H.245监听:Socket: m_h245socket = new H245Socket(this)。开始监听H.245端口:listener->Listen(1, H245PortRange.GetPort()); 同时创建H.245发送Socket: ret->m_h245socket = new H245Socket(m_h245socket, ret)。

        接下来的过程与H.225.0呼叫路由过程类似:创建或者使用前面已经创建好的ProxyConnectThread线程,在ProxyConnectThread执行过程中(ProxyConnectThread::Exec()),调用socket->ConnectTo(),不同的是,此时socket具体实现类是H245Socket, 接着在H245Socket::ConnectTo()中首先是等待主叫方的H.245连接:remote->Accept(*listener)。收到连接后返回后,调用H245Socket::ConnectRemote()连接被叫方。

        最后把两个H245Socket交给ProxyHandleThread:GetHandler()->Insert(remote)和GetHandler()->Insert(this)。由ProxyHandleThread完成后面的H.245信令路由。

小结
1) 上面只是一个最基本的路由H.245建立过程,中间涉及穿NAT等还有很多分支流程,具体要看代码才能深入;

2) 不管是H.225.0呼叫信令还是H.245控制信令的路由,基本框架是一样的,都是由ProxyHandleThread线程接收,处理和转发。需要建立TCP连接时,使用ProxyConnectThread线程完成TCP建链过程,完成把socket仍交给ProxyHandleThread线程进行接收信令。ProxyConnectThread线程是可以被重复使用的。
 

你可能感兴趣的:(框架,socket,tcp,Class)