summaryrefslogtreecommitdiff
path: root/cpp
diff options
context:
space:
mode:
authorMatthew Newhook <matthew@zeroc.com>2008-05-22 15:23:27 +0800
committerMatthew Newhook <matthew@zeroc.com>2008-05-22 15:23:27 +0800
commita8ef39d3a0d35aa0391297dc779ede1cf8e9c387 (patch)
treee98b3fe2f25f39b02249958f8465c9a8dc3bc338 /cpp
parentcleaning up Make.rules for python (diff)
downloadice-a8ef39d3a0d35aa0391297dc779ede1cf8e9c387.tar.bz2
ice-a8ef39d3a0d35aa0391297dc779ede1cf8e9c387.tar.xz
ice-a8ef39d3a0d35aa0391297dc779ede1cf8e9c387.zip
http://bugzilla/bugzilla/show_bug.cgi?id=3222 - import mcast tracing. The effective port may be incorrect under windows.
Diffstat (limited to 'cpp')
-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
7 files changed, 30 insertions, 25 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;
};