summaryrefslogtreecommitdiff
path: root/cpp/src/Ice/UdpTransceiver.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src/Ice/UdpTransceiver.cpp')
-rw-r--r--cpp/src/Ice/UdpTransceiver.cpp29
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)