TechnitiumSoftware/DnsServer · error · ArgumentException
The address must be an IPv4 address: {value}
Error message
The address must be an IPv4 address: {value} What it means
ValidateIpv4 single-address overload: the given IPAddress is non-null and its AddressFamily is not InterNetwork, so it is rejected as not an IPv4 address.
Source
Thrown at DnsServerCore/Dhcp/Scope.cs:464
return (startingAddressNumber <= addressNumber) && (addressNumber <= endingAddressNumber);
}
private static void ValidateIpv4(IReadOnlyCollection<IPAddress> value, string paramName)
{
if (value is not null)
{
foreach (IPAddress ip in value)
{
if (ip.AddressFamily != AddressFamily.InterNetwork)
throw new ArgumentException("The address must be an IPv4 address: " + ip.ToString(), paramName);
}
}
}
private static void ValidateIpv4(IPAddress value, string paramName)
{
if ((value is not null) && (value.AddressFamily != AddressFamily.InterNetwork))
throw new ArgumentException("The address must be an IPv4 address: " + value.ToString(), paramName);
}
#endregion
#region private
private async Task<AddressStatus> IsAddressAvailableAsync(IPAddress address)
{
if (address.Equals(_routerAddress))
return AddressStatus.FALSE;
if ((_dnsServers != null) && _dnsServers.Contains(address))
return AddressStatus.FALSE;
if ((_winsServers != null) && _winsServers.Contains(address))
return AddressStatus.FALSE;
if ((_ntpServers != null) && _ntpServers.Contains(address))View on GitHub (pinned to d0484b6c1e)
Solutions
- Provide an IPv4 address (AddressFamily.InterNetwork) for the property.
- Coerce/parse with IPAddress.Parse and assert family before assignment.
- Split IPv4 and IPv6 configuration into separate scopes.
Example fix
// before
scope.RouterAddress = IPAddress.Parse('fe80::1');
// after
var ip = IPAddress.Parse('192.168.1.1');
if (ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) scope.RouterAddress = ip; Defensive patterns
Strategy: validation
Validate before calling
if (value != null && value.AddressFamily != AddressFamily.InterNetwork)
throw new ArgumentException("Address must be IPv4", nameof(value)); Type guard
static bool IsIPv4(IPAddress a) => a == null || a.AddressFamily == AddressFamily.InterNetwork;
Try / catch
try { scope.RouterAddress = ip; }
catch (ArgumentException ex) when (ex.Message.Contains("IPv4"))
{ /* resolve/parse an IPv4, retry */ } Prevention
- Parse and assert AddressFamily before single-address assignment.
- Default UI fields to IPv4 examples.
- Separate IPv4/IPv6 DHCP scopes.
When it happens
Trigger: Setting an IPv4-only single-value scope property with an IPAddress whose AddressFamily != InterNetwork (e.g. an IPv6 address).
Common situations: Assigning an IPv6 gateway/router/exclusion address to an IPv4 scope. UI defaulting to '::1'. Parsing a config value that resolved to IPv6.
Related errors
- The address must be an IPv4 address: {ip}
- Address family not supported.
- DHCP Server requires static IP address to work correctly but
- Exclusion ending address must be greater than or equal to st
- DHCP Server requires static IP address to work correctly but
AI-assisted analysis of TechnitiumSoftware/DnsServer@d0484b6c1e (2026-08-13).
Data as JSON: /api/errors/4cd21d8ded248e8f.
Report an issue: GitHub.