summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
authorMarc Laukien <marc@zeroc.com>2001-09-28 20:54:38 +0000
committerMarc Laukien <marc@zeroc.com>2001-09-28 20:54:38 +0000
commit2f1e77e46bec2dfe5994f20e5113afa93a92f281 (patch)
tree4438063f9f54106730351f8c367d1a474f93fdf7 /cpp/src
parentinitial nested demo (does not work yet) (diff)
downloadice-2f1e77e46bec2dfe5994f20e5113afa93a92f281.tar.bz2
ice-2f1e77e46bec2dfe5994f20e5113afa93a92f281.tar.xz
ice-2f1e77e46bec2dfe5994f20e5113afa93a92f281.zip
bug fix
Diffstat (limited to 'cpp/src')
-rw-r--r--cpp/src/Ice/Collector.cpp4
-rw-r--r--cpp/src/Ice/Endpoint.cpp33
-rw-r--r--cpp/src/Ice/Endpoint.h45
-rw-r--r--cpp/src/Ice/Network.cpp5
-rw-r--r--cpp/src/Ice/SslAcceptor.cpp6
-rw-r--r--cpp/src/Ice/SslAcceptor.h2
-rw-r--r--cpp/src/Ice/TcpAcceptor.cpp6
-rw-r--r--cpp/src/Ice/TcpAcceptor.h2
-rw-r--r--cpp/src/Ice/UdpTransceiver.cpp6
-rw-r--r--cpp/src/Ice/UdpTransceiver.h2
10 files changed, 83 insertions, 28 deletions
diff --git a/cpp/src/Ice/Collector.cpp b/cpp/src/Ice/Collector.cpp
index 97d09ec7d73..6342739632d 100644
--- a/cpp/src/Ice/Collector.cpp
+++ b/cpp/src/Ice/Collector.cpp
@@ -572,7 +572,7 @@ IceInternal::CollectorFactory::CollectorFactory(const InstancePtr& instance,
{
try
{
- _transceiver = endpoint->serverTransceiver(_instance);
+ _transceiver = _endpoint->serverTransceiver(_instance, _endpoint);
if (_transceiver)
{
CollectorPtr collector = new Collector(_instance, _adapter, _transceiver, _endpoint);
@@ -580,7 +580,7 @@ IceInternal::CollectorFactory::CollectorFactory(const InstancePtr& instance,
}
else
{
- _acceptor = endpoint->acceptor(_instance);
+ _acceptor = _endpoint->acceptor(_instance, _endpoint);
assert(_acceptor);
_acceptor->listen();
_threadPool = _instance->threadPool();
diff --git a/cpp/src/Ice/Endpoint.cpp b/cpp/src/Ice/Endpoint.cpp
index 553a91a52cf..15c4b502e8c 100644
--- a/cpp/src/Ice/Endpoint.cpp
+++ b/cpp/src/Ice/Endpoint.cpp
@@ -161,8 +161,9 @@ IceInternal::UnknownEndpoint::clientTransceiver(const InstancePtr&) const
}
TransceiverPtr
-IceInternal::UnknownEndpoint::serverTransceiver(const InstancePtr&) const
+IceInternal::UnknownEndpoint::serverTransceiver(const InstancePtr&, EndpointPtr& endp) const
{
+ endp = const_cast<UnknownEndpoint*>(this);
return 0;
}
@@ -173,8 +174,9 @@ IceInternal::UnknownEndpoint::connector(const InstancePtr& instance) const
}
AcceptorPtr
-IceInternal::UnknownEndpoint::acceptor(const InstancePtr& instance) const
+IceInternal::UnknownEndpoint::acceptor(const InstancePtr& instance, EndpointPtr& endp) const
{
+ endp = const_cast<UnknownEndpoint*>(this);
return 0;
}
@@ -417,8 +419,9 @@ IceInternal::TcpEndpoint::clientTransceiver(const InstancePtr&) const
}
TransceiverPtr
-IceInternal::TcpEndpoint::serverTransceiver(const InstancePtr&) const
+IceInternal::TcpEndpoint::serverTransceiver(const InstancePtr&, EndpointPtr& endp) const
{
+ endp = const_cast<TcpEndpoint*>(this);
return 0;
}
@@ -429,9 +432,11 @@ IceInternal::TcpEndpoint::connector(const InstancePtr& instance) const
}
AcceptorPtr
-IceInternal::TcpEndpoint::acceptor(const InstancePtr& instance) const
+IceInternal::TcpEndpoint::acceptor(const InstancePtr& instance, EndpointPtr& endp) const
{
- return new TcpAcceptor(instance, _port);
+ TcpAcceptor* p = new TcpAcceptor(instance, _port);
+ endp = new TcpEndpoint(_host, p->effectivePort(), _timeout);
+ return p;
}
bool
@@ -729,8 +734,9 @@ IceInternal::SslEndpoint::clientTransceiver(const InstancePtr&) const
}
TransceiverPtr
-IceInternal::SslEndpoint::serverTransceiver(const InstancePtr&) const
+IceInternal::SslEndpoint::serverTransceiver(const InstancePtr&, EndpointPtr& endp) const
{
+ endp = const_cast<SslEndpoint*>(this);
return 0;
}
@@ -741,9 +747,11 @@ IceInternal::SslEndpoint::connector(const InstancePtr& instance) const
}
AcceptorPtr
-IceInternal::SslEndpoint::acceptor(const InstancePtr& instance) const
+IceInternal::SslEndpoint::acceptor(const InstancePtr& instance, EndpointPtr& endp) const
{
- return new SslAcceptor(instance, _port);
+ SslAcceptor* p = new SslAcceptor(instance, _port);
+ endp = new SslEndpoint(_host, p->effectivePort(), _timeout);
+ return p;
}
bool
@@ -1019,9 +1027,11 @@ IceInternal::UdpEndpoint::clientTransceiver(const InstancePtr& instance) const
}
TransceiverPtr
-IceInternal::UdpEndpoint::serverTransceiver(const InstancePtr& instance) const
+IceInternal::UdpEndpoint::serverTransceiver(const InstancePtr& instance, EndpointPtr& endp) const
{
- return new UdpTransceiver(instance, _port);
+ UdpTransceiver* p = new UdpTransceiver(instance, _port);
+ endp = new UdpEndpoint(_host, p->effectivePort());
+ return p;
}
ConnectorPtr
@@ -1031,8 +1041,9 @@ IceInternal::UdpEndpoint::connector(const InstancePtr&) const
}
AcceptorPtr
-IceInternal::UdpEndpoint::acceptor(const InstancePtr&) const
+IceInternal::UdpEndpoint::acceptor(const InstancePtr&, EndpointPtr& endp) const
{
+ endp = const_cast<UdpEndpoint*>(this);
return 0;
}
diff --git a/cpp/src/Ice/Endpoint.h b/cpp/src/Ice/Endpoint.h
index 2d1b63d72f2..b9ab3bc588b 100644
--- a/cpp/src/Ice/Endpoint.h
+++ b/cpp/src/Ice/Endpoint.h
@@ -88,19 +88,34 @@ public:
virtual bool secure() const = 0;
//
- // Return client- and server-side Transceivers for the endpoint,
- // or null if a TransceiverPtr can only be created by Acceptors or
- // Connectors.
+ // Return a client side transceiver for this endpoint, or null if a
+ // transceiver can only be created by a connector.
//
virtual TransceiverPtr clientTransceiver(const InstancePtr&) const = 0;
- virtual TransceiverPtr serverTransceiver(const InstancePtr&) const = 0;
//
- // Return Acceptors and Connectors for the endpoint, or null if no
- // Acceptors and Connectors are available.
+ // Return a server side transceiver for this endpoint, or null if a
+ // transceiver can only be created by an acceptor. In case a
+ // transceiver is created, this operation also returns a new
+ // "effective" endpoint, which might differ from this endpoint,
+ // for example, if a dynamic port number is assigned.
+ //
+ virtual TransceiverPtr serverTransceiver(const InstancePtr&, EndpointPtr&) const = 0;
+
+ //
+ // Return a connector for this endpoint, or null if no connector
+ // is available.
//
virtual ConnectorPtr connector(const InstancePtr&) const = 0;
- virtual AcceptorPtr acceptor(const InstancePtr&) const = 0;
+
+ //
+ // Return an acceptor for this endpoint, or null if no acceptors
+ // is available. In case an acceptor is created, this operation
+ // also returns a new "effective" endpoint, which might differ
+ // from this endpoint, for example, if a dynamic port number is
+ // assigned.
+ //
+ virtual AcceptorPtr acceptor(const InstancePtr&, EndpointPtr&) const = 0;
//
// Check whether the endpoint is equivalent to a specific
@@ -131,9 +146,9 @@ public:
virtual bool datagram() const;
virtual bool secure() const;
virtual TransceiverPtr clientTransceiver(const InstancePtr&) const;
- virtual TransceiverPtr serverTransceiver(const InstancePtr&) const;
+ virtual TransceiverPtr serverTransceiver(const InstancePtr&, EndpointPtr&) const;
virtual ConnectorPtr connector(const InstancePtr&) const;
- virtual AcceptorPtr acceptor(const InstancePtr&) const;
+ virtual AcceptorPtr acceptor(const InstancePtr&, EndpointPtr&) const;
virtual bool equivalent(const TransceiverPtr&) const;
virtual bool equivalent(const AcceptorPtr&) const;
@@ -165,9 +180,9 @@ public:
virtual bool datagram() const;
virtual bool secure() const;
virtual TransceiverPtr clientTransceiver(const InstancePtr&) const;
- virtual TransceiverPtr serverTransceiver(const InstancePtr&) const;
+ virtual TransceiverPtr serverTransceiver(const InstancePtr&, EndpointPtr&) const;
virtual ConnectorPtr connector(const InstancePtr&) const;
- virtual AcceptorPtr acceptor(const InstancePtr&) const;
+ virtual AcceptorPtr acceptor(const InstancePtr&, EndpointPtr&) const;
virtual bool equivalent(const TransceiverPtr&) const;
virtual bool equivalent(const AcceptorPtr&) const;
@@ -201,9 +216,9 @@ public:
virtual bool datagram() const;
virtual bool secure() const;
virtual TransceiverPtr clientTransceiver(const InstancePtr&) const;
- virtual TransceiverPtr serverTransceiver(const InstancePtr&) const;
+ virtual TransceiverPtr serverTransceiver(const InstancePtr&, EndpointPtr&) const;
virtual ConnectorPtr connector(const InstancePtr&) const;
- virtual AcceptorPtr acceptor(const InstancePtr&) const;
+ virtual AcceptorPtr acceptor(const InstancePtr&, EndpointPtr&) const;
virtual bool equivalent(const TransceiverPtr&) const;
virtual bool equivalent(const AcceptorPtr&) const;
@@ -237,9 +252,9 @@ public:
virtual bool datagram() const;
virtual bool secure() const;
virtual TransceiverPtr clientTransceiver(const InstancePtr&) const;
- virtual TransceiverPtr serverTransceiver(const InstancePtr&) const;
+ virtual TransceiverPtr serverTransceiver(const InstancePtr&, EndpointPtr&) const;
virtual ConnectorPtr connector(const InstancePtr&) const;
- virtual AcceptorPtr acceptor(const InstancePtr&) const;
+ virtual AcceptorPtr acceptor(const InstancePtr&, EndpointPtr&) const;
virtual bool equivalent(const TransceiverPtr&) const;
virtual bool equivalent(const AcceptorPtr&) const;
diff --git a/cpp/src/Ice/Network.cpp b/cpp/src/Ice/Network.cpp
index f2c7cb3e505..d11bca5521d 100644
--- a/cpp/src/Ice/Network.cpp
+++ b/cpp/src/Ice/Network.cpp
@@ -954,6 +954,11 @@ static JTCMutex inetNtoaMutex;
std::string
IceInternal::fdToString(int fd)
{
+ if(fd == INVALID_SOCKET)
+ {
+ return "<closed>";
+ }
+
socklen_t localLen = sizeof(struct sockaddr_in);
struct sockaddr_in localAddr;
if (getsockname(fd, reinterpret_cast<struct sockaddr*>(&localAddr), &localLen) == SOCKET_ERROR)
diff --git a/cpp/src/Ice/SslAcceptor.cpp b/cpp/src/Ice/SslAcceptor.cpp
index 9c7b2ce11ae..4da28825d86 100644
--- a/cpp/src/Ice/SslAcceptor.cpp
+++ b/cpp/src/Ice/SslAcceptor.cpp
@@ -112,6 +112,12 @@ IceInternal::SslAcceptor::equivalent(const string& host, int port) const
return memcmp(&addr, &localAddr, sizeof(struct sockaddr_in)) == 0;
}
+int
+IceInternal::SslAcceptor::effectivePort()
+{
+ return ntohs(_addr.sin_port);
+}
+
IceInternal::SslAcceptor::SslAcceptor(const InstancePtr& instance, int port) :
_instance(instance),
_traceLevels(instance->traceLevels()),
diff --git a/cpp/src/Ice/SslAcceptor.h b/cpp/src/Ice/SslAcceptor.h
index 4367da34dae..a143180c2c9 100644
--- a/cpp/src/Ice/SslAcceptor.h
+++ b/cpp/src/Ice/SslAcceptor.h
@@ -39,6 +39,8 @@ public:
virtual bool equivalent(const std::string&, int) const;
+ int effectivePort();
+
private:
SslAcceptor(const InstancePtr&, int);
diff --git a/cpp/src/Ice/TcpAcceptor.cpp b/cpp/src/Ice/TcpAcceptor.cpp
index 64e9e900a3a..6eb0cf20f31 100644
--- a/cpp/src/Ice/TcpAcceptor.cpp
+++ b/cpp/src/Ice/TcpAcceptor.cpp
@@ -112,6 +112,12 @@ IceInternal::TcpAcceptor::equivalent(const string& host, int port) const
return memcmp(&addr, &localAddr, sizeof(struct sockaddr_in)) == 0;
}
+int
+IceInternal::TcpAcceptor::effectivePort()
+{
+ return ntohs(_addr.sin_port);
+}
+
IceInternal::TcpAcceptor::TcpAcceptor(const InstancePtr& instance, int port) :
_instance(instance),
_traceLevels(instance->traceLevels()),
diff --git a/cpp/src/Ice/TcpAcceptor.h b/cpp/src/Ice/TcpAcceptor.h
index 7d28c2d1fb1..7ad0d87c551 100644
--- a/cpp/src/Ice/TcpAcceptor.h
+++ b/cpp/src/Ice/TcpAcceptor.h
@@ -39,6 +39,8 @@ public:
virtual bool equivalent(const std::string&, int) const;
+ int effectivePort();
+
private:
TcpAcceptor(const InstancePtr&, int);
diff --git a/cpp/src/Ice/UdpTransceiver.cpp b/cpp/src/Ice/UdpTransceiver.cpp
index 823428d7b94..68b54edc4e1 100644
--- a/cpp/src/Ice/UdpTransceiver.cpp
+++ b/cpp/src/Ice/UdpTransceiver.cpp
@@ -146,6 +146,12 @@ IceInternal::UdpTransceiver::equivalent(const string& host, int port) const
return memcmp(&addr, &localAddr, sizeof(struct sockaddr_in)) == 0;
}
+int
+IceInternal::UdpTransceiver::effectivePort()
+{
+ return ntohs(_addr.sin_port);
+}
+
IceInternal::UdpTransceiver::UdpTransceiver(const InstancePtr& instance, const string& host, int port) :
_instance(instance),
_traceLevels(instance->traceLevels()),
diff --git a/cpp/src/Ice/UdpTransceiver.h b/cpp/src/Ice/UdpTransceiver.h
index 0c2c6a99313..832820a7d84 100644
--- a/cpp/src/Ice/UdpTransceiver.h
+++ b/cpp/src/Ice/UdpTransceiver.h
@@ -38,6 +38,8 @@ public:
virtual bool equivalent(const std::string&, int) const;
+ int effectivePort();
+
private:
UdpTransceiver(const InstancePtr&, const std::string&, int);