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

  1. Provide an IPv4 address (AddressFamily.InterNetwork) for the property.
  2. Coerce/parse with IPAddress.Parse and assert family before assignment.
  3. 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

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


AI-assisted analysis of TechnitiumSoftware/DnsServer@d0484b6c1e (2026-08-13). Data as JSON: /api/errors/4cd21d8ded248e8f. Report an issue: GitHub.