libdatachannel은 POSIX 플랫폼(GNU/Linux, Android, FreeBSD, Apple macOS 및 iOS 포함) 및 Microsoft Windows용 C 바인딩을 사용하여 C++17에서 WebRTC 데이터 채널, WebRTC 미디어 전송 및 WebSocket을 독립형으로 구현한 것입니다. WebRTC는 두 장치 간의 실시간 P2P 데이터 및 미디어 교환을 가능하게 하는 W3C 및 IETF 표준입니다.
이 라이브러리는 Google의 비대해진 참조 라이브러리를 가져오는 수고 없이 기본 애플리케이션과 웹 브라우저 간의 직접 연결을 가능하게 하기 위해 외부 종속성을 최소화하면서 간단하고 가벼워지는 것을 목표로 합니다. 인터페이스는 환경 간 애플리케이션 설계를 쉽게 하기 위해 브라우저에 있는 JavaScript WebRTC 및 WebSocket API의 다소 단순화된 버전으로 구성됩니다.
여러 백엔드로 컴파일할 수 있습니다.
WebRTC 스택은 Firefox 및 Chromium과 같은 브라우저와 완벽하게 호환됩니다. 아래 호환성을 참조하세요. 또한 라이브러리의 데이터 채널 및 WebSocket을 사용하는 코드는 datachannel-wasm이 있는 브라우저용 WebAssembly로 그대로 컴파일될 수 있습니다.
libdatachannel은 버전 0.18부터 MPL 2.0에 따라 라이센스가 부여되었습니다. 라이센스를 참조하세요(이전 버전은 LGPLv2.1 이상에 따라 라이센스가 부여되었습니다).
libdatachannel은 AUR, vcpkg 및 FreeBSD 포트에서 사용할 수 있습니다. Rust 및 Node.js에 바인딩을 사용할 수 있습니다.
제작 지침은 BUILDING.md를 참조하세요.
신호 서버(MPL 2.0 아래)의 전체 사용 예는 예를 참조하세요.
또한 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 " );
라이브러리는 다음 통신 프로토콜을 구현합니다.
WebRTC는 데이터 채널과 미디어 트랙을 모두 전달할 수 있는 신호형 피어 투 피어 연결인 피어 연결(또는 RTCPeerConnection)을 통해 두 장치 간의 실시간 데이터 및 미디어 교환을 허용합니다. Firefox, Chromium, Safari 브라우저 및 기타 WebRTC 라이브러리와 호환됩니다(webrtc-echoes 참조). 미디어 전송은 선택 사항이며 컴파일 타임에 비활성화될 수 있습니다.
프로토콜 스택:
특징:
미디어 멀티플렉싱(RFC8843)에는 SDP BUNDLE 모드만 지원됩니다. 동작은 JSEP 번들 전용 정책과 동일합니다. 라이브러리는 항상 SRTP 미디어 스트림이 SRTCP 제어 패킷(RFC5761) 및 SCTP/DTLS 데이터 트래픽(RFC8261)과 다중화되는 하나의 고유한 네트워크 구성 요소를 협상합니다.
WebSocket은 WebRTC 신호 전달을 위해 선택한 프로토콜입니다. 지원은 선택 사항이며 컴파일 타임에 비활성화될 수 있습니다.
프로토콜 스택:
특징:
이 작품을 후원해주신 Streamr, Vagon, Shiguredo, Deon Botha, Michael Cho에게 감사드립니다!