diff options
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/Ice/Collector.cpp | 4 | ||||
-rw-r--r-- | cpp/src/Ice/Endpoint.cpp | 33 | ||||
-rw-r--r-- | cpp/src/Ice/Endpoint.h | 45 | ||||
-rw-r--r-- | cpp/src/Ice/Network.cpp | 5 | ||||
-rw-r--r-- | cpp/src/Ice/SslAcceptor.cpp | 6 | ||||
-rw-r--r-- | cpp/src/Ice/SslAcceptor.h | 2 | ||||
-rw-r--r-- | cpp/src/Ice/TcpAcceptor.cpp | 6 | ||||
-rw-r--r-- | cpp/src/Ice/TcpAcceptor.h | 2 | ||||
-rw-r--r-- | cpp/src/Ice/UdpTransceiver.cpp | 6 | ||||
-rw-r--r-- | cpp/src/Ice/UdpTransceiver.h | 2 |
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); |