summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src')
-rw-r--r--cpp/src/Ice/Network.cpp23
-rw-r--r--cpp/src/Ice/Network.h2
-rw-r--r--cpp/src/Ice/TcpConnector.cpp6
-rw-r--r--cpp/src/Ice/TcpConnector.h2
-rw-r--r--cpp/src/Ice/TcpEndpointI.cpp13
-rw-r--r--cpp/src/Ice/UdpEndpointI.cpp13
-rw-r--r--cpp/src/Ice/UdpTransceiver.cpp8
-rw-r--r--cpp/src/Ice/UdpTransceiver.h2
-rw-r--r--cpp/src/IceSSL/ConnectorI.cpp8
-rw-r--r--cpp/src/IceSSL/ConnectorI.h2
-rw-r--r--cpp/src/IceSSL/EndpointI.cpp13
11 files changed, 39 insertions, 53 deletions
diff --git a/cpp/src/Ice/Network.cpp b/cpp/src/Ice/Network.cpp
index 5b515112c8e..2d7152546e7 100644
--- a/cpp/src/Ice/Network.cpp
+++ b/cpp/src/Ice/Network.cpp
@@ -1323,10 +1323,15 @@ IceInternal::addrToString(const struct sockaddr_in& addr)
return s.str();
}
-vector<string>
-IceInternal::getHosts(const string& host)
+vector<struct sockaddr_in>
+IceInternal::getAddresses(const string& host, int port)
{
- vector<string> result;
+ vector<struct sockaddr_in> result;
+
+ struct sockaddr_in addr;
+ memset(&addr, 0, sizeof(struct sockaddr_in));
+ addr.sin_family = AF_INET;
+ addr.sin_port = htons(port);
#ifdef _WIN32
@@ -1357,8 +1362,8 @@ IceInternal::getHosts(const string& host)
char** p = entry->h_addr_list;
while(*p)
{
- struct in_addr* addr = reinterpret_cast<in_addr*>(*p);
- result.push_back(inetAddrToString(*addr));
+ memcpy(&addr.sin_addr, *p, entry->h_length);
+ result.push_back(addr);
p++;
}
@@ -1392,11 +1397,12 @@ IceInternal::getHosts(const string& host)
struct sockaddr_in* sin = reinterpret_cast<sockaddr_in*>(p->ai_addr);
if(sin->sin_addr.s_addr != 0)
{
- string host = inetAddrToString((*sin).sin_addr);
+ addr.sin_addr.s_addr = sin->sin_addr.s_addr;
+
bool found = false;
for(unsigned int i = 0; i < result.size(); ++i)
{
- if(result[i] == host)
+ if(compareAddress(result[i], addr) == 0)
{
found = true;
break;
@@ -1404,7 +1410,8 @@ IceInternal::getHosts(const string& host)
}
if(!found)
{
- result.push_back(inetAddrToString((*sin).sin_addr));
+
+ result.push_back(addr);
}
}
}
diff --git a/cpp/src/Ice/Network.h b/cpp/src/Ice/Network.h
index eb2c9235ca4..4e029d67c2d 100644
--- a/cpp/src/Ice/Network.h
+++ b/cpp/src/Ice/Network.h
@@ -116,7 +116,7 @@ ICE_API void fdToLocalAddress(SOCKET, struct sockaddr_in&);
ICE_API bool fdToRemoteAddress(SOCKET, struct sockaddr_in&);
ICE_API std::string addrToString(const struct sockaddr_in&);
-ICE_API std::vector<std::string> getHosts(const std::string&);
+ICE_API std::vector<struct sockaddr_in> getAddresses(const std::string&, int);
ICE_API std::vector<std::string> getLocalHosts();
ICE_API void setTcpBufSize(SOCKET, const Ice::PropertiesPtr&, const Ice::LoggerPtr&);
ICE_API int getSocketErrno();
diff --git a/cpp/src/Ice/TcpConnector.cpp b/cpp/src/Ice/TcpConnector.cpp
index 4effb9ff4d6..9c9b07e5872 100644
--- a/cpp/src/Ice/TcpConnector.cpp
+++ b/cpp/src/Ice/TcpConnector.cpp
@@ -48,12 +48,12 @@ IceInternal::TcpConnector::toString() const
return addrToString(_addr);
}
-IceInternal::TcpConnector::TcpConnector(const InstancePtr& instance, const string& host, int port) :
+IceInternal::TcpConnector::TcpConnector(const InstancePtr& instance, const struct sockaddr_in& addr) :
_instance(instance),
_traceLevels(instance->traceLevels()),
- _logger(instance->initializationData().logger)
+ _logger(instance->initializationData().logger),
+ _addr(addr)
{
- getAddress(host, port, _addr);
}
IceInternal::TcpConnector::~TcpConnector()
diff --git a/cpp/src/Ice/TcpConnector.h b/cpp/src/Ice/TcpConnector.h
index 3d552b3fd32..edcd0f25ccf 100644
--- a/cpp/src/Ice/TcpConnector.h
+++ b/cpp/src/Ice/TcpConnector.h
@@ -36,7 +36,7 @@ public:
private:
- TcpConnector(const InstancePtr&, const std::string&, int);
+ TcpConnector(const InstancePtr&, const struct sockaddr_in&);
virtual ~TcpConnector();
friend class TcpEndpointI;
diff --git a/cpp/src/Ice/TcpEndpointI.cpp b/cpp/src/Ice/TcpEndpointI.cpp
index 6b0b7a5c4b5..0d0573840fa 100644
--- a/cpp/src/Ice/TcpEndpointI.cpp
+++ b/cpp/src/Ice/TcpEndpointI.cpp
@@ -283,17 +283,10 @@ vector<ConnectorPtr>
IceInternal::TcpEndpointI::connectors() const
{
vector<ConnectorPtr> connectors;
- vector<string> hosts = getHosts(_host);
- if(hosts.size() > 1)
+ vector<struct sockaddr_in> addresses = getAddresses(_host, _port);
+ for(unsigned int i = 0; i < addresses.size(); ++i)
{
- for(unsigned int i = 0; i < hosts.size(); ++i)
- {
- connectors.push_back(new TcpConnector(_instance, hosts[i], _port));
- }
- }
- else
- {
- connectors.push_back(new TcpConnector(_instance, _host, _port));
+ connectors.push_back(new TcpConnector(_instance, addresses[i]));
}
return connectors;
}
diff --git a/cpp/src/Ice/UdpEndpointI.cpp b/cpp/src/Ice/UdpEndpointI.cpp
index dac2d3717ee..030c44f6f0b 100644
--- a/cpp/src/Ice/UdpEndpointI.cpp
+++ b/cpp/src/Ice/UdpEndpointI.cpp
@@ -452,17 +452,10 @@ vector<TransceiverPtr>
IceInternal::UdpEndpointI::clientTransceivers() const
{
vector<TransceiverPtr> transceivers;
- vector<string> hosts = getHosts(_host);
- if(hosts.size() > 1)
+ vector<struct sockaddr_in> addresses = getAddresses(_host, _port);
+ for(unsigned int i = 0; i < addresses.size(); ++i)
{
- for(unsigned int i = 0; i < hosts.size(); ++i)
- {
- transceivers.push_back(new UdpTransceiver(_instance, hosts[i], _port, _mcastInterface, _mcastTtl));
- }
- }
- else
- {
- transceivers.push_back(new UdpTransceiver(_instance, _host, _port, _mcastInterface, _mcastTtl));
+ transceivers.push_back(new UdpTransceiver(_instance, addresses[i], _mcastInterface, _mcastTtl));
}
return transceivers;
}
diff --git a/cpp/src/Ice/UdpTransceiver.cpp b/cpp/src/Ice/UdpTransceiver.cpp
index 1fa3fb8e5eb..a14cf302810 100644
--- a/cpp/src/Ice/UdpTransceiver.cpp
+++ b/cpp/src/Ice/UdpTransceiver.cpp
@@ -384,7 +384,7 @@ IceInternal::UdpTransceiver::effectivePort() const
return ntohs(_addr.sin_port);
}
-IceInternal::UdpTransceiver::UdpTransceiver(const InstancePtr& instance, const string& host, int port,
+IceInternal::UdpTransceiver::UdpTransceiver(const InstancePtr& instance, const struct sockaddr_in& addr,
const string& mcastInterface, int mcastTtl) :
_traceLevels(instance->traceLevels()),
_logger(instance->initializationData().logger),
@@ -392,14 +392,14 @@ IceInternal::UdpTransceiver::UdpTransceiver(const InstancePtr& instance, const s
_incoming(false),
_connect(true),
_warn(instance->initializationData().properties->getPropertyAsInt("Ice.Warn.Datagrams") > 0),
- _shutdownReadWrite(false)
+ _shutdownReadWrite(false),
+ _addr(addr)
{
try
{
_fd = createSocket(true);
setBufSize(instance);
setBlock(_fd, false);
- getAddress(host, port, _addr);
doConnect(_fd, _addr, -1);
_connect = false; // We're connected now
if(isMulticast(_addr))
@@ -407,7 +407,7 @@ IceInternal::UdpTransceiver::UdpTransceiver(const InstancePtr& instance, const s
if(mcastInterface.length() > 0)
{
struct sockaddr_in addr;
- getAddress(mcastInterface, port, addr);
+ getAddress(mcastInterface, ntohs(_addr.sin_port), addr);
setMcastInterface(_fd, addr.sin_addr);
}
if(mcastTtl != -1)
diff --git a/cpp/src/Ice/UdpTransceiver.h b/cpp/src/Ice/UdpTransceiver.h
index 85d82e36fdd..97bb5e5ea82 100644
--- a/cpp/src/Ice/UdpTransceiver.h
+++ b/cpp/src/Ice/UdpTransceiver.h
@@ -48,7 +48,7 @@ public:
private:
- UdpTransceiver(const InstancePtr&, const std::string&, int, const std::string&, int);
+ UdpTransceiver(const InstancePtr&, const struct sockaddr_in&, const std::string&, int);
UdpTransceiver(const InstancePtr&, const std::string&, int, const std::string&, bool);
virtual ~UdpTransceiver();
diff --git a/cpp/src/IceSSL/ConnectorI.cpp b/cpp/src/IceSSL/ConnectorI.cpp
index ffda1471012..1d8407e6530 100644
--- a/cpp/src/IceSSL/ConnectorI.cpp
+++ b/cpp/src/IceSSL/ConnectorI.cpp
@@ -178,12 +178,12 @@ IceSSL::ConnectorI::toString() const
return IceInternal::addrToString(_addr);
}
-IceSSL::ConnectorI::ConnectorI(const InstancePtr& instance, const string& host, int port) :
+IceSSL::ConnectorI::ConnectorI(const InstancePtr& instance, const struct sockaddr_in& addr) :
_instance(instance),
- _host(host),
- _logger(instance->communicator()->getLogger())
+ _host(IceInternal::inetAddrToString(addr.sin_addr)),
+ _logger(instance->communicator()->getLogger()),
+ _addr(addr)
{
- IceInternal::getAddress(host, port, _addr);
}
IceSSL::ConnectorI::~ConnectorI()
diff --git a/cpp/src/IceSSL/ConnectorI.h b/cpp/src/IceSSL/ConnectorI.h
index 71b00e03663..01033b3b1b7 100644
--- a/cpp/src/IceSSL/ConnectorI.h
+++ b/cpp/src/IceSSL/ConnectorI.h
@@ -35,7 +35,7 @@ public:
private:
- ConnectorI(const InstancePtr&, const std::string&, int);
+ ConnectorI(const InstancePtr&, const struct sockaddr_in&);
virtual ~ConnectorI();
friend class EndpointI;
diff --git a/cpp/src/IceSSL/EndpointI.cpp b/cpp/src/IceSSL/EndpointI.cpp
index a657b027874..9e95dd5aa1e 100644
--- a/cpp/src/IceSSL/EndpointI.cpp
+++ b/cpp/src/IceSSL/EndpointI.cpp
@@ -283,17 +283,10 @@ vector<IceInternal::ConnectorPtr>
IceSSL::EndpointI::connectors() const
{
vector<IceInternal::ConnectorPtr> connectors;
- vector<string> hosts = IceInternal::getHosts(_host);
- if(hosts.size() > 1)
+ vector<struct sockaddr_in> addresses = IceInternal::getAddresses(_host, _port);
+ for(unsigned int i = 0; i < addresses.size(); ++i)
{
- for(unsigned int i = 0; i < hosts.size(); ++i)
- {
- connectors.push_back(new ConnectorI(_instance, hosts[i], _port));
- }
- }
- else
- {
- connectors.push_back(new ConnectorI(_instance, _host, _port));
+ connectors.push_back(new ConnectorI(_instance, addresses[i]));
}
return connectors;
}