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..406c37aa93 100644 --- a/src/IECoreImage/DisplayDriverServer.cpp +++ b/src/IECoreImage/DisplayDriverServer.cpp @@ -189,8 +189,22 @@ 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; + tcp protocol = tcp::v6(); + m_acceptor.open( protocol, 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(); + protocol = tcp::v4(); + m_acceptor.open( protocol ); + } + #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 +212,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( protocol, portNumber ); m_acceptor.bind( m_endpoint ); m_acceptor.listen(); }