diff --git a/QuickFIXn/ThreadedSocketAcceptor.cs b/QuickFIXn/ThreadedSocketAcceptor.cs index fc9d9fd83..912ef065b 100755 --- a/QuickFIXn/ThreadedSocketAcceptor.cs +++ b/QuickFIXn/ThreadedSocketAcceptor.cs @@ -89,11 +89,19 @@ private AcceptorSocketDescriptor GetAcceptorSocketDescriptor(Dictionary dict) IPEndPoint socketEndPoint; if (dict.Has(SessionSettings.SOCKET_ACCEPT_HOST)) { - string host = dict.GetString(SessionSettings.SOCKET_ACCEPT_HOST); - IPAddress[] addrs = Dns.GetHostAddresses(host); - socketEndPoint = new IPEndPoint(addrs[0], port); - // Set hostname (if it is not already configured) - socketSettings.ServerCommonName = socketSettings.ServerCommonName ?? host; + string host = dict.GetString(SessionSettings.SOCKET_ACCEPT_HOST); + + if (IsAnyIpAddress(host)) + { + socketEndPoint = new IPEndPoint(IPAddress.Any, port); + } + else + { + IPAddress[] addrs = Dns.GetHostAddresses(host); + socketEndPoint = new IPEndPoint(addrs[0], port); + // Set hostname (if it is not already configured) + socketSettings.ServerCommonName ??= host; + } } else { @@ -102,7 +110,6 @@ private AcceptorSocketDescriptor GetAcceptorSocketDescriptor(Dictionary dict) socketSettings.Configure(dict); - if (!_socketDescriptorForAddress.TryGetValue(socketEndPoint, out var descriptor)) { descriptor = new AcceptorSocketDescriptor(socketEndPoint, socketSettings, dict); @@ -112,6 +119,18 @@ private AcceptorSocketDescriptor GetAcceptorSocketDescriptor(Dictionary dict) return descriptor; } + /// + /// Checks if the host address is the "any" address in either IPv4 (0.0.0.0) or IPv6 (::) + /// + /// + /// + private static bool IsAnyIpAddress(string host) + { + return IPAddress.TryParse(host, out IPAddress? address) && + (address.Equals(IPAddress.Any) || + address.Equals(IPAddress.IPv6Any)); + } + /// /// Create session, either at start-up or as an ad-hoc operation /// diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index 07f24693e..2ae7cc0c1 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -43,8 +43,9 @@ What's New * #815 - update broken/neglected example apps & docs (gbirchmeier) * #764 - fix positive UTC offset parsing in DateTimeConverter (Rob-Hague) * #766 - use ordinal string operations (Rob-Hague) -* #767 - Avoid string conversions in FieldMap.Get{FieldType} where possible (Rob-Hague) +* #767 - avoid string conversions in FieldMap.Get{FieldType} where possible (Rob-Hague) * #785 - use correct SocketError "Shutdown" code when socket is deliberately shutdown (oclancy) +* #711 - fix explicit 0.0.0.0 address binding (bohdanstefaniuk) ### v1.11.2: * same as v1.11.1, but I fixed the readme in the pushed nuget packages