1. 程式人生 > >libjingle原始碼分析之三:P2P

libjingle原始碼分析之三:P2P

  • 摘要

        本文主要介紹了libjingle庫中的P2P模組。

  • 概述

        在libjingle中,P2P模組並非一個完全獨立的模組,它的實現依賴於Jingle協議,需要通過libjingle中的其它模組獲取必要的資訊和支援。P2P模組的內部結構及與其它模組的關係如下圖所示。


        如前文所示,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模組獲得,後續會分析這兩個模組。