Lite reliable UDP library for .NET Standard 2.0 (Mono, .NET Core, .NET Framework)
HighLevel API Part: LiteEntitySystem
OLD BRANCH (and examples) for 0.9.x
( Warning! Master branch can be unstable! )
- Lightweight
- Small CPU and RAM usage
 - Small packet size overhead ( 1 byte for unreliable, 4 bytes for reliable packets )
 
 - Simple connection handling
 - Peer to peer connections
 - Helper classes for sending and reading messages
 - Multiple data channels
 - Different send mechanics
- Reliable with order
 - Reliable without order
 - Reliable sequenced (realiable only last packet)
 - Ordered but unreliable with duplication prevention
 - Simple UDP packets without order and reliability
 
 - Fast packet serializer (Usage manual)
 - Automatic small packets merging
 - Automatic fragmentation of reliable packets
 - Automatic MTU detection
 - Optional CRC32C checksums
 - UDP NAT hole punching
 - NTP time requests
 - Packet loss and latency simulation
 - IPv6 support (using separate socket for performance)
 - Connection statisitcs
 - Multicasting (for discovering hosts in local network)
 - Unity support
 - Support for .NET8 optimized socket calls (much less gc)
 - Supported platforms:
- Windows/Mac/Linux (.NET Framework, Mono, .NET Core, .NET Standard)
 - Lumin OS (Magic Leap)
 - Monogame
 - Godot
 - Unity 2018.3 (Desktop platforms, Android, iOS, Switch)
 
 
- 
USDT TRC20:
TE5eBgq8SyEeZFKtCgZG9GwL34sANmbc67 - 
USDT BEP20/ERC20:
0x4c0D6DC76c6A6B354f5ec6c9e51893fFC6510d1E - 
Bitcoin:
bc1q269ecs8r5vnrum5qr5j98sdglhnxlulv0f6egd 
- Minimal supported Unity is 2018.3. For older Unity versions use 0.9.x library versions
 - Always use library sources or OpenUPM package instead of precompiled DLL files ( because there are platform specific #ifdefs and workarounds for unity bugs )
 
EventBasedNetListener listener = new EventBasedNetListener();
NetManager client = new NetManager(listener);
client.Start();
client.Connect("localhost" /* host ip or name */, 9050 /* port */, "SomeConnectionKey" /* text key or NetDataWriter */);
listener.NetworkReceiveEvent += (fromPeer, dataReader, deliveryMethod, channel) =>
{
    Console.WriteLine("We got: {0}", dataReader.GetString(100 /* max length of string */));
    dataReader.Recycle();
};
while (!Console.KeyAvailable)
{
    client.PollEvents();
    Thread.Sleep(15);
}
client.Stop();EventBasedNetListener listener = new EventBasedNetListener();
NetManager server = new NetManager(listener);
server.Start(9050 /* port */);
listener.ConnectionRequestEvent += request =>
{
    if(server.ConnectedPeersCount < 10 /* max connections */)
        request.AcceptIfKey("SomeConnectionKey");
    else
        request.Reject();
};
listener.PeerConnectedEvent += peer =>
{
    Console.WriteLine("We got connection: {0}", peer);  // Show peer ip
    NetDataWriter writer = new NetDataWriter();         // Create writer class
    writer.Put("Hello client!");                        // Put some string
    peer.Send(writer, DeliveryMethod.ReliableOrdered);  // Send with reliability
};
while (!Console.KeyAvailable)
{
    server.PollEvents();
    Thread.Sleep(15);
}
server.Stop();