Moongate.Network
0.19.0
Prefix Reserved
dotnet add package Moongate.Network --version 0.19.0
NuGet\Install-Package Moongate.Network -Version 0.19.0
<PackageReference Include="Moongate.Network" Version="0.19.0" />
<PackageVersion Include="Moongate.Network" Version="0.19.0" />
<PackageReference Include="Moongate.Network" />
paket add Moongate.Network --version 0.19.0
#r "nuget: Moongate.Network, 0.19.0"
#:package Moongate.Network@0.19.0
#addin nuget:?package=Moongate.Network&version=0.19.0
#tool nuget:?package=Moongate.Network&version=0.19.0
Moongate.Network
Standalone asynchronous TCP transport with framing, middleware, and per-connection pipelines for .NET applications.
Installation
Requires .NET 10. Use the package version available in your configured NuGet feed.
dotnet add package Moongate.Network
Features
- Asynchronous TCP server and client APIs.
- Access to the bound server endpoint, including an automatically assigned port.
- Configurable framing, transport codecs, and middleware.
- Per-connection pipelines for application-specific connection handling.
Example
Start a loopback listener on an available port and stop it cleanly:
using System.Net;
using Moongate.Network.Server;
await using var server = new MoongateTcpServer(new IPEndPoint(IPAddress.Loopback, 0));
await server.StartAsync(CancellationToken.None);
if (server.Endpoint.Port == 0)
{
throw new InvalidOperationException("The listener did not bind to a port.");
}
await server.StopAsync(CancellationToken.None);
Console.WriteLine("TCP listener started and stopped.");
See the standalone TCP cookbook for a runnable framed client/server exchange, per-connection middleware and cleanup.
Dependencies and scope
This package depends on Serilog and has no dependency on other Moongate packages.
TCP is a byte stream. Configure framing for your application protocol; transport reads do not define game-packet boundaries.
This library does not automatically decode Ultima Online packets or dispatch work into a game loop. Use
Moongate.Network.Packets for UO packet definitions and serialization.
Abstract connection metadata
INetworkConnection exposes transport identity, completion, send/close operations and
remote endpoint metadata. Its optional LocalEndPoint property has a default interface
implementation returning null, so existing custom connection implementations do not need
a new member. MoongateTcpClient supplies its actual local endpoint.
string DescribeLocalEndpoint(Moongate.Network.Interfaces.Client.INetworkConnection connection)
{
return connection.LocalEndPoint?.ToString() ?? "Local endpoint unavailable";
}
TCP event payloads are stable copies; middleware inputs are borrowed until their
ValueTask completes. Connection ownership above the transport (game sessions,
IConnectionService, INetworkService) lives in Moongate.Server.Core, not here.
Configured entry points
From 0.4.0, MoongateTcpServer.CreateConfigured(endpoint, options) and
MoongateTcpClient.ConnectConfiguredAsync(options) prepare a transport stream and
install callbacks before reception starts. ConnectionPipeline.PrepareStreamAsync can
wrap the socket stream, for example to authenticate an SslStream, and
ConfigureClient subscribes to receive events before the first byte is delivered.
The rules:
- The preparation token covers the connection/setup deadline and caller cancellation; preparation callbacks must observe it.
- The returned stream must own its input stream. If preparation throws, dispose any wrapper you created before throwing. After successful setup the transport owns the prepared stream and the socket, and a configuration failure releases both.
TcpServerOptionsbounds admitted connections and concurrent preparations; excess sockets close immediately. A slow TLS handshake does not block accepting another connection. Server stop cancels preparation and drains the admitted setups before a restart.
The plain constructor and ConnectAsync have no preparation step and keep their
original admission behavior.
Limits for a long-lived protocol
The configured options also carry what a server for a text protocol such as IRC needs:
MaxConnectionsPerAddress and IdleTimeout (off by default), MaxQueuedSendBytes with
MoongateTcpClient.TrySend (a per-connection send queue, so a slow peer cannot hold up a
broadcast), and FrameOverflow = Discard with IFrameResynchronizer and OnFrameOverflow
(an overlong line is dropped and the connection stays open, so the application can answer).
The defaults keep the earlier behavior. See the
standalone TCP cookbook.
Graceful shutdown
For graceful application shutdown, StopAcceptingAsync() closes the listener and cancels unfinished stream preparation while
established connections remain usable. IsRunning becomes false during this drain, while Endpoint retains a safe snapshot
of the bound address and port. Drain application work, then call StopAsync() or DisposeAsync(). A new listener generation
requires a complete stop before restart.
License and source
Licensed under AGPL-3.0-or-later. See the source repository and license.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- Serilog (>= 4.4.0)
NuGet packages (2)
Showing the top 2 NuGet packages that depend on Moongate.Network:
| Package | Downloads |
|---|---|
|
Moongate.Server.Core
Plugin-facing server contracts, events, registries, and dependency injection extensions for Moongate. |
|
|
Moongate.Api
Standalone typed MessagePack request/reply channels over mutually authenticated TLS with bounded execution and local peer authorization. |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.19.0 | 0 | 10/16/2026 |
| 0.18.0 | 1 | 10/16/2026 |
| 0.17.0 | 90 | 10/14/2026 |
| 0.16.0 | 113 | 10/9/2026 |
| 0.15.0 | 99 | 10/7/2026 |
| 0.14.0 | 105 | 10/4/2026 |
| 0.13.0 | 108 | 10/3/2026 |
| 0.12.0 | 102 | 10/2/2026 |
| 0.11.0 | 113 | 9/30/2026 |
| 0.10.0 | 112 | 9/30/2026 |
| 0.9.0 | 120 | 9/27/2026 |
| 0.8.0 | 126 | 9/26/2026 |
| 0.7.0 | 107 | 9/24/2026 |
| 0.6.0 | 124 | 9/21/2026 |
| 0.5.0 | 122 | 9/20/2026 |
| 0.4.1 | 117 | 9/20/2026 |
| 0.4.0 | 123 | 9/19/2026 |
| 0.3.0 | 112 | 9/18/2026 |