#WebRTC #networking #p2p #tcp #udp #rtcpeerconnection

Paul-Louis Ageneau db90d710b1 Added STUN server to example 6 lat temu
include 81dd3120a9 Renamed servers to iceServers in configuration 6 lat temu
src 81dd3120a9 Renamed servers to iceServers in configuration 6 lat temu
test c951a6ca86 Renamed setRemoteCandidate to addRemoteCandidate 6 lat temu
usrsctp @ 04d617c9c1 d7049e7322 Updated usrsctp 6 lat temu
.clang-format 611c53191c Added .clang-format and .editorconfig 6 lat temu
.editorconfig 611c53191c Added .clang-format and .editorconfig 6 lat temu
.gitignore f19a0aa6c7 Simple local test with two peer connections 6 lat temu
.gitmodules 1c0a97980b Added usrsctp submodule 6 lat temu
LICENSE f844c71e0f Initial commit 6 lat temu
Makefile 6e3ba6afd7 Reorganised project to separate public from private headers 6 lat temu
README.md db90d710b1 Added STUN server to example 6 lat temu

README.md

libdatachannel - C/C++ WebRTC DataChannels

libdatachannel is a simple implementation of WebRTC DataChannels in C++17 with C bindings. Its API is modelled as a simplified version of the JavaScript WebRTC API, in order to ease the design of cross-environment applications.

This projet is originally inspired by librtcdcpp, however it is a complete rewrite from scratch, because the messy architecture of librtcdcpp made solving its implementation issues difficult.

Licensed under LGPLv2, see LICENSE.

Dependencies

Submodules:

Building

git submodule update --init --recursive
make

Example

Signal a PeerConnection

rtc::Configuration config;
config.iceServers.emplace_back("stunserver.org:3478");

auto pc = make_shared<rtc::PeerConnection>(config);

pc->onLocalDescription([](const rtc::Description &sdp) {
    // Send the SDP to the remote peer
    MY_SEND_DESCRIPTION_TO_REMOTE(string(sdp));
});

pc->onLocalCandidate([](const optional<rtc::Candidate> &candidate) {
    if (candidate) {
        MY_SEND_CANDIDATE_TO_REMOTE(candidate->candidate(), candidate->mid());
    } else {
        // Gathering finished
    }
});

MY_ON_RECV_DESCRIPTION_FROM_REMOTE([pc](string sdp) {
    pc->setRemoteDescription(rtc::Description(sdp));
});

MY_ON_RECV_CANDIDATE_FROM_REMOTE([pc](string candidate, string mid) {
    pc->addRemoteCandidate(rtc::Candidate(candidate, mid));
});

Create a DataChannel

auto dc = pc->createDataChannel("test");
dc->onOpen([]() {
    cout << "Open" << endl;
});
dc->onMessage([](variant<binary, string> message) {
    if (holds_alternative<string>(message)) {
        cout << "Received: " << get<string>(message) << endl;
    }
});

Receive a DataChannel

shared_ptr<rtc::DataChannel> dc;
pc->onDataChannel([&mydc](shared_ptr<rtc::DataChannel> incoming) {
	dc = incoming;
    dc->send("Hello world!");
});