diff options
author | Marc Laukien <marc@zeroc.com> | 2004-03-29 23:21:40 +0000 |
---|---|---|
committer | Marc Laukien <marc@zeroc.com> | 2004-03-29 23:21:40 +0000 |
commit | 64c22bc624d13bec6e9e88fc6411c0d465bb47db (patch) | |
tree | 69d4a68e52cab893fc5763a92f21e87bc9ffd58d /cpp | |
parent | *** empty log message *** (diff) | |
download | ice-64c22bc624d13bec6e9e88fc6411c0d465bb47db.tar.bz2 ice-64c22bc624d13bec6e9e88fc6411c0d465bb47db.tar.xz ice-64c22bc624d13bec6e9e88fc6411c0d465bb47db.zip |
ConnectionRefusedException
Diffstat (limited to 'cpp')
-rw-r--r-- | cpp/CHANGES | 25 | ||||
-rw-r--r-- | cpp/slice/Ice/LocalException.ice | 11 | ||||
-rw-r--r-- | cpp/src/Ice/Exception.cpp | 7 | ||||
-rw-r--r-- | cpp/src/Ice/Network.cpp | 27 | ||||
-rw-r--r-- | cpp/src/Ice/Network.h | 1 | ||||
-rw-r--r-- | cpp/src/IceSSL/SslClientTransceiver.cpp | 12 | ||||
-rw-r--r-- | cpp/src/IceSSL/SslServerTransceiver.cpp | 2 | ||||
-rw-r--r-- | cpp/src/IceSSL/SslTransceiver.cpp | 4 |
8 files changed, 67 insertions, 22 deletions
diff --git a/cpp/CHANGES b/cpp/CHANGES index 7175c3c6aa5..a25ad6e7871 100644 --- a/cpp/CHANGES +++ b/cpp/CHANGES @@ -1,17 +1,20 @@ Changes since version 1.3.0 --------------------------- -- The documentation claimed that the Ice.ProgramName property - was initialized to the value of argv[0], but that initialization - was in fact not happening. As of this version, Ice.ProgramName - is initialized correctly. - -- Fixed the slice2cpp compiler for operations with - multiple exceptions in an exception specification: - if an exception was a base of one or more other exceptions - in the same exception specification, the code generator - sometimes emitted the catch blocks in the marshaling and dispatch - code in the wrong order. +- Added ConnectionRefusedException as a specialization of + ConnectFailedException, to indicate if a connection fails because a + server actively refuses such connection. + +- The documentation claimed that the Ice.ProgramName property was + initialized to the value of argv[0], but that initialization was in + fact not happening. As of this version, Ice.ProgramName is + initialized correctly. + +- Fixed the slice2cpp compiler for operations with multiple exceptions + in an exception specification: if an exception was a base of one or + more other exceptions in the same exception specification, the code + generator sometimes emitted the catch blocks in the marshaling and + dispatch code in the wrong order. Changes since version 1.2.0 --------------------------- diff --git a/cpp/slice/Ice/LocalException.ice b/cpp/slice/Ice/LocalException.ice index bca7269cd12..946112fd903 100644 --- a/cpp/slice/Ice/LocalException.ice +++ b/cpp/slice/Ice/LocalException.ice @@ -307,6 +307,17 @@ local exception ConnectFailedException extends SocketException /** * + * This exception is a specialization of [ConnectFailedException] for + * connection failures, where the server host actively refuses a + * connection. + * + **/ +local exception ConnectionRefusedException extends ConnectFailedException +{ +}; + +/** + * * This exception is a specialization of [SocketException], indicating * a lost connection. * diff --git a/cpp/src/Ice/Exception.cpp b/cpp/src/Ice/Exception.cpp index 848c7d5f83e..baa83eab316 100644 --- a/cpp/src/Ice/Exception.cpp +++ b/cpp/src/Ice/Exception.cpp @@ -205,6 +205,13 @@ Ice::ConnectFailedException::ice_print(ostream& out) const } void +Ice::ConnectionRefusedException::ice_print(ostream& out) const +{ + Exception::ice_print(out); + out << ":\nconnection refused: " << errorToString(error); +} + +void Ice::ConnectionLostException::ice_print(ostream& out) const { Exception::ice_print(out); diff --git a/cpp/src/Ice/Network.cpp b/cpp/src/Ice/Network.cpp index 3512f7e0633..2924f8aeee4 100644 --- a/cpp/src/Ice/Network.cpp +++ b/cpp/src/Ice/Network.cpp @@ -101,6 +101,17 @@ IceInternal::connectFailed() } bool +IceInternal::connectionRefused() +{ +#ifdef _WIN32 + int error = WSAGetLastError(); + return error == WSAECONNREFUSED; +#else + return errno == ECONNREFUSED; +#endif +} + +bool IceInternal::connectInProgress() { #ifdef _WIN32 @@ -484,7 +495,13 @@ repeatConnect: #else errno = val; #endif - if(connectFailed()) + if(connectionRefused()) + { + ConnectionRefusedException ex(__FILE__, __LINE__); + ex.error = getSocketErrno(); + throw ex; + } + else if(connectFailed()) { ConnectFailedException ex(__FILE__, __LINE__); ex.error = getSocketErrno(); @@ -502,7 +519,13 @@ repeatConnect: } closeSocket(fd); - if(connectFailed()) + if(connectionRefused()) + { + ConnectionRefusedException ex(__FILE__, __LINE__); + ex.error = getSocketErrno(); + throw ex; + } + else if(connectFailed()) { ConnectFailedException ex(__FILE__, __LINE__); ex.error = getSocketErrno(); diff --git a/cpp/src/Ice/Network.h b/cpp/src/Ice/Network.h index 83568571088..60362a24ef0 100644 --- a/cpp/src/Ice/Network.h +++ b/cpp/src/Ice/Network.h @@ -79,6 +79,7 @@ ICE_PROTOCOL_API bool acceptInterrupted(); ICE_PROTOCOL_API bool noBuffers(); ICE_PROTOCOL_API bool wouldBlock(); ICE_PROTOCOL_API bool connectFailed(); +ICE_PROTOCOL_API bool connectionRefused(); ICE_PROTOCOL_API bool connectInProgress(); ICE_PROTOCOL_API bool connectionLost(); ICE_PROTOCOL_API bool notConnected(); diff --git a/cpp/src/IceSSL/SslClientTransceiver.cpp b/cpp/src/IceSSL/SslClientTransceiver.cpp index 4deb7038700..ea90e1c54ef 100644 --- a/cpp/src/IceSSL/SslClientTransceiver.cpp +++ b/cpp/src/IceSSL/SslClientTransceiver.cpp @@ -284,14 +284,14 @@ IceSSL::SslClientTransceiver::handshake(int timeout) else // result == 0 { // - // The OpenSSL docs say that a result code of 0 indicates - // a graceful shutdown. In order to cause a retry in the - // Ice core, we raise ConnectFailedException. However, - // errno isn't set in this situation, so we always use + // The OpenSSL docs say that a result code of 0 + // indicates a graceful shutdown. In order to + // cause a retry in the Ice core, we raise + // ConnectionRefusedException. However, errno + // isn't set in this situation, so we always use // ECONNREFUSED. // - - ConnectFailedException ex(__FILE__, __LINE__); + ConnectionRefusedException ex(__FILE__, __LINE__); #ifdef _WIN32 ex.error = WSAECONNREFUSED; #else diff --git a/cpp/src/IceSSL/SslServerTransceiver.cpp b/cpp/src/IceSSL/SslServerTransceiver.cpp index 3a38180171b..bf05422c09d 100644 --- a/cpp/src/IceSSL/SslServerTransceiver.cpp +++ b/cpp/src/IceSSL/SslServerTransceiver.cpp @@ -287,7 +287,7 @@ IceSSL::SslServerTransceiver::handshake(int timeout) else { // - // NOTE: Should this be ConnectFailedException like in the Client? + // NOTE: Should this be ConnectionRefusedException like in the Client? // ProtocolException protocolEx(__FILE__, __LINE__); diff --git a/cpp/src/IceSSL/SslTransceiver.cpp b/cpp/src/IceSSL/SslTransceiver.cpp index eb42d4d938f..d9595a4a37f 100644 --- a/cpp/src/IceSSL/SslTransceiver.cpp +++ b/cpp/src/IceSSL/SslTransceiver.cpp @@ -350,8 +350,8 @@ IceSSL::SslTransceiver::forceHandshake() close(); - // If the handshake fails, the connection failed. - ConnectFailedException ex(__FILE__, __LINE__); + // If the handshake fails, we consider the connection as refused. + ConnectionRefusedException ex(__FILE__, __LINE__); #ifdef _WIN32 ex.error = WSAECONNREFUSED; #else |