libjingle源码分析之三:P2P

  • 摘要

        本文主要介绍了libjingle库中的P2P模块。

  • 概述

        在libjingle中,P2P模块并非一个完全独立的模块,它的实现依赖于Jingle协议,需要通过libjingle中的其它模块获取必要的信息和支持。P2P模块的内部结构及与其它模块的关系如下图所示。

libjingle源码分析之三:P2P_第1张图片

        如前文所示,SocketServer模块是用来管理socket的服务端,并且通过Dispather来分发数据。它的一个实现是PhysicalSocketServer和SocketDispatcher。SocketDispatcher有两重身份,既是Dispatcher、又是PhysicalSocket(可以理解为一个真正的用来通信的socket),这样SocketDispatcher可以作为分发器和SocketServer相连,又可以作为socket向P2P模块提供支持。
        P2P模块可以理解为一个连接器,屏蔽了底层的连接细节,提供了socket连接所需要的连接参数(本地和远程的ip地址和端口号等),同时也可以管理所有与远程的连接。上图中的双向箭头代表了数据的传输通道。当有数据接收到时,先传递到SocketServer模块,然后经过P2P模块,最后达到其它模块中。若发送数据的话,采用相反的顺序即可。
        P2P模块内部又分有如下几个模块,它们被包含在P2PTransportChannel类中,作为一个TransportChannel来接收和发送数据。
        Socket:封装了PhysicalSocket。
        NetWork:代表了一个本地连接,相当于本地连接的配置信息。win7中对应于“控制面板\网络和 Internet\网络连接”。
        Port:代表了本地的一个开放的端口。它和本地的不同的ip地址组合成不同的服务端口。每个端口可以和远程的多个端口对应。
        Connection:代表的是一对一的本地和远程端口的连接。同一个远程端口,可能会有多个连接,P2P内部会选择一个最优的连接来传输数据。
        Candidate:代表的是一个远程端,包含了ip地址和端口号。这个信息是通过libjingle中Session和Transport模块获得,后续会分析这两个模块。

你可能感兴趣的:(libjingle)