libjuice 🍋💦 (JUICE is a UDP Interactive Connectivity Establishment library) allows to open bidirectionnal User Datagram Protocol (UDP) streams with Network Address Translator (NAT) traversal.
The library is a simplified implementation of the Interactive Connectivity Establishment (ICE) protocol, client-side and server-side, written in C without dependencies for POSIX platforms (including GNU/Linux, Android, Apple macOS and iOS) and Microsoft Windows. The client supports only a single component over UDP per session in a standard single-gateway network topology, as this should be sufficient for the majority of use cases nowadays.
libjuice is licensed under MPL 2.0, see LICENSE.
libjuice is available on AUR and vcpkg. Bindings are available for Rust.
For a STUN/TURN server application based on libjuice, see Violet.
The library implements a simplified but fully compatible ICE agent (RFC5245 then RFC8445) featuring:
- STUN protocol (RFC5389 then RFC8489)
- TURN relaying (RFC5766 then RFC8656)
- SDP-based interface (RFC8839)
- IPv4 and IPv6 dual-stack support
- Optional multiplexing on a single UDP port
The limitations compared to a fully-featured ICE agent are:
- Only UDP is supported as transport protocol and other protocols are ignored.
- Only one component is supported, which is sufficient for WebRTC Data Channels and multiplexed RTP+RTCP.
- Candidates are gathered without binding to each network interface, which behaves identically to the full implementation on most client systems.
It also implements a lightweight STUN/TURN server (RFC8489 and RFC8656). The server can be disabled at compile-time with the NO_SERVER
flag.
None!
Optionally, Nettle can provide SHA1 and SHA256 algorithms instead of the internal implementation.
$ git clone https://github.com/paullouisageneau/libjuice.git
$ cd libjuice
The CMake library targets libjuice
and libjuice-static
respectively correspond to the shared and static libraries. The default target will build the library and tests. It exports the targets with namespace LibJuice::LibJuice
and LibJuice::LibJuiceStatic
to link the library from another CMake project.
$ cmake -B build
$ cd build
$ make -j2
The option USE_NETTLE
allows to use the Nettle library instead of the internal implementation for HMAC-SHA1:
$ cmake -B build -DUSE_NETTLE=1
$ cd build
$ make -j2
$ cmake -B build -DCMAKE_TOOLCHAIN_FILE=/usr/share/mingw/toolchain-x86_64-w64-mingw32.cmake # replace with your toolchain file
$ cd build
$ make -j2
$ cmake -B build -G "NMake Makefiles"
$ cd build
$ nmake
$ make
The option USE_NETTLE
allows to use the Nettle library instead of the internal implementation for HMAC-SHA1:
$ make USE_NETTLE=1
See test/connectivity.c for a complete local connection example.
See test/server.c for a server example.