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