#ice #nat #parser #webrtc #candidates


A parser for the ICE Candidate SDP according to RFC5245

3 unstable releases

Uses old Rust 2015

0.2.0 Sep 25, 2017
0.1.1 Sep 22, 2017
0.1.0 Sep 22, 2017

#7 in #ice


576 lines


CircleCI Crates.io Version Crates.io Downloads Rust

This is a parser for the ICE Candidate SDP, which is used for connectivity establishment and NAT traversal in communication systems like WebRTC. Bindings for C and Android (through JNI) are provided. Building a universal library for iOS is also possible.

Example candidate SDP:

candidate:842163049 1 udp 1686052607 46154 typ srflx raddr rport 46154 generation 0 ufrag EEtu network-id 3 network-cost 10

It will parse the data into a struct with all components. The example above will result in the following object:

IceCandidate {
    foundation: "842163049",
    component_id: 1,
    transport: Udp,
    priority: 1686052607,
    connection_address: V4(,
    port: 46154,
    candidate_type: Srflx,
    rel_addr: Some(V4(,
    rel_port: Some(46154),
    extensions: Some({
        [110, 101, 116, 119, 111, 114, 107, 45, 99, 111, 115, 116]: [49, 48],
        [103, 101, 110, 101, 114, 97, 116, 105, 111, 110]: [48],
        [117, 102, 114, 97, 103]: [69, 69, 116, 117],
        [110, 101, 116, 119, 111, 114, 107, 45, 105, 100]: [51]

For more information, see RFC5245 (Interactive Connectivity Establishment (ICE)).

Crate docs: https://docs.rs/candidateparser/

Note: Due to build system issues, Rust 1.21+ is required.

FFI (C/C++17)

This library includes C and C++17 bindings, so you can use it from any language that supports the C calling convention. Example programs in C and C++17 can be found in the candidateparser-ffi/examples/ directory.

JNI bindings (Java / Android)

This library also contains JNI bindings, written with jni-rs. An Android library with a simple test is provided in the candidateparser-android directory.

Make sure to build the candidateparser-jni crate before building the Android library.

Building candidateparser-jni for Android


  • Android NDK
  • Rustup
  • Make

Add rustup targets:

$ rustup target add aarch64-linux-android armv7-linux-androideabi i686-linux-android

Build standalone toolchains:

$ ./create-ndk-standalone.sh

Add toolchain config to your ~/.cargo/config:

$ cat cargo-config.toml >> ~/.cargo/config

Build Android libraries:

$ make android

Building the candidateparser-android library for Android

Build the library using gradle:

$ ./gradlew build

You will find the AAR file in the app/build/outputs/aar/ directory.


To run clippy lints, compile the library with --features clippy on a nightly compiler:

$ cargo build --features clippy

Note: Running this command from the workspace root won't work, you have to cd into the sub-crates!

Universal iOS library

If you want to build a universal iOS library, install cargo-lipo. Then, delete the Cargo.toml file in the root (cargo-lipo cannot deal with workspaces currently).

$ rm Cargo.toml

Finally, build the library:

$ make ios

Note that this only works on macOS at the moment.


Licensed under either of


Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.


~16K SLoC