{"record":{"id":"21a55c07e2c0c9c1","repo":"TechnitiumSoftware/DnsServer","slug":"the-address-must-be-an-ipv4-address-startingaddr","errorCode":null,"errorMessage":"The address must be an IPv4 address: {startingAddress}","messagePattern":"The address must be an IPv4 address: (.+?)","errorType":"validation","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"DnsServerCore/Dhcp/Scope.cs","lineNumber":1435,"sourceCode":"                        _dhcpServer.RemoveDnsEntries(this, expiredLease);\n                    }\n                }\n            }\n\n            if (expiredLeases > 0)\n                _lastModified = utcNow;\n\n            return expiredLeases;\n        }\n\n        #endregion\n\n        #region public\n\n        public void ChangeNetwork(IPAddress startingAddress, IPAddress endingAddress, IPAddress subnetMask)\n        {\n            if (startingAddress.AddressFamily != AddressFamily.InterNetwork)\n                throw new ArgumentException(\"The address must be an IPv4 address: \" + startingAddress.ToString(), nameof(startingAddress));\n\n            if (endingAddress.AddressFamily != AddressFamily.InterNetwork)\n                throw new ArgumentException(\"The address must be an IPv4 address: \" + endingAddress.ToString(), nameof(endingAddress));\n\n            if (subnetMask.AddressFamily != AddressFamily.InterNetwork)\n                throw new ArgumentException(\"The address must be an IPv4 address: \" + subnetMask.ToString(), nameof(subnetMask));\n\n            uint startingAddressNumber = startingAddress.ConvertIpToNumber();\n            uint endingAddressNumber = endingAddress.ConvertIpToNumber();\n\n            if (startingAddressNumber >= endingAddressNumber)\n                throw new ArgumentException(\"Ending address must be greater than starting address.\");\n\n            _startingAddress = startingAddress;\n            _endingAddress = endingAddress;\n            _subnetMask = subnetMask;\n\n            //compute other parameters","sourceCodeStart":1417,"sourceCodeEnd":1453,"githubUrl":"https://github.com/TechnitiumSoftware/DnsServer/blob/d0484b6c1e7439cdc53d67d81e9c876cda2ad756/DnsServerCore/Dhcp/Scope.cs#L1417-L1453","documentation":"ChangeNetwork requires the starting address to be IPv4. The first guard in ChangeNetwork rejects startingAddress whose AddressFamily != InterNetwork with ArgumentException(nameof(startingAddress)).","triggerScenarios":"Calling scope.ChangeNetwork(...) (or constructing a scope) with a startingAddress that is IPv6/other.","commonSituations":"Passing an IPv6 start address. UI/config providing a hostname that resolved to IPv6. Copying IPv6 ranges into an IPv4-only DHCP scope.","solutions":["Pass an IPv4 (InterNetwork) starting address.","Parse and assert AddressFamily before calling ChangeNetwork.","Use IPv6 DHCP tooling for IPv6 ranges."],"exampleFix":"// before\nscope.ChangeNetwork(IPAddress.Parse('fd00::1'), IPAddress.Parse('fd00::ff'), IPAddress.Parse('ffff::'));\n// after\nscope.ChangeNetwork(IPAddress.Parse('192.168.1.100'), IPAddress.Parse('192.168.1.200'), IPAddress.Parse('255.255.255.0'));","handlingStrategy":"validation","validationCode":"if (startingAddress.AddressFamily != AddressFamily.InterNetwork)\n    throw new ArgumentException(\"startingAddress must be IPv4\", nameof(startingAddress));","typeGuard":"static bool IsIPv4(IPAddress a) => a.AddressFamily == AddressFamily.InterNetwork;","tryCatchPattern":"try { scope.ChangeNetwork(start, end, mask); }\ncatch (ArgumentException ex) when (ex.ParamName == \"startingAddress\")\n{ /* supply an IPv4 start address, retry */ }","preventionTips":["Build ranges from IPv4 CIDR notation.","Assert AddressFamily on all three ChangeNetwork args.","Keep IPv6 out of IPv4 scopes."],"tags":["dhcp","scope","ipv4","validation"],"backgroundTag":null,"analyzedSha":"d0484b6c1e7439cdc53d67d81e9c876cda2ad756","analyzedAt":"2026-08-13T22:57:35.508Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}