summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cpp/src/Ice/Network.cpp14
-rw-r--r--cpp/src/Ice/Network.h2
-rw-r--r--cpp/src/Ice/TcpAcceptor.cpp2
-rw-r--r--cpp/src/Ice/UdpTransceiver.cpp29
-rw-r--r--cpp/src/Ice/UdpTransceiver.h4
-rw-r--r--cpp/src/IceSSL/AcceptorI.cpp2
-rw-r--r--cpp/src/IceSSL/AcceptorI.h2
-rw-r--r--cs/src/Ice/UdpTransceiver.cs18
-rw-r--r--java/src/IceInternal/UdpTransceiver.java13
9 files changed, 45 insertions, 41 deletions
diff --git a/cpp/src/Ice/Network.cpp b/cpp/src/Ice/Network.cpp
index 04ed8aeb3c7..e5811b70a47 100644
--- a/cpp/src/Ice/Network.cpp
+++ b/cpp/src/Ice/Network.cpp
@@ -1057,8 +1057,8 @@ IceInternal::setReuseAddress(SOCKET fd, bool reuse)
}
}
-void
-IceInternal::doBind(SOCKET fd, struct sockaddr_storage& addr)
+struct sockaddr_storage
+IceInternal::doBind(SOCKET fd, const struct sockaddr_storage& addr)
{
int size;
if(addr.ss_family == AF_INET)
@@ -1083,13 +1083,15 @@ IceInternal::doBind(SOCKET fd, struct sockaddr_storage& addr)
throw ex;
}
- socklen_t len = static_cast<socklen_t>(sizeof(addr));
+ struct sockaddr_storage local;
+ socklen_t len = static_cast<socklen_t>(sizeof(local));
#ifdef NDEBUG
- getsockname(fd, reinterpret_cast<struct sockaddr*>(&addr), &len);
+ getsockname(fd, reinterpret_cast<struct sockaddr*>(&local), &len);
#else
- int ret = getsockname(fd, reinterpret_cast<struct sockaddr*>(&addr), &len);
+ int ret = getsockname(fd, reinterpret_cast<struct sockaddr*>(&local), &len);
assert(ret != SOCKET_ERROR);
#endif
+ return local;
}
void
@@ -1511,7 +1513,7 @@ IceInternal::createPipe(SOCKET fds[2])
addrin->sin_port = htons(0);
addrin->sin_addr.s_addr = htonl(INADDR_LOOPBACK);
- doBind(fd, addr);
+ addr = doBind(fd, addr);
doListen(fd, 1);
try
diff --git a/cpp/src/Ice/Network.h b/cpp/src/Ice/Network.h
index 90e8e5e2455..a3cfdfbda6f 100644
--- a/cpp/src/Ice/Network.h
+++ b/cpp/src/Ice/Network.h
@@ -97,7 +97,7 @@ ICE_API void setMcastInterface(SOCKET, const std::string&, bool);
ICE_API void setMcastTtl(SOCKET, int, bool);
ICE_API void setReuseAddress(SOCKET, bool);
-ICE_API void doBind(SOCKET, struct sockaddr_storage&);
+ICE_API struct sockaddr_storage doBind(SOCKET, const struct sockaddr_storage&);
ICE_API void doListen(SOCKET, int);
ICE_API bool doConnect(SOCKET, const struct sockaddr_storage&);
ICE_API void doFinishConnect(SOCKET);
diff --git a/cpp/src/Ice/TcpAcceptor.cpp b/cpp/src/Ice/TcpAcceptor.cpp
index 18d99100182..362de88b789 100644
--- a/cpp/src/Ice/TcpAcceptor.cpp
+++ b/cpp/src/Ice/TcpAcceptor.cpp
@@ -125,7 +125,7 @@ IceInternal::TcpAcceptor::TcpAcceptor(const InstancePtr& instance, const string&
Trace out(_logger, _traceLevels->networkCat);
out << "attempting to bind to tcp socket " << toString();
}
- doBind(_fd, const_cast<struct sockaddr_storage&>(_addr));
+ const_cast<struct sockaddr_storage&>(_addr) = doBind(_fd, _addr);
}
catch(...)
{
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)
diff --git a/cpp/src/Ice/UdpTransceiver.h b/cpp/src/Ice/UdpTransceiver.h
index 05089f8002f..353397f518c 100644
--- a/cpp/src/Ice/UdpTransceiver.h
+++ b/cpp/src/Ice/UdpTransceiver.h
@@ -62,8 +62,8 @@ private:
const Ice::LoggerPtr _logger;
const Ice::StatsPtr _stats;
const bool _incoming;
- const sockaddr_storage _addr;
- const bool _mcastServer;
+ const struct sockaddr_storage _addr;
+ struct sockaddr_storage _mcastAddr;
SOCKET _fd;
#ifdef _WIN32
diff --git a/cpp/src/IceSSL/AcceptorI.cpp b/cpp/src/IceSSL/AcceptorI.cpp
index 5002135cc1e..a6e0a1385d6 100644
--- a/cpp/src/IceSSL/AcceptorI.cpp
+++ b/cpp/src/IceSSL/AcceptorI.cpp
@@ -168,7 +168,7 @@ IceSSL::AcceptorI::AcceptorI(const InstancePtr& instance, const string& adapterN
Trace out(_logger, _instance->networkTraceCategory());
out << "attempting to bind to ssl socket " << toString();
}
- IceInternal::doBind(_fd, _addr);
+ const_cast<struct sockaddr_storage&>(_addr) = IceInternal::doBind(_fd, _addr);
}
catch(...)
{
diff --git a/cpp/src/IceSSL/AcceptorI.h b/cpp/src/IceSSL/AcceptorI.h
index 76c218139de..9bf03b3c01a 100644
--- a/cpp/src/IceSSL/AcceptorI.h
+++ b/cpp/src/IceSSL/AcceptorI.h
@@ -46,7 +46,7 @@ private:
const InstancePtr _instance;
const std::string _adapterName;
const Ice::LoggerPtr _logger;
- struct sockaddr_storage _addr;
+ const struct sockaddr_storage _addr;
SOCKET _fd;
int _backlog;
};
diff --git a/cs/src/Ice/UdpTransceiver.cs b/cs/src/Ice/UdpTransceiver.cs
index e54cd5c4e17..5c69e27431b 100644
--- a/cs/src/Ice/UdpTransceiver.cs
+++ b/cs/src/Ice/UdpTransceiver.cs
@@ -532,9 +532,9 @@ namespace IceInternal
public override string ToString()
{
- if(_mcastServer && _fd != null)
+ if(_mcastAddr != null && _fd != null)
{
- return Network.addressesToString(_addr, Network.getRemoteAddress(_fd));
+ return Network.fdToString(_fd) + "\nmulticast address = " + Network.addrToString(_mcastAddr);
}
else
{
@@ -601,17 +601,17 @@ namespace IceInternal
if(Network.isMulticast(_addr))
{
Network.setReuseAddress(_fd, true);
- if(_addr.AddressFamily == AddressFamily.InterNetwork)
+ _mcastAddr = _addr;
+ if(_mcastAddr.AddressFamily == AddressFamily.InterNetwork)
{
- Network.doBind(_fd, new IPEndPoint(IPAddress.Any, port));
+ _addr = Network.doBind(_fd, new IPEndPoint(IPAddress.Any, port));
}
else
{
- Debug.Assert(_addr.AddressFamily == AddressFamily.InterNetworkV6);
- Network.doBind(_fd, new IPEndPoint(IPAddress.IPv6Any, port));
+ Debug.Assert(_mcastAddr.AddressFamily == AddressFamily.InterNetworkV6);
+ _addr = Network.doBind(_fd, new IPEndPoint(IPAddress.IPv6Any, port));
}
- Network.setMcastGroup(_fd, _addr.Address, mcastInterface);
- _mcastServer = true;
+ Network.setMcastGroup(_fd, _mcastAddr.Address, mcastInterface);
}
else
{
@@ -726,9 +726,9 @@ namespace IceInternal
private int _sndSize;
private Socket _fd;
private IPEndPoint _addr;
+ private IPEndPoint _mcastAddr = null;
private string _mcastInterface = null;
private int _mcastTtl = -1;
- private bool _mcastServer = false;
private IAsyncResult _result;
//
diff --git a/java/src/IceInternal/UdpTransceiver.java b/java/src/IceInternal/UdpTransceiver.java
index 0bcb04fb05f..84aef93ffb8 100644
--- a/java/src/IceInternal/UdpTransceiver.java
+++ b/java/src/IceInternal/UdpTransceiver.java
@@ -226,10 +226,9 @@ final class UdpTransceiver implements Transceiver
public String
toString()
{
- if(mcastServer && _fd != null)
+ if(_mcastAddr != null && _fd != null)
{
- return Network.addressesToString(_addr.getAddress(), _addr.getPort(),
- _fd.socket().getInetAddress(), _fd.socket().getPort());
+ return Network.fdToString(_fd) + "\nmulticast address = " + Network.addrToString(_mcastAddr);
}
else
{
@@ -321,9 +320,9 @@ final class UdpTransceiver implements Transceiver
if(_addr.getAddress().isMulticastAddress())
{
Network.setReuseAddress(_fd, true);
- Network.doBind(_fd, Network.getAddress("0.0.0.0", port, Network.EnableIPv4));
- configureMulticast(_addr, mcastInterface, -1);
- mcastServer = true;
+ _mcastAddr = _addr;
+ _addr = Network.doBind(_fd, Network.getAddress("0.0.0.0", port, Network.EnableIPv4));
+ configureMulticast(_mcastAddr, mcastInterface, -1);
}
else
{
@@ -537,7 +536,7 @@ final class UdpTransceiver implements Transceiver
private int _sndSize;
private java.nio.channels.DatagramChannel _fd;
private java.net.InetSocketAddress _addr;
- private boolean mcastServer = false;
+ private java.net.InetSocketAddress _mcastAddr = null;
//
// The maximum IP datagram size is 65535. Subtract 20 bytes for the IP header and 8 bytes for the UDP header