diff options
author | Matthew Newhook <matthew@zeroc.com> | 2008-05-22 15:23:27 +0800 |
---|---|---|
committer | Matthew Newhook <matthew@zeroc.com> | 2008-05-22 15:23:27 +0800 |
commit | a8ef39d3a0d35aa0391297dc779ede1cf8e9c387 (patch) | |
tree | e98b3fe2f25f39b02249958f8465c9a8dc3bc338 /cpp/src | |
parent | cleaning up Make.rules for python (diff) | |
download | ice-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/src')
-rw-r--r-- | cpp/src/Ice/Network.cpp | 14 | ||||
-rw-r--r-- | cpp/src/Ice/Network.h | 2 | ||||
-rw-r--r-- | cpp/src/Ice/TcpAcceptor.cpp | 2 | ||||
-rw-r--r-- | cpp/src/Ice/UdpTransceiver.cpp | 29 | ||||
-rw-r--r-- | cpp/src/Ice/UdpTransceiver.h | 4 | ||||
-rw-r--r-- | cpp/src/IceSSL/AcceptorI.cpp | 2 | ||||
-rw-r--r-- | cpp/src/IceSSL/AcceptorI.h | 2 |
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; }; |