All Projects β†’ TimonPost β†’ laminar

TimonPost / laminar

Licence: other
A simple semi-reliable UDP protocol for multiplayer games

Programming Languages

rust
11053 projects

Projects that are alternatives of or similar to laminar

Mts
Project of Multi-protocol Test Tool opensourced by Ericsson
Stars: ✭ 34 (-95.26%)
Mutual labels:  udp, protocol
Node Lifx
Node.js implementation of the LIFX LAN protocol πŸ’‘
Stars: ✭ 137 (-80.89%)
Mutual labels:  udp, protocol
Kcp
⚑ KCP - A Fast and Reliable ARQ Protocol
Stars: ✭ 10,473 (+1360.67%)
Mutual labels:  udp, protocol
Ngtcp2
ngtcp2 project is an effort to implement IETF QUIC protocol
Stars: ✭ 589 (-17.85%)
Mutual labels:  udp, protocol
Hazel Networking
Hazel Networking is a low level networking library for C# providing connection orientated, message based communication via TCP, UDP and RUDP.
Stars: ✭ 194 (-72.94%)
Mutual labels:  udp, protocol
Dhcpwn
All your IPs are belong to us.
Stars: ✭ 642 (-10.46%)
Mutual labels:  udp, protocol
Ruffles
Lightweight and fully managed reliable UDP library.
Stars: ✭ 131 (-81.73%)
Mutual labels:  udp, protocol
Reliable
A packet acknowledgement system for UDP
Stars: ✭ 446 (-37.8%)
Mutual labels:  udp, protocol
Quic.net
A .NET C# Implementation of QUIC protocol - Google's experimental transport layer.
Stars: ✭ 173 (-75.87%)
Mutual labels:  udp, protocol
Netcode
A protocol for secure client/server connections over UDP
Stars: ✭ 2,121 (+195.82%)
Mutual labels:  udp, protocol
Blinksocks
A framework for building composable proxy protocol stack.
Stars: ✭ 587 (-18.13%)
Mutual labels:  udp, protocol
Pjon
PJON (Padded Jittering Operative Network) is an experimental, arduino-compatible, multi-master, multi-media network protocol.
Stars: ✭ 2,615 (+264.71%)
Mutual labels:  udp, protocol
Laminar
A simple semi-reliable UDP protocol for multiplayer games
Stars: ✭ 530 (-26.08%)
Mutual labels:  udp, protocol
Lsquic
LiteSpeed QUIC and HTTP/3 Library
Stars: ✭ 727 (+1.39%)
Mutual labels:  udp, protocol
Enet Csharp
Reliable UDP networking library
Stars: ✭ 464 (-35.29%)
Mutual labels:  udp, protocol
Mud
Multipath UDP library
Stars: ✭ 100 (-86.05%)
Mutual labels:  udp, protocol
STUP-Protocol
Secure/Speedup TCP-like UDP protocol
Stars: ✭ 12 (-98.33%)
Mutual labels:  udp, protocol
ethereum-dissectors
πŸ”Wireshark dissectors for Ethereum devp2p protocols
Stars: ✭ 82 (-88.56%)
Mutual labels:  udp, protocol
Yojimbo
A network library for client/server games written in C++
Stars: ✭ 2,041 (+184.66%)
Mutual labels:  udp, protocol
Pypacker
πŸ“¦ The fastest and simplest packet manipulation lib for Python
Stars: ✭ 216 (-69.87%)
Mutual labels:  udp, protocol

Laminar

Build Status Latest Version docs.rs Join us on Discord MIT/Apache Lines of Code Coverage

Laminar is an application-level transport protocol which provides configurable reliability and ordering guarantees built on top of UDP. It focuses on fast-paced fps-games and provides a lightweight, message-based interface.

Laminar was designed to be used within the Amethyst game engine but is usable without it.

If you are new to laminar or networking in general, We strongly recommend taking a look at the laminar book

Concepts

This library is loosely based off of Gaffer on Games and shares features similar as RakNet, Steam Socket, netcode.io. The idea is to provide an in rust written, low-level UDP-protocol which supports the use of cases of video games that require multiplayer features. The library itself provides a few low-level types of packets that provide different types of guarantees. The most basic are unreliable and reliable packets. Also ordering, sequencing can be done on multiple streams. For more information, read the projects README.md, book, docs or examples.

Table of contents:

Features

These are the features this crate provides:

  • Fragmentation
  • Unreliable packets
  • Unreliable sequenced packets
  • Reliable unordered packets
  • Reliable ordered packets
  • Reliable sequenced packets
  • Rtt estimations
  • Protocol version monitoring
  • Basic connection management
  • Heartbeat
  • Basic DoS mitigation
  • High Timing control
  • Protocol Versioning
  • Well-tested by integration and unit tests
  • Can be used by multiple threads (Sender, Receiver)

Planned

  • Handshake Protocol
  • Advanced Connection Management
  • Cryptography
  • Congestion Control

Getting Started

Add the laminar package to your Cargo.toml file.

[dependencies]
laminar = "0.5"

Useful Links

Examples

Please check out our examples for more information.

UDP API | see more

This is an example of how to use the UDP API.

Send packets

use laminar::{Socket, Packet};

// Creates the socket
let mut socket = Socket::bind("127.0.0.1:12345")?;
let packet_sender = socket.get_packet_sender();
// Starts the socket, which will start a poll mechanism to receive and send messages.
let _thread = thread::spawn(move || socket.start_polling());

// Bytes to sent
let bytes = vec![...];

// Creates packets with different reliabilities
let unreliable = Packet::unreliable(destination, bytes);
let reliable = Packet::reliable_unordered(destination, bytes);

// Specifies on which stream and how to order our packets, check out our book and documentation for more information
let unreliable = Packet::unreliable_sequenced(destination, bytes, Some(1));
let reliable_sequenced = Packet::reliable_sequenced(destination, bytes, Some(2));
let reliable_ordered = Packet::reliable_ordered(destination, bytes, Some(3));

// Sends the created packets
packet_sender.send(unreliable).unwrap();
packet_sender.send(reliable).unwrap();
packet_sender.send(unreliable_sequenced).unwrap();
packet_sender.send(reliable_sequenced).unwrap();
packet_sender.send(reliable_ordered).unwrap();

Receive Packets

use laminar::{SocketEvent, Socket};

// Creates the socket
let mut socket = Socket::bind("127.0.0.1:12346")?;
let event_receiver = socket.get_event_receiver();
// Starts the socket, which will start a poll mechanism to receive and send messages.
let _thread = thread::spawn(move || socket.start_polling());

// Waits until a socket event occurs
let result = event_receiver.recv();

match result {
    Ok(socket_event) => {
        match socket_event {
            SocketEvent::Packet(packet) => {
                let endpoint: SocketAddr = packet.addr();
                let received_data: &[u8] = packet.payload();
            }
            SocketEvent::Connect(connect_event) => { /* a client connected */ }
            SocketEvent::Timeout(timeout_event) => { /* a client timed out */ }
            SocketEvent::Disconnect(disconnect_event) => { /* a client disconnected */ }
        }
    }
    Err(e) => {
        println!("Something went wrong when receiving, error: {:?}", e);
    }
}

Authors

Notice

This library is not fully stable yet, and there may be breaking changes to the API. For more advanced examples of using laminar, you can check out the Amethyst-Network crate.

Contribution

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.

License

Licensed under either of

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].