libdatachannel adalah implementasi mandiri dari Saluran Data WebRTC, WebRTC Media Transport, dan WebSockets di C++17 dengan pengikatan C untuk platform POSIX (termasuk GNU/Linux, Android, FreeBSD, Apple macOS dan iOS) dan Microsoft Windows. WebRTC adalah standar W3C dan IETF yang memungkinkan pertukaran data dan media peer-to-peer secara real-time antara dua perangkat.
Pustaka ini bertujuan untuk menjadi lugas dan ringan dengan ketergantungan eksternal yang minimal, untuk memungkinkan konektivitas langsung antara aplikasi asli dan browser web tanpa kesulitan mengimpor pustaka referensi Google yang membengkak. Antarmukanya terdiri dari versi JavaScript WebRTC dan WebSocket API yang disederhanakan yang ada di browser, untuk memudahkan desain aplikasi lintas lingkungan.
Itu dapat dikompilasi dengan banyak backend:
Tumpukan WebRTC sepenuhnya kompatibel dengan browser seperti Firefox dan Chromium, lihat Kompatibilitas di bawah. Selain itu, kode yang menggunakan Saluran Data dan WebSockets dari perpustakaan dapat dikompilasi sebagaimana adanya di WebAssembly untuk browser dengan saluran data-wasm.
libdatachannel dilisensikan di bawah MPL 2.0 sejak versi 0.18, lihat LISENSI (versi sebelumnya dilisensikan di bawah LGPLv2.1 atau lebih baru).
libdatachannel tersedia di port AUR, vcpkg, dan FreeBSD. Binding tersedia untuk Rust dan Node.js.
Lihat BUILDING.md untuk instruksi pembangunan.
Lihat contoh untuk contoh penggunaan lengkap dengan server sinyal (di bawah MPL 2.0).
Selain itu, Anda mungkin ingin melihat dokumentasi C API.
# 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 " );
Perpustakaan mengimplementasikan protokol komunikasi berikut:
WebRTC memungkinkan pertukaran data dan media secara real-time antara dua perangkat melalui Koneksi Peer (atau RTCPeerConnection), koneksi peer-to-peer yang diberi sinyal yang dapat membawa Saluran Data dan trek media. Ini kompatibel dengan browser Firefox, Chromium, dan Safari, serta perpustakaan WebRTC lainnya (lihat webrtc-echoes). Transportasi media bersifat opsional dan dapat dinonaktifkan pada waktu kompilasi.
Tumpukan protokol:
Fitur:
Catatan hanya mode SDP BUNDLE yang didukung untuk multiplexing media (RFC8843). Perilaku ini setara dengan kebijakan khusus bundel JSEP: perpustakaan selalu menegosiasikan satu komponen jaringan unik, di mana aliran media SRTP dimultipleks dengan paket kontrol SRTCP (RFC5761) dan lalu lintas data SCTP/DTLS (RFC8261).
WebSocket adalah protokol pilihan untuk pensinyalan WebRTC. Dukungan ini bersifat opsional dan dapat dinonaktifkan pada waktu kompilasi.
Tumpukan protokol:
Fitur:
Terima kasih kepada Streamr, Vagon, Shiguredo, Deon Botha, dan Michael Cho yang telah mensponsori karya ini!