#include <Asynch_Connector.h>
Inheritance diagram for ACE_Asynch_Connector< HANDLER >:
Public Member Functions | |
ACE_Asynch_Connector (void) | |
A do nothing constructor. | |
virtual | ~ACE_Asynch_Connector (void) |
Virtual destruction. | |
virtual int | open (int pass_addresses=0, ACE_Proactor *proactor=0, int validate_new_connection=1) |
virtual int | connect (const ACE_INET_Addr &remote_sap, const ACE_INET_Addr &local_sap=(const ACE_INET_Addr &) ACE_Addr::sap_any, int reuse_addr=1, const void *act=0) |
This initiates a new asynchronous connect. | |
virtual int | cancel (void) |
virtual int | validate_connection (const ACE_Asynch_Connect::Result &result, const ACE_INET_Addr &remote, const ACE_INET_Addr &local) |
virtual int | pass_addresses (void) const |
virtual void | pass_addresses (int new_value) |
virtual int | validate_new_connection (void) const |
virtual void | validate_new_connection (int new_value) |
Protected Member Functions | |
virtual void | handle_connect (const ACE_Asynch_Connect::Result &result) |
This is called when an outstanding accept completes. | |
void | parse_address (const ACE_Asynch_Connect::Result &result, ACE_INET_Addr &remote_address, ACE_INET_Addr &local_address) |
This parses the address from read buffer. | |
ACE_Asynch_Connect & | asynch_connect (void) |
Return the asynch Connect object. | |
virtual HANDLER * | make_handler (void) |
Private Attributes | |
ACE_Asynch_Connect | asynch_connect_ |
Asynch_Connect used to make life easier :-). | |
int | pass_addresses_ |
Flag that indicates if parsing of addresses is necessary. | |
int | validate_new_connection_ |
Flag that indicates if address validation is required. |
Unlike the ACE_Connector, however, this class is designed to be used asynchronously with the ACE Proactor framework.
Definition at line 46 of file Asynch_Connector.h.
|
A do nothing constructor.
Definition at line 25 of file Asynch_Connector.cpp.
00026 : pass_addresses_ (0), 00027 validate_new_connection_ (0) 00028 { 00029 } |
|
Virtual destruction.
Definition at line 32 of file Asynch_Connector.cpp.
00033 {
00034 //this->asynch_connect_.close ();
00035 }
|
|
Return the asynch Connect object.
Definition at line 255 of file Asynch_Connector.cpp. References ACE_Asynch_Connector< HANDLER >::asynch_connect_.
00256 { 00257 return this->asynch_connect_; 00258 } |
|
This cancels all pending accepts operations that were issued by the calling thread.
Definition at line 178 of file Asynch_Connector.cpp. References ACE_Asynch_Connector< HANDLER >::asynch_connect_, and ACE_Asynch_Operation::cancel().
00179 { 00180 return this->asynch_connect_.cancel (); 00181 } |
|
This initiates a new asynchronous connect.
Definition at line 59 of file Asynch_Connector.cpp. References ACE_ERROR_RETURN, ACE_LIB_TEXT, ACE_Asynch_Connector< HANDLER >::asynch_connect_, ACE_Asynch_Connect::connect(), and LM_ERROR.
00063 { 00064 // Initiate asynchronous connect 00065 if (this->asynch_connect_.connect (ACE_INVALID_HANDLE, 00066 remote_sap, 00067 local_sap, 00068 reuse_addr, 00069 act) == -1) 00070 ACE_ERROR_RETURN ((LM_ERROR, 00071 ACE_LIB_TEXT ("%p\n"), 00072 ACE_LIB_TEXT ("ACE_Asynch_Connect::connect")), 00073 -1); 00074 return 0; 00075 } |
|
This is called when an outstanding accept completes.
Reimplemented from ACE_Handler. Definition at line 78 of file Asynch_Connector.cpp. References ACE_ERROR, ACE_LIB_TEXT, ACE_NONBLOCK, ACE_Asynch_Result::act(), ACE_OS::closesocket(), ACE_Asynch_Connect::Result::connect_handle(), ACE_Asynch_Result::error(), LM_ERROR, ACE_Asynch_Connector< HANDLER >::make_handler(), ACE_Asynch_Connector< HANDLER >::parse_address(), ACE_Asynch_Result::success(), and ACE_Asynch_Connector< HANDLER >::validate_connection().
00079 { 00080 // Variable for error tracking 00081 int error = 0; 00082 00083 // If the asynchronous connect fails. 00084 if (!result.success () || 00085 result.connect_handle () == ACE_INVALID_HANDLE) 00086 { 00087 error = 1; 00088 } 00089 00090 if (result.error () != 0) 00091 { 00092 error = 1; 00093 } 00094 00095 // set blocking mode 00096 if (!error && 00097 ACE::clr_flags 00098 (result.connect_handle (), ACE_NONBLOCK) != 0) 00099 { 00100 error = 1; 00101 ACE_ERROR ((LM_ERROR, 00102 ACE_LIB_TEXT ("%p\n"), 00103 ACE_LIB_TEXT ("ACE_Asynch_Connector::handle_connect : Set blocking mode"))); 00104 } 00105 00106 // Parse the addresses. 00107 ACE_INET_Addr local_address; 00108 ACE_INET_Addr remote_address; 00109 if (!error && 00110 (this->validate_new_connection_ || this->pass_addresses_)) 00111 this->parse_address (result, 00112 remote_address, 00113 local_address); 00114 00115 // Call validate_connection even if there was an error - it's the only 00116 // way the application can learn the connect disposition. 00117 if (this->validate_new_connection_ && 00118 this->validate_connection (result, remote_address, local_address) == -1) 00119 { 00120 error = 1; 00121 } 00122 00123 HANDLER *new_handler = 0; 00124 if (!error) 00125 { 00126 // The Template method 00127 new_handler = this->make_handler (); 00128 if (new_handler == 0) 00129 { 00130 error = 1; 00131 ACE_ERROR ((LM_ERROR, 00132 ACE_LIB_TEXT ("%p\n"), 00133 ACE_LIB_TEXT ("ACE_Asynch_Connector::handle_connect : Making of new handler failed"))); 00134 } 00135 } 00136 00137 // If no errors 00138 if (!error) 00139 { 00140 // Update the Proactor. 00141 new_handler->proactor (this->proactor ()); 00142 00143 // Pass the addresses 00144 if (this->pass_addresses_) 00145 new_handler->addresses (remote_address, 00146 local_address); 00147 00148 // Pass the ACT 00149 if (result.act () != 0) 00150 new_handler->act (result.act ()); 00151 00152 // Set up the handler's new handle value 00153 new_handler->handle (result.connect_handle ()); 00154 00155 ACE_Message_Block mb; 00156 00157 // Initiate the handler with empty message block; 00158 new_handler->open (result.connect_handle (), mb); 00159 } 00160 00161 // On failure, no choice but to close the socket 00162 if (error && 00163 result.connect_handle() != ACE_INVALID_HANDLE) 00164 ACE_OS::closesocket (result.connect_handle ()); 00165 } |
|
This is the template method used to create new handler. Subclasses must overwrite this method if a new handler creation strategy is required. Definition at line 261 of file Asynch_Connector.cpp. References ACE_NEW_RETURN. Referenced by ACE_Asynch_Connector< HANDLER >::handle_connect().
00262 { 00263 // Default behavior 00264 HANDLER *handler = 0; 00265 ACE_NEW_RETURN (handler, HANDLER, 0); 00266 return handler; 00267 } |
|
This opens asynch connector Definition at line 38 of file Asynch_Connector.cpp. References ACE_ERROR_RETURN, ACE_LIB_TEXT, ACE_Asynch_Connector< HANDLER >::asynch_connect_, LM_ERROR, ACE_Asynch_Connect::open(), and ACE_Handler::proactor().
00041 { 00042 this->proactor (proactor); 00043 this->pass_addresses_ = pass_addresses; 00044 this->validate_new_connection_ = validate_new_connection; 00045 00046 // Initialize the ACE_Asynch_Connect 00047 if (this->asynch_connect_.open (*this, 00048 ACE_INVALID_HANDLE, 00049 0, 00050 this->proactor ()) == -1) 00051 ACE_ERROR_RETURN ((LM_ERROR, 00052 ACE_LIB_TEXT ("%p\n"), 00053 ACE_LIB_TEXT ("ACE_Asynch_Connect::open")), 00054 -1); 00055 return 0; 00056 } |
|
This parses the address from read buffer.
Definition at line 184 of file Asynch_Connector.cpp. References ACE_DEBUG, ACE_ERROR, ACE_LIB_TEXT, ACE_INET_Addr::addr_to_string(), ACE_Asynch_Connect::Result::connect_handle(), ACE_OS::getpeername(), ACE_OS::getsockname(), LM_DEBUG, LM_ERROR, and ACE_INET_Addr::set(). Referenced by ACE_Asynch_Connector< HANDLER >::handle_connect().
00187 { 00188 #if defined (ACE_HAS_IPV6) 00189 // Getting the addresses. 00190 sockaddr_in6 local_addr; 00191 sockaddr_in6 remote_addr; 00192 #else 00193 // Getting the addresses. 00194 sockaddr_in local_addr; 00195 sockaddr_in remote_addr; 00196 #endif /* ACE_HAS_IPV6 */ 00197 00198 // Get the length. 00199 int local_size = sizeof (local_addr); 00200 int remote_size = sizeof (remote_addr); 00201 00202 // Get the local address. 00203 if (ACE_OS::getsockname (result.connect_handle (), 00204 reinterpret_cast<sockaddr *> (&local_addr), 00205 &local_size) < 0) 00206 ACE_ERROR ((LM_ERROR, 00207 ACE_LIB_TEXT("%p\n"), 00208 ACE_LIB_TEXT("ACE_Asynch_Connector::<getsockname> failed"))); 00209 00210 // Get the remote address. 00211 if (ACE_OS::getpeername (result.connect_handle (), 00212 reinterpret_cast<sockaddr *> (&remote_addr), 00213 &remote_size) < 0) 00214 ACE_ERROR ((LM_ERROR, 00215 ACE_LIB_TEXT("%p\n"), 00216 ACE_LIB_TEXT("ACE_Asynch_Connector::<getpeername> failed"))); 00217 00218 // Set the addresses. 00219 local_address.set (reinterpret_cast<sockaddr_in *> (&local_addr), 00220 local_size); 00221 remote_address.set (reinterpret_cast<sockaddr_in *> (&remote_addr), 00222 remote_size); 00223 00224 #if 0 00225 // @@ Just debugging. 00226 char local_address_buf [BUFSIZ]; 00227 char remote_address_buf [BUFSIZ]; 00228 00229 if (local_address.addr_to_string (local_address_buf, 00230 sizeof local_address_buf) == -1) 00231 ACE_ERROR ((LM_ERROR, 00232 "Error:%m:can't obtain local_address's address string")); 00233 00234 ACE_DEBUG ((LM_DEBUG, 00235 "ACE_Asynch_Connector<HANDLER>::parse_address : " 00236 "Local address %s\n", 00237 local_address_buf)); 00238 00239 if (remote_address.addr_to_string (remote_address_buf, 00240 sizeof remote_address_buf) == -1) 00241 ACE_ERROR ((LM_ERROR, 00242 "Error:%m:can't obtain remote_address's address string")); 00243 00244 ACE_DEBUG ((LM_DEBUG, 00245 "ACE_Asynch_Connector<HANDLER>::parse_address : " 00246 "Remote address %s\n", 00247 remote_address_buf)); 00248 #endif /* 0 */ 00249 00250 return; 00251 } |
|
Definition at line 276 of file Asynch_Connector.cpp.
00277 { 00278 this->pass_addresses_ = new_value; 00279 } |
|
Set and get flag that indicates if parsing and passing of addresses to the service_handler is necessary. Definition at line 270 of file Asynch_Connector.cpp.
00271 { 00272 return this->pass_addresses_; 00273 } |
|
Template method to validate peer before service is opened. This method is called when the connection attempt completes, whether it succeeded or failed, if the validate_connection argument to
Definition at line 169 of file Asynch_Connector.cpp. References ACE_INET_Addr. Referenced by ACE_Asynch_Connector< HANDLER >::handle_connect().
00172 { 00173 // Default implementation always validates the remote address. 00174 return 0; 00175 } |
|
Definition at line 288 of file Asynch_Connector.cpp.
00289 { 00290 this->validate_new_connection_ = new_value; 00291 } |
|
Set and get flag that indicates if address validation is required. Definition at line 282 of file Asynch_Connector.cpp.
00283 { 00284 return this->validate_new_connection_; 00285 } |
|
Asynch_Connect used to make life easier :-).
Definition at line 150 of file Asynch_Connector.h. Referenced by ACE_Asynch_Connector< HANDLER >::asynch_connect(), ACE_Asynch_Connector< HANDLER >::cancel(), ACE_Asynch_Connector< HANDLER >::connect(), and ACE_Asynch_Connector< HANDLER >::open(). |
|
Flag that indicates if parsing of addresses is necessary.
Definition at line 153 of file Asynch_Connector.h. |
|
Flag that indicates if address validation is required.
Definition at line 156 of file Asynch_Connector.h. |