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 parametersView on GitHub (pinned to d0484b6c1e)
Solutions
- Pass an IPv4 (InterNetwork) starting address.
- Parse and assert AddressFamily before calling ChangeNetwork.
- 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
- Build ranges from IPv4 CIDR notation.
- Assert AddressFamily on all three ChangeNetwork args.
- Keep IPv6 out of IPv4 scopes.
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
- The address must be an IPv4 address: {endingAddress}
- The address must be an IPv4 address: {subnetMask}
- Ending address must be greater than starting address.
- Starting address cannot be same as the network address.
- Ending address cannot be same as the broadcast address.
AI-assisted analysis of TechnitiumSoftware/DnsServer@d0484b6c1e (2026-08-13).
Data as JSON: /api/errors/21a55c07e2c0c9c1.
Report an issue: GitHub.