TechnitiumSoftware/DnsServer · error · ArgumentException

The address must be an IPv4 address: {startingAddress}

Error message

The address must be an IPv4 address: {startingAddress}

What it means

ChangeNetwork requires the starting address to be IPv4. The first guard in ChangeNetwork rejects startingAddress whose AddressFamily != InterNetwork with ArgumentException(nameof(startingAddress)).

Source

Thrown at DnsServerCore/Dhcp/Scope.cs:1435

                        _dhcpServer.RemoveDnsEntries(this, expiredLease);
                    }
                }
            }

            if (expiredLeases > 0)
                _lastModified = utcNow;

            return expiredLeases;
        }

        #endregion

        #region public

        public void ChangeNetwork(IPAddress startingAddress, IPAddress endingAddress, IPAddress subnetMask)
        {
            if (startingAddress.AddressFamily != AddressFamily.InterNetwork)
                throw new ArgumentException("The address must be an IPv4 address: " + startingAddress.ToString(), nameof(startingAddress));

            if (endingAddress.AddressFamily != AddressFamily.InterNetwork)
                throw new ArgumentException("The address must be an IPv4 address: " + endingAddress.ToString(), nameof(endingAddress));

            if (subnetMask.AddressFamily != AddressFamily.InterNetwork)
                throw new ArgumentException("The address must be an IPv4 address: " + subnetMask.ToString(), nameof(subnetMask));

            uint startingAddressNumber = startingAddress.ConvertIpToNumber();
            uint endingAddressNumber = endingAddress.ConvertIpToNumber();

            if (startingAddressNumber >= endingAddressNumber)
                throw new ArgumentException("Ending address must be greater than starting address.");

            _startingAddress = startingAddress;
            _endingAddress = endingAddress;
            _subnetMask = subnetMask;

            //compute other parameters

View on GitHub (pinned to d0484b6c1e)

Solutions

  1. Pass an IPv4 (InterNetwork) starting address.
  2. Parse and assert AddressFamily before calling ChangeNetwork.
  3. Use IPv6 DHCP tooling for IPv6 ranges.

Example fix

// before
scope.ChangeNetwork(IPAddress.Parse('fd00::1'), IPAddress.Parse('fd00::ff'), IPAddress.Parse('ffff::'));
// after
scope.ChangeNetwork(IPAddress.Parse('192.168.1.100'), IPAddress.Parse('192.168.1.200'), IPAddress.Parse('255.255.255.0'));
Defensive patterns

Strategy: validation

Validate before calling

if (startingAddress.AddressFamily != AddressFamily.InterNetwork)
    throw new ArgumentException("startingAddress must be IPv4", nameof(startingAddress));

Type guard

static bool IsIPv4(IPAddress a) => a.AddressFamily == AddressFamily.InterNetwork;

Try / catch

try { scope.ChangeNetwork(start, end, mask); }
catch (ArgumentException ex) when (ex.ParamName == "startingAddress")
{ /* supply an IPv4 start address, retry */ }

Prevention

When it happens

Trigger: Calling scope.ChangeNetwork(...) (or constructing a scope) with a startingAddress that is IPv6/other.

Common situations: Passing an IPv6 start address. UI/config providing a hostname that resolved to IPv6. Copying IPv6 ranges into an IPv4-only DHCP scope.

Related errors


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