diff options
Diffstat (limited to 'cpp/src/Ice/UdpTransceiver.cpp')
-rw-r--r-- | cpp/src/Ice/UdpTransceiver.cpp | 29 |
1 files changed, 16 insertions, 13 deletions
diff --git a/cpp/src/Ice/UdpTransceiver.cpp b/cpp/src/Ice/UdpTransceiver.cpp index 830a14b575c..7a98f271d17 100644 --- a/cpp/src/Ice/UdpTransceiver.cpp +++ b/cpp/src/Ice/UdpTransceiver.cpp @@ -230,11 +230,9 @@ IceInternal::UdpTransceiver::type() const string IceInternal::UdpTransceiver::toString() const { - if(_mcastServer && _fd != INVALID_SOCKET) + if(_mcastAddr.ss_family != AF_UNSPEC && _fd != INVALID_SOCKET) { - struct sockaddr_storage remoteAddr; - bool peerConnected = fdToRemoteAddress(_fd, remoteAddr); - return addressesToString(_addr, remoteAddr, peerConnected); + return fdToString(_fd) + "\nmulticast address = " + addrToString(_mcastAddr); } else { @@ -296,12 +294,14 @@ IceInternal::UdpTransceiver::UdpTransceiver(const InstancePtr& instance, const s _stats(instance->initializationData().stats), _incoming(false), _addr(addr), - _mcastServer(false), _connect(true), _warn(instance->initializationData().properties->getPropertyAsInt("Ice.Warn.Datagrams") > 0) { try { + // AF_UNSPEC means not multicast. + _mcastAddr.ss_family = AF_UNSPEC; + _fd = createSocket(true, _addr.ss_family); setBufSize(instance); setBlock(_fd, false); @@ -342,7 +342,6 @@ IceInternal::UdpTransceiver::UdpTransceiver(const InstancePtr& instance, const s _stats(instance->initializationData().stats), _incoming(true), _addr(getAddressForServer(host, port, instance->protocolSupport())), - _mcastServer(isMulticast(_addr)), _connect(connect), _warn(instance->initializationData().properties->getPropertyAsInt("Ice.Warn.Datagrams") > 0) { @@ -360,19 +359,20 @@ IceInternal::UdpTransceiver::UdpTransceiver(const InstancePtr& instance, const s if(isMulticast(_addr)) { setReuseAddress(_fd, true); + _mcastAddr = _addr; #ifdef _WIN32 // // Windows does not allow binding to the mcast address itself // so we bind to INADDR_ANY (0.0.0.0) instead. // - struct sockaddr_storage addr; - addr = getAddressForServer("", getPort(_addr), _addr.ss_family == AF_INET ? EnableIPv4 : EnableIPv6); - doBind(_fd, addr); -#else - doBind(_fd, const_cast<struct sockaddr_storage&>(_addr)); + const_cast<struct sockaddr_storage&>(_addr) = + getAddressForServer("", getPort(_mcastAddr), + _mcastAddr.ss_family == AF_INET ? EnableIPv4 : EnableIPv6); #endif - setMcastGroup(_fd, _addr, mcastInterface); + + const_cast<struct sockaddr_storage&>(_addr) = doBind(_fd, _addr); + setMcastGroup(_fd, _mcastAddr, mcastInterface); } else { @@ -391,7 +391,10 @@ IceInternal::UdpTransceiver::UdpTransceiver(const InstancePtr& instance, const s // setReuseAddress(_fd, true); #endif - doBind(_fd, const_cast<struct sockaddr_storage&>(_addr)); + const_cast<struct sockaddr_storage&>(_addr) = doBind(_fd, _addr); + + // AF_UNSPEC means not multicast. + _mcastAddr.ss_family = AF_UNSPEC; } if(_traceLevels->network >= 1) |