IpMatcher 1.1.0
dotnet add package IpMatcher --version 1.1.0
NuGet\Install-Package IpMatcher -Version 1.1.0
<PackageReference Include="IpMatcher" Version="1.1.0" />
<PackageVersion Include="IpMatcher" Version="1.1.0" />
<PackageReference Include="IpMatcher" />
paket add IpMatcher --version 1.1.0
#r "nuget: IpMatcher, 1.1.0"
#:package IpMatcher@1.1.0
#addin nuget:?package=IpMatcher&version=1.1.0
#tool nuget:?package=IpMatcher&version=1.1.0
IpMatcher
C# library for maintaining a match list of IP addresses and networks and comparing inputs to see if a match exists.
IpMatcher targets .NET Standard 2.0 and 2.1, .NET Framework 4.6.2 and 4.8, and .NET 8 and 10.
Help and Contribution
Please file an issue for any bugs you encounter or requested features. Want to contribute? Please create a branch, commit, and submit a pull request!
Usage
using IpMatcher;
using (Matcher matcher = new Matcher())
{
matcher.Add("192.168.1.0", "255.255.255.0");
matcher.Add("192.168.2.0", "255.255.255.0");
matcher.Remove("192.168.2.0");
matcher.Exists("192.168.1.0", "255.255.255.0"); // true
matcher.MatchExists("192.168.1.34"); // true
matcher.MatchExists("10.10.10.10"); // false
}
Matcher implements IDisposable. Dispose it when you are done with it to release the match cache and the cache's background expiration task.
Implementation
The matcher uses two primary internal objects. The first is a bounded least-recently-used cache (from the Caching package) of IP addresses that previously matched a network entry. Subnet matches found by MatchExists are added to this cache, and MatchExists checks it first. Behind the cache, a list of Address objects are stored.
The cache holds at most CacheCapacity addresses (default 4096), so memory stays bounded no matter how many distinct addresses are matched. When it fills, the least recently used addresses are evicted; an evicted address still matches through the address list.
Matcher matcher = new Matcher(cacheCapacity: 10000); // or set matcher.CacheCapacity later
matcher.CacheCapacity = 0; // disable the cache entirely
int cached = matcher.CacheCount; // addresses currently cached
- The cache is created on the first subnet match, so a matcher that is empty or holds only /32 entries never starts the cache's background expiration task.
Removeclears the cache, so an address matched through a removed network stops matching right away.Existsonly checks added entries, not the cache.- Changing
CacheCapacitydiscards the cached entries.
Telemetry
IpMatcher does not emit telemetry itself. The match cache is named ipmatcher (Matcher.CacheName), so if your host subscribes to the Caching library's Caching meter and activity source, cache size, hit/miss, and eviction metrics are reported with cache.name="ipmatcher".
Helpful Link
A lot of the internal matching code was adapted from: https://social.msdn.microsoft.com/Forums/en-US/c0ecc0de-b45e-4ca4-8d57-fc9babd4c221/evaluate-if-ip-address-is-part-of-a-subnet?forum=netfxnetcom
Version History
Refer to CHANGELOG.md
| 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 is compatible. 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 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. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 is compatible. |
| .NET Framework | net461 was computed. net462 is compatible. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 is compatible. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
NuGet packages (3)
Showing the top 3 NuGet packages that depend on IpMatcher:
| Package | Downloads |
|---|---|
|
Watson
Simple, fast, async C# web server for handling REST requests with unified 7.x protocol architecture targeting .NET Standard 2.1, .NET 8, and .NET 10. |
|
|
Watson.Core
Core library for Watson 7.x shared semantics, routing, lifecycle, and protocol configuration targeting .NET 8 and .NET 10. |
|
|
HttpServerLite
User-space HTTP and HTTPS server without http.sys written in C#. Please visit the project site README for details on implementation. |
GitHub repositories (1)
Showing the top 1 popular GitHub repositories that depend on IpMatcher:
| Repository | Stars |
|---|---|
|
dotnet/WatsonWebserver
Watson is the fastest, easiest way to build scalable RESTful web servers and services in C#.
|
Bound the match cache with a least-recently-used cache from the Caching package (CacheCapacity, default 4096; 0 disables). Remove now clears the cache so hosts matched through a removed network stop matching. Exists no longer reports cached matches as entries. Matcher implements IDisposable.