From cfbbf68d39ad591361e15078566e0a1f01621159 Mon Sep 17 00:00:00 2001 From: John Haddon Date: Fri, 26 Sep 2025 11:06:26 +0100 Subject: [PATCH 1/2] DisplayDriverServer : Support IPv4-only environments In c357ea106daea2ee5aad6bb4f871ddb87e80991e, we switched from making an IPv4 connection, to an IPv6 one. This fixed some nasty lag on Windows, but it turns out that it also broke IPv4-only environments completely. So now we fall back to opening a v4 connection if the v6 connection fails. --- Changes | 5 +++++ src/IECoreImage/DisplayDriverServer.cpp | 18 +++++++++++++++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/Changes b/Changes index 454a58f35d..9e39cfbc58 100644 --- a/Changes +++ b/Changes @@ -1,6 +1,11 @@ 10.6.x.x (relative to 10.6.0.1) ======== +Fixes +----- + +- DisplayDriverServer : Fixed to support IPv4-only environments. + API --- diff --git a/src/IECoreImage/DisplayDriverServer.cpp b/src/IECoreImage/DisplayDriverServer.cpp index 3afd6b7fa1..5c12bcb63c 100644 --- a/src/IECoreImage/DisplayDriverServer.cpp +++ b/src/IECoreImage/DisplayDriverServer.cpp @@ -189,8 +189,20 @@ class DisplayDriverServer::PrivateData : public RefCounted void openPort( DisplayDriverServer::Port portNumber ) { - m_endpoint = boost::asio::ip::tcp::endpoint( tcp::v6(), portNumber ); - m_acceptor.open( m_endpoint.protocol() ); + boost::system::error_code errorCode; + m_acceptor.open( tcp::v6(), errorCode ); + if( !errorCode ) + { + // Got IPv6. Allow v4 too. + m_acceptor.set_option( boost::asio::ip::v6_only( false ) ); + } + else + { + // Fall back to IPv4 only. + m_acceptor.close(); + m_acceptor.open( tcp::v4() ); + } + #ifdef _MSC_VER m_acceptor.set_option( boost::asio::ip::tcp::acceptor::reuse_address( false ) ); typedef boost::asio::detail::socket_option::boolean exclusive_address; @@ -198,7 +210,7 @@ class DisplayDriverServer::PrivateData : public RefCounted #else m_acceptor.set_option( boost::asio::ip::tcp::acceptor::reuse_address( true ) ); #endif - m_acceptor.set_option( boost::asio::ip::v6_only( false ) ); + m_endpoint = boost::asio::ip::tcp::endpoint( m_acceptor.local_endpoint().protocol(), portNumber ); m_acceptor.bind( m_endpoint ); m_acceptor.listen(); } From 0e53aaafbc0383df89022c0f5e38c79adab3a5ce Mon Sep 17 00:00:00 2001 From: John Haddon Date: Fri, 26 Sep 2025 13:45:14 +0100 Subject: [PATCH 2/2] fixup! DisplayDriverServer : Support IPv4-only environments The previous commit was failing on Windows. Maybe we can't call `local_endpoint()` before `bind()`? --- src/IECoreImage/DisplayDriverServer.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/IECoreImage/DisplayDriverServer.cpp b/src/IECoreImage/DisplayDriverServer.cpp index 5c12bcb63c..406c37aa93 100644 --- a/src/IECoreImage/DisplayDriverServer.cpp +++ b/src/IECoreImage/DisplayDriverServer.cpp @@ -190,7 +190,8 @@ class DisplayDriverServer::PrivateData : public RefCounted void openPort( DisplayDriverServer::Port portNumber ) { boost::system::error_code errorCode; - m_acceptor.open( tcp::v6(), errorCode ); + tcp protocol = tcp::v6(); + m_acceptor.open( protocol, errorCode ); if( !errorCode ) { // Got IPv6. Allow v4 too. @@ -200,7 +201,8 @@ class DisplayDriverServer::PrivateData : public RefCounted { // Fall back to IPv4 only. m_acceptor.close(); - m_acceptor.open( tcp::v4() ); + protocol = tcp::v4(); + m_acceptor.open( protocol ); } #ifdef _MSC_VER @@ -210,7 +212,7 @@ class DisplayDriverServer::PrivateData : public RefCounted #else m_acceptor.set_option( boost::asio::ip::tcp::acceptor::reuse_address( true ) ); #endif - m_endpoint = boost::asio::ip::tcp::endpoint( m_acceptor.local_endpoint().protocol(), portNumber ); + m_endpoint = boost::asio::ip::tcp::endpoint( protocol, portNumber ); m_acceptor.bind( m_endpoint ); m_acceptor.listen(); }