summaryrefslogtreecommitdiff
path: root/cpp
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2008-04-07 18:29:38 +0200
committerBenoit Foucher <benoit@zeroc.com>2008-04-07 18:29:38 +0200
commitf6876a31c934d2ed09a3a69adeb62075ac136f99 (patch)
treeff90bd45a4573ffc6bb9ff8dcc8b3680a1d38230 /cpp
parentCHANGES file used to refer to CHANGES.txt. (diff)
downloadice-f6876a31c934d2ed09a3a69adeb62075ac136f99.tar.bz2
ice-f6876a31c934d2ed09a3a69adeb62075ac136f99.tar.xz
ice-f6876a31c934d2ed09a3a69adeb62075ac136f99.zip
Fixed bug 2950
Diffstat (limited to 'cpp')
-rw-r--r--cpp/src/Ice/Network.cpp13
-rw-r--r--cpp/src/Ice/Network.h1
-rw-r--r--cpp/src/Ice/UdpTransceiver.cpp70
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);