{"record":{"id":"4cd21d8ded248e8f","repo":"TechnitiumSoftware/DnsServer","slug":"the-address-must-be-an-ipv4-address-value","errorCode":null,"errorMessage":"The address must be an IPv4 address: {value}","messagePattern":"The address must be an IPv4 address: (.+?)","errorType":"validation","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"DnsServerCore/Dhcp/Scope.cs","lineNumber":464,"sourceCode":"            return (startingAddressNumber <= addressNumber) && (addressNumber <= endingAddressNumber);\n        }\n\n        private static void ValidateIpv4(IReadOnlyCollection<IPAddress> value, string paramName)\n        {\n            if (value is not null)\n            {\n                foreach (IPAddress ip in value)\n                {\n                    if (ip.AddressFamily != AddressFamily.InterNetwork)\n                        throw new ArgumentException(\"The address must be an IPv4 address: \" + ip.ToString(), paramName);\n                }\n            }\n        }\n\n        private static void ValidateIpv4(IPAddress value, string paramName)\n        {\n            if ((value is not null) && (value.AddressFamily != AddressFamily.InterNetwork))\n                throw new ArgumentException(\"The address must be an IPv4 address: \" + value.ToString(), paramName);\n        }\n\n        #endregion\n\n        #region private\n\n        private async Task<AddressStatus> IsAddressAvailableAsync(IPAddress address)\n        {\n            if (address.Equals(_routerAddress))\n                return AddressStatus.FALSE;\n\n            if ((_dnsServers != null) && _dnsServers.Contains(address))\n                return AddressStatus.FALSE;\n\n            if ((_winsServers != null) && _winsServers.Contains(address))\n                return AddressStatus.FALSE;\n\n            if ((_ntpServers != null) && _ntpServers.Contains(address))","sourceCodeStart":446,"sourceCodeEnd":482,"githubUrl":"https://github.com/TechnitiumSoftware/DnsServer/blob/d0484b6c1e7439cdc53d67d81e9c876cda2ad756/DnsServerCore/Dhcp/Scope.cs#L446-L482","documentation":"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.","triggerScenarios":"Setting an IPv4-only single-value scope property with an IPAddress whose AddressFamily != InterNetwork (e.g. an IPv6 address).","commonSituations":"Assigning an IPv6 gateway/router/exclusion address to an IPv4 scope. UI defaulting to '::1'. Parsing a config value that resolved to IPv6.","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."],"exampleFix":"// before\nscope.RouterAddress = IPAddress.Parse('fe80::1');\n// after\nvar ip = IPAddress.Parse('192.168.1.1');\nif (ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) scope.RouterAddress = ip;","handlingStrategy":"validation","validationCode":"if (value != null && value.AddressFamily != AddressFamily.InterNetwork)\n    throw new ArgumentException(\"Address must be IPv4\", nameof(value));","typeGuard":"static bool IsIPv4(IPAddress a) => a == null || a.AddressFamily == AddressFamily.InterNetwork;","tryCatchPattern":"try { scope.RouterAddress = ip; }\ncatch (ArgumentException ex) when (ex.Message.Contains(\"IPv4\"))\n{ /* resolve/parse an IPv4, retry */ }","preventionTips":["Parse and assert AddressFamily before single-address assignment.","Default UI fields to IPv4 examples.","Separate IPv4/IPv6 DHCP scopes."],"tags":["dhcp","ipv4","validation","networking"],"backgroundTag":null,"analyzedSha":"d0484b6c1e7439cdc53d67d81e9c876cda2ad756","analyzedAt":"2026-08-13T22:57:35.508Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}