Ο διαχειριστής σύνδεσης

Εισαγωγή

Ο διαχειριστής σύνδεσης είναι το πρώτο κομμάτι των χαρακτηριστικών ομάδας συνομιλίας. Αυτή η τάξη διαχειρίζεται τις συνδέσεις με τους ομοτίμους και προσφέρει στον χρήστη πολλαπλασιασμένες πρίζες σε συσκευές που θέλουν να συνδεθούν. Για παράδειγμα, αν η Alice θέλει να συνδεθεί με μια συσκευή του Bob για τη μεταφορά 2 αρχείων, θα ζητήσει από τον Διαχειριστή σύνδεσης να ανοίξει 2 κανάλια (ένα ανά αρχείο) στον Bob. Αυτό θα δώσει:

    aliceAccount->connectionManager().connectDevice(bobDeviceId, "file://file1",
        [](std::shared_ptr<ChannelSocket> socket) {
        if (socket) {
            // transfer first file
        }
    });

    aliceAccount->connectionManager().connectDevice(bobDeviceId, "file://file2",
        [](std::shared_ptr<ChannelSocket> socket) {
        if (socket) {
            // transfer second file
        }
    });

Πίσω από αυτό, ο ConnectionManager θα συνδεθεί πρώτα με τη συσκευή του Bob μέσω του DHT (μέσω του ICE) και θα ρυθμίσει ένα TLS Socket. Στη συνέχεια, θα ζητήσει ένα κανάλι, και όταν το κανάλι είναι έτοιμο, ενημερώστε την Alice μέσω ενός callback. Για το δεύτερο αρχείο, θα χρησιμοποιήσει το πρώτο socket και θα ανοίξει απλά ένα νέο κανάλι (απλά χρειάζεται 2 TLS πακέτα, οπότε είναι γρήγορο)

Δεξοδική πλευρά DHT

Είναι το ίδιο με call, βλέπε Exchange ICE υποψήφιοι, ICE διαπραγμάτευση, Encrypt το control socket αλλά μόνο στο TCP.

Ωστόσο, όταν μια πλευρά λαμβάνει νέα αίτηση ICE, ενεργοποιείται η ανάκληση που καθορίζεται από άκυρη onICERequest(onICERequestCallback&&& cb);.

Διαπραγματεύονται για ένα νέο κανάλι

Ένα κανάλι ορίζεται από ένα id (μονώδες) και ένα uri (μη μοναδικό).

Όταν είναι έτοιμο, ο Διαχειριστής Συνδέσεων θεωρεί ότι υπάρχει το κανάλι 0.

Το πρωτόκολλο που χρησιμοποιείται είναι αρκετά απλό και μοιάζει με το πρωτόκολλο RTP:

  1. 16 bits χρησιμοποιούνται για να αποθηκεύσει το μήκος του σώματος.

  2. 16 bits για το id καναλιού (διαδρομή)

  3. σώμα

Έτσι όλα τα πακέτα έχουν ένα 32 bits len header.

Για να ζητήσει ένα νέο κανάλι, ο Διαχειριστής Σύνδεσης θα στείλει ένα ChannelRequest αντικείμενο (msgpack χρησιμοποιείται για να σειριαστεί το δομή) στο κανάλι 0 για να στείλει το id και το όνομα του νέου κανάλι στον ομολόγο (με isAnswer = false).

Κλείσιμο κανάλου

Ένα EOF μεταδίδεται για ένα κανάλι εάν το μήκος του περιεχομένου είναι 0.

Διαρθρωση της σύνδεσηςΔιοικητής

Ιδιοκτησία

  1. Ένα JamiAccount κατέχει το ConnectionManager και έχει πρόσβαση στα αντικείμενα ChannelSocket (shared_ptr που ανήκει στο MultiplexedSocket.

  2. Ο ConnectionManager κατέχει MultiplexedSockets και αντικείμενα ICE

  3. Το MultiplexedSockets κατέχει την μεταφορά TLS και τα αντικείμενα ChannelSocket

  4. Η ChannelSocket κατέχει τα μπουφέρ δεδομένων

Χρήστες

  1. Ο ConnectionManager χρησιμοποιείται για τη διαχείριση συνδέσεων με ομοτίμους.

  2. Τα MultiplexedSockets χρησιμοποιούνται για την αποστολή δεδομένων μέσω του TLSSocket, τη διάγνωση των εισερχόμενων πακέτων και τη διαχείριση των καναλιών.

  3. Τα ChannelSockets χρησιμοποιούνται από τον πελάτη για να αλληλεπιδράσει με τον άλλο ομοτίμο.

Χρήση

Τα σενάρια περιγράφονται στις αντίστοιχες δοκιμές μονάδας (test/unitTest/connectionManager/connectionManager.cpp)