SetNet.Upnp
1.2.0
dotnet add package SetNet.Upnp --version 1.2.0
NuGet\Install-Package SetNet.Upnp -Version 1.2.0
<PackageReference Include="SetNet.Upnp" Version="1.2.0" />
<PackageVersion Include="SetNet.Upnp" Version="1.2.0" />
<PackageReference Include="SetNet.Upnp" />
paket add SetNet.Upnp --version 1.2.0
#r "nuget: SetNet.Upnp, 1.2.0"
#:package SetNet.Upnp@1.2.0
#addin nuget:?package=SetNet.Upnp&version=1.2.0
#tool nuget:?package=SetNet.Upnp&version=1.2.0
<p align="center"> <img src="https://raw.githubusercontent.com/Povstalez/SetNet/master/assets/icon.png" alt="SetNet" width="96"> </p>
SetNet.Upnp
UPnP IGD port mapping for SetNet: make a player-hosted server reachable without touching the router.
Most home routers support UPnP IGD — a LAN protocol that lets an application ask the router to forward a port. SetNet.Upnp discovers the gateway via SSDP and drives its WAN service: read the external IP, add a TCP/UDP port mapping, remove it on shutdown. No wire types, no server component — it's a pure client-side utility you run on whichever machine listens for connections.
Install
dotnet add package SetNet
dotnet add package SetNet.Upnp
Usage
One call for a SetNet server — map every port the configuration listens on:
var device = await config.MapServerPortsAsync(description: "MyGame host");
if (device == null)
Console.WriteLine("No UPnP gateway — ask the player to forward the port manually.");
else
Console.WriteLine($"Reachable at {await device.GetExternalIpAsync()}:{config.Port}");
// on shutdown:
await device.DeletePortMappingAsync(UpnpProtocol.Tcp, config.Port);
Manual control:
UpnpDevice? gw = await UpnpPortMapper.DiscoverAsync();
if (gw != null)
{
IPAddress external = await gw.GetExternalIpAsync();
await gw.AddPortMappingAsync(UpnpProtocol.Udp, externalPort: 40001, internalPort: 40001,
description: "MyGame voice", leaseSeconds: 3600);
// ... later
await gw.DeletePortMappingAsync(UpnpProtocol.Udp, 40001);
}
API
| Member | Purpose |
|---|---|
UpnpPortMapper.DiscoverAsync(timeoutMs = 3000) |
SSDP-discover the gateway; null when none answers |
UpnpPortMapper.FromLocationAsync(Uri location) |
drive a gateway with a known description URL (fixed setups, tests) |
device.GetExternalIpAsync() |
the router's WAN IP |
device.AddPortMappingAsync(protocol, externalPort, internalPort, description, leaseSeconds = 0) |
forward a port to this machine |
device.DeletePortMappingAsync(protocol, externalPort) |
remove a mapping |
device.LocalAddress / ControlUrl / ServiceType |
discovery results |
config.MapServerPortsAsync(description, leaseSeconds = 0) |
map the TCP/UDP ports a SetNet Configuration listens on |
Notes
- No reserved wire types — this package never touches the SetNet connection; it talks HTTP/SOAP to the router on the LAN.
- UPnP can be off. Many routers ship with UPnP disabled (and some networks disable it deliberately). Always handle the
nullresult — fall back toSetNet.NatPunchorSetNet.Relay. - Leases.
leaseSeconds: 0requests a permanent mapping; a few IGDv2 routers cap or refuse that — pass an explicit lease and refresh it if you target those. Delete mappings on shutdown either way. - Supported services:
WANIPConnection:1/:2andWANPPPConnection:1. - Security note: UPnP mappings expose the mapped port to the whole internet — gate the exposed server with
SetNet.Auth/SetNet.RateLimitlike any public endpoint.
Documentation & source
- 🐙 https://github.com/Povstalez/SetNet — full module catalog in docs/MODULES.md
License
MIT
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. 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. |
| .NET Core | netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.1 is compatible. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.1
- SetNet (>= 1.2.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.2.0 | 140 | 8/5/2026 |