diff options
author | Benoit Foucher <benoit@zeroc.com> | 2008-04-07 18:29:38 +0200 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2008-04-07 18:29:38 +0200 |
commit | f6876a31c934d2ed09a3a69adeb62075ac136f99 (patch) | |
tree | ff90bd45a4573ffc6bb9ff8dcc8b3680a1d38230 /cpp/src | |
parent | CHANGES file used to refer to CHANGES.txt. (diff) | |
download | ice-f6876a31c934d2ed09a3a69adeb62075ac136f99.tar.bz2 ice-f6876a31c934d2ed09a3a69adeb62075ac136f99.tar.xz ice-f6876a31c934d2ed09a3a69adeb62075ac136f99.zip |
Fixed bug 2950
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/Ice/Network.cpp | 13 | ||||
-rw-r--r-- | cpp/src/Ice/Network.h | 1 | ||||
-rw-r--r-- | cpp/src/Ice/UdpTransceiver.cpp | 70 |
3 files changed, 42 insertions, 42 deletions
diff --git a/cpp/src/Ice/Network.cpp b/cpp/src/Ice/Network.cpp index a0daca02526..705f32d301d 100644 --- a/cpp/src/Ice/Network.cpp +++ b/cpp/src/Ice/Network.cpp @@ -1717,6 +1717,19 @@ IceInternal::addrToString(const struct sockaddr_storage& addr) return s.str(); } +bool +IceInternal::isMulticast(const struct sockaddr_storage& addr) +{ + if(addr.ss_family == AF_INET) + { + return IN_MULTICAST(ntohl(reinterpret_cast<const struct sockaddr_in*>(&addr)->sin_addr.s_addr)); + } + else + { + return IN6_IS_ADDR_MULTICAST(&reinterpret_cast<const struct sockaddr_in6*>(&addr)->sin6_addr); + } +} + int IceInternal::getPort(const struct sockaddr_storage& addr) { diff --git a/cpp/src/Ice/Network.h b/cpp/src/Ice/Network.h index 077efbec5c8..8016c05b741 100644 --- a/cpp/src/Ice/Network.h +++ b/cpp/src/Ice/Network.h @@ -119,6 +119,7 @@ ICE_API void fdToLocalAddress(SOCKET, struct sockaddr_storage&); ICE_API bool fdToRemoteAddress(SOCKET, struct sockaddr_storage&); ICE_API std::string inetAddrToString(const struct sockaddr_storage&); ICE_API std::string addrToString(const struct sockaddr_storage&); +ICE_API bool isMulticast(const struct sockaddr_storage&); ICE_API int getPort(const struct sockaddr_storage&); ICE_API std::vector<std::string> getHostsForEndpointExpand(const std::string&, ProtocolSupport); diff --git a/cpp/src/Ice/UdpTransceiver.cpp b/cpp/src/Ice/UdpTransceiver.cpp index f6e81a83bfc..4bc5a6d07e3 100644 --- a/cpp/src/Ice/UdpTransceiver.cpp +++ b/cpp/src/Ice/UdpTransceiver.cpp @@ -245,6 +245,27 @@ IceInternal::UdpTransceiver::toString() const SocketStatus IceInternal::UdpTransceiver::initialize() { + if(!_incoming) + { + if(_connect) + { + // + // If we're not connected yet, return NeedConnect. The transceiver will be + // connected once initialize is called again. + // + _connect = false; + return NeedConnect; + } + else + { + if(_traceLevels->network >= 1) + { + Trace out(_logger, _traceLevels->networkCat); + out << "starting to send udp packets\n" << toString(); + } + return Finished; + } + } return Finished; } @@ -283,29 +304,13 @@ IceInternal::UdpTransceiver::UdpTransceiver(const InstancePtr& instance, const s _fd = createSocket(true, _addr.ss_family); setBufSize(instance); setBlock(_fd, false); -#if !defined(NDEBUG) && !defined(__hpux) - bool connected = doConnect(_fd, _addr); - assert(connected); -#else - doConnect(_fd, _addr); -#endif - _connect = false; // We're connected now - bool multicast = false; - int port; - if(_addr.ss_family == AF_INET) + if(doConnect(_fd, _addr)) { - struct sockaddr_in* addrin = reinterpret_cast<struct sockaddr_in*>(&_addr); - multicast = IN_MULTICAST(ntohl(addrin->sin_addr.s_addr)); - port = ntohs(addrin->sin_port); + _connect = false; // We're connected now } - else - { - struct sockaddr_in6* addrin = reinterpret_cast<struct sockaddr_in6*>(&_addr); - multicast = IN6_IS_ADDR_MULTICAST(&addrin->sin6_addr); - port = ntohs(addrin->sin6_port); - } - if(multicast) + + if(isMulticast(_addr)) { if(mcastInterface.length() > 0) { @@ -316,12 +321,6 @@ IceInternal::UdpTransceiver::UdpTransceiver(const InstancePtr& instance, const s setMcastTtl(_fd, mcastTtl, _addr.ss_family == AF_INET); } } - - if(_traceLevels->network >= 1) - { - Trace out(_logger, _traceLevels->networkCat); - out << "starting to send udp packets\n" << toString(); - } } catch(...) { @@ -355,21 +354,8 @@ IceInternal::UdpTransceiver::UdpTransceiver(const InstancePtr& instance, const s Trace out(_logger, _traceLevels->networkCat); out << "attempting to bind to udp socket " << addrToString(_addr); } - bool multicast = false; - int port; - if(_addr.ss_family == AF_INET) - { - struct sockaddr_in* addrin = reinterpret_cast<struct sockaddr_in*>(&_addr); - multicast = IN_MULTICAST(ntohl(addrin->sin_addr.s_addr)); - port = ntohs(addrin->sin_port); - } - else - { - struct sockaddr_in6* addrin = reinterpret_cast<struct sockaddr_in6*>(&_addr); - multicast = IN6_IS_ADDR_MULTICAST(&addrin->sin6_addr); - port = ntohs(addrin->sin6_port); - } - if(multicast) + + if(isMulticast(_addr)) { setReuseAddress(_fd, true); @@ -379,7 +365,7 @@ IceInternal::UdpTransceiver::UdpTransceiver(const InstancePtr& instance, const s // so we bind to INADDR_ANY (0.0.0.0) instead. // struct sockaddr_storage addr; - getAddressForServer("", port, addr, _addr.ss_family == AF_INET ? EnableIPv4 : EnableIPv6); + getAddressForServer("", getPort(_addr), addr, _addr.ss_family == AF_INET ? EnableIPv4 : EnableIPv6); doBind(_fd, addr); #else doBind(_fd, _addr); |