libdatachannel ist eine eigenständige Implementierung von WebRTC Data Channels, WebRTC Media Transport und WebSockets in C++17 mit C-Bindungen für POSIX-Plattformen (einschließlich GNU/Linux, Android, FreeBSD, Apple macOS und iOS) und Microsoft Windows. WebRTC ist ein W3C- und IETF-Standard, der den Peer-to-Peer-Daten- und Medienaustausch zwischen zwei Geräten in Echtzeit ermöglicht.
Ziel der Bibliothek ist es, sowohl unkompliziert als auch leichtgewichtig zu sein und minimale externe Abhängigkeiten zu haben, um eine direkte Konnektivität zwischen nativen Anwendungen und Webbrowsern zu ermöglichen, ohne dass der Import der aufgeblähten Referenzbibliothek von Google mühsam ist. Die Schnittstelle besteht aus etwas vereinfachten Versionen der in Browsern vorhandenen JavaScript-WebRTC- und WebSocket-APIs, um das Design umgebungsübergreifender Anwendungen zu erleichtern.
Es kann mit mehreren Backends kompiliert werden:
Der WebRTC-Stack ist vollständig kompatibel mit Browsern wie Firefox und Chromium, siehe Kompatibilität unten. Darüber hinaus kann Code, der Datenkanäle und WebSockets aus der Bibliothek verwendet, unverändert zu WebAssembly für Browser mit datachannel-wasm kompiliert werden.
libdatachannel ist seit Version 0.18 unter MPL 2.0 lizenziert, siehe LIZENZ (frühere Versionen wurden unter LGPLv2.1 oder höher lizenziert).
libdatachannel ist auf AUR-, vcpkg- und FreeBSD-Ports verfügbar. Bindungen sind für Rust und Node.js verfügbar.
Bauanweisungen finden Sie unter BUILDING.md.
Vollständige Anwendungsbeispiele mit Signalisierungsserver (unter MPL 2.0) finden Sie in den Beispielen.
Darüber hinaus möchten Sie möglicherweise einen Blick auf die C-API-Dokumentation werfen.
# include " rtc/rtc.hpp "
rtc::Configuration config;
config.iceServers.emplace_back( " mystunserver.org:3478 " );
rtc::PeerConnection pc (config);
pc.onLocalDescription([](rtc::Description sdp) {
// Send the SDP to the remote peer
MY_SEND_DESCRIPTION_TO_REMOTE ( std::string (sdp));
});
pc.onLocalCandidate([](rtc::Candidate candidate) {
// Send the candidate to the remote peer
MY_SEND_CANDIDATE_TO_REMOTE (candidate. candidate (), candidate. mid ());
});
MY_ON_RECV_DESCRIPTION_FROM_REMOTE ([&pc](std::string sdp) {
pc. setRemoteDescription ( rtc::Description (sdp));
});
MY_ON_RECV_CANDIDATE_FROM_REMOTE ([&pc](std::string candidate, std::string mid) {
pc. addRemoteCandidate ( rtc::Candidate (candidate, mid));
});
pc.onStateChange([](rtc::PeerConnection::State state) {
std::cout << " State: " << state << std::endl;
});
pc.onGatheringStateChange([](rtc::PeerConnection::GatheringState state) {
std::cout << " Gathering state: " << state << std::endl;
});
auto dc = pc.createDataChannel( " test " );
dc-> onOpen ([]() {
std::cout << " Open " << std::endl;
});
dc-> onMessage ([](std::variant<rtc::binary, rtc::string> message) {
if (std::holds_alternative<rtc::string>(message)) {
std::cout << " Received: " << get<rtc::string>(message) << std::endl;
}
});
std::shared_ptr<rtc::DataChannel> dc;
pc.onDataChannel([&dc](std::shared_ptr<rtc::DataChannel> incoming) {
dc = incoming;
dc-> send ( " Hello world! " );
});
rtc::WebSocket ws;
ws.onOpen([]() {
std::cout << " WebSocket open " << std::endl;
});
ws.onMessage([](std::variant<rtc::binary, rtc::string> message) {
if (std::holds_alternative<rtc::string>(message)) {
std::cout << " WebSocket received: " << std::get<rtc::string>(message) << endl;
}
});
ws.open( " wss://my.websocket/service " );
Die Bibliothek implementiert die folgenden Kommunikationsprotokolle:
WebRTC ermöglicht den Echtzeit-Daten- und Medienaustausch zwischen zwei Geräten über eine Peer-Verbindung (oder RTCPeerConnection), eine signalisierte Peer-to-Peer-Verbindung, die sowohl Datenkanäle als auch Medienspuren übertragen kann. Es ist mit den Browsern Firefox, Chromium und Safari sowie anderen WebRTC-Bibliotheken kompatibel (siehe webrtc-echoes). Der Medientransport ist optional und kann zur Kompilierungszeit deaktiviert werden.
Protokollstapel:
Merkmale:
Beachten Sie, dass nur der SDP-BUNDLE-Modus für Medienmultiplexing unterstützt wird (RFC8843). Das Verhalten entspricht der JSEP-Bundle-only-Richtlinie: Die Bibliothek handelt immer eine eindeutige Netzwerkkomponente aus, wobei SRTP-Medienströme mit SRTCP-Steuerpaketen (RFC5761) und SCTP/DTLS-Datenverkehr (RFC8261) gemultiplext werden.
WebSocket ist das Protokoll der Wahl für die WebRTC-Signalisierung. Die Unterstützung ist optional und kann zur Kompilierungszeit deaktiviert werden.
Protokollstapel:
Merkmale:
Vielen Dank an Streamr, Vagon, Shiguredo, Deon Botha und Michael Cho für das Sponsoring dieser Arbeit!