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

Paul-Louis Ageneau f246b6d13b Updated Readme 6 年之前
include 29aa871583 Made Configuration optional in PeerConnection 6 年之前
src f481608f26 Changed Candidate::candidate() method to return entire line 6 年之前
test deb215c600 Added message sending to test 6 年之前
usrsctp @ 04d617c9c1 d7049e7322 Updated usrsctp 6 年之前
.clang-format 611c53191c Added .clang-format and .editorconfig 6 年之前
.editorconfig 611c53191c Added .clang-format and .editorconfig 6 年之前
.gitignore f19a0aa6c7 Simple local test with two peer connections 6 年之前
.gitmodules 1c0a97980b Added usrsctp submodule 6 年之前
LICENSE f844c71e0f Initial commit 6 年之前
Makefile 6e3ba6afd7 Reorganised project to separate public from private headers 6 年之前
README.md f246b6d13b Updated Readme 6 年之前

README.md

libdatachannel - C/C++ WebRTC DataChannels

libdatachannel is a simple implementation of WebRTC DataChannels in C++ 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.

Dependencies

Submodules:

Building

git submodule update --init --recursive
make

Example

Signal a PeerConnection

auto pc = std::make_shared<PeerConnection>();

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

pc->onLocalCandidate([](const optional<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(Description(sdp));
});

MY_ON_RECV_CANDIDATE_FROM_REMOTE([pc](string candidate, string mid) {
    pc->setRemoteCandidate(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

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