#include <WIN32_Asynch_IO.h>
Inheritance diagram for ACE_WIN32_Asynch_Accept:
Public Member Functions | |
ACE_WIN32_Asynch_Accept (ACE_WIN32_Proactor *win32_proactor) | |
Constructor. | |
int | accept (ACE_Message_Block &message_block, size_t bytes_to_read, ACE_HANDLE accept_handle, const void *act, int priority, int signal_number=0, int addr_family=AF_INET) |
~ACE_WIN32_Asynch_Accept (void) | |
Destructor. | |
int | open (const ACE_Handler::Proxy_Ptr &handler_proxy, ACE_HANDLE handle, const void *completion_key, ACE_Proactor *proactor) |
int | cancel (void) |
ACE_Proactor * | proactor (void) const |
Return the underlying proactor. |
Once is called, multiple asynchronous s can started using this class. A ACE_Asynch_Accept::Result will be passed back to the when the asynchronous accept completes through the <ACE_Handler::handle_accept> callback.
Definition at line 1085 of file WIN32_Asynch_IO.h.
|
Constructor.
Definition at line 2028 of file WIN32_Asynch_IO.cpp.
02029 : ACE_Asynch_Operation_Impl (), 02030 ACE_Asynch_Accept_Impl (), 02031 ACE_WIN32_Asynch_Operation (win32_proactor) 02032 { 02033 } |
|
Destructor.
Definition at line 2160 of file WIN32_Asynch_IO.cpp.
02161 { 02162 } |
|
This starts off an asynchronous accept. The asynchronous accept call also allows any initial data to be returned to the . Upto will be read and stored in the . The will be used for the call. If ( == INVALID_HANDLE), a new handle will be created. must be specified. This is because the address of the new connection is placed at the end of this buffer. Implements ACE_Asynch_Accept_Impl. Definition at line 2036 of file WIN32_Asynch_IO.cpp. References ACE_WIN32_Asynch_Accept_Result::accept_handle(), ACE_DEBUG, ACE_ERROR_RETURN, ACE_LIB_TEXT, ACE_NEW_RETURN, ACE_NOTSUP_RETURN, ACE_OS::closesocket(), ACE::debug(), ACE_WIN32_Asynch_Accept_Result::listen_handle(), LM_ERROR, ACE_WIN32_Asynch_Accept_Result::message_block(), ACE_OS::set_errno_to_last_error(), ACE_OS::socket(), ACE_Message_Block::space(), and ACE_Message_Block::wr_ptr().
02043 { 02044 #if (defined (ACE_HAS_WINNT4) && (ACE_HAS_WINNT4 != 0)) || (defined (ACE_HAS_WINSOCK2) && (ACE_HAS_WINSOCK2 != 0)) 02045 // Sanity check: make sure that enough space has been allocated by 02046 // the caller. 02047 size_t address_size = 02048 #if defined (ACE_HAS_IPV6) 02049 addr_family == AF_INET ? sizeof (sockaddr_in) : sizeof (sockaddr_in6); 02050 #else 02051 sizeof (sockaddr_in); 02052 #endif /* ACE_HAS_IPV6 */ 02053 address_size += 16; // AcceptEx requires address size + 16 (minimum) 02054 size_t available_space = message_block.space (); 02055 size_t space_needed = bytes_to_read + 2 * address_size; 02056 if (available_space < space_needed) 02057 ACE_ERROR_RETURN ((LM_ERROR, ACE_LIB_TEXT ("Buffer too small\n")), -1); 02058 02059 // WIN Specific. 02060 02061 // AcceptEx API limits us to DWORD range. 02062 if (bytes_to_read > MAXDWORD) 02063 { 02064 errno = ERANGE; 02065 return -1; 02066 } 02067 DWORD dword_bytes_to_read = static_cast<DWORD> (bytes_to_read); 02068 02069 int close_accept_handle = 0; 02070 // If the <accept_handle> is invalid, we will create a new socket. 02071 if (accept_handle == ACE_INVALID_HANDLE) 02072 { 02073 accept_handle = ACE_OS::socket (addr_family, 02074 SOCK_STREAM, 02075 0); 02076 if (accept_handle == ACE_INVALID_HANDLE) 02077 { 02078 if (ACE::debug ()) 02079 { 02080 ACE_DEBUG ((LM_ERROR, 02081 ACE_LIB_TEXT ("%p\n"), 02082 ACE_LIB_TEXT ("ACE_OS::socket"))); 02083 } 02084 return -1; 02085 } 02086 else 02087 // Remember to close the socket down if failures occur. 02088 close_accept_handle = 1; 02089 } 02090 02091 // Common code for both WIN and POSIX. 02092 ACE_WIN32_Asynch_Accept_Result *result = 0; 02093 ACE_NEW_RETURN (result, 02094 ACE_WIN32_Asynch_Accept_Result (this->handler_proxy_, 02095 this->handle_, 02096 accept_handle, 02097 message_block, 02098 bytes_to_read, 02099 act, 02100 this->win32_proactor_->get_handle (), 02101 priority, 02102 signal_number), 02103 -1); 02104 02105 u_long bytes_read; 02106 02107 // Initiate the accept. 02108 int initiate_result = ::AcceptEx ((SOCKET) result->listen_handle (), 02109 (SOCKET) result->accept_handle (), 02110 result->message_block ().wr_ptr (), 02111 dword_bytes_to_read, 02112 static_cast<DWORD> (address_size), 02113 static_cast<DWORD> (address_size), 02114 &bytes_read, 02115 result); 02116 if (initiate_result == 1) 02117 // Immediate success: the OVERLAPPED will still get queued. 02118 return 1; 02119 02120 // If initiate failed, check for a bad error. 02121 ACE_OS::set_errno_to_last_error (); 02122 switch (errno) 02123 { 02124 case ERROR_IO_PENDING: 02125 // The IO will complete proactively: the OVERLAPPED will still 02126 // get queued. 02127 return 0; 02128 02129 default: 02130 // Something else went wrong: the OVERLAPPED will not get 02131 // queued. 02132 02133 if (close_accept_handle == 1) 02134 // Close the newly created socket 02135 ACE_OS::closesocket (accept_handle); 02136 02137 // Cleanup dynamically allocated Asynch_Result. 02138 delete result; 02139 02140 if (ACE::debug ()) 02141 { 02142 ACE_DEBUG ((LM_ERROR, 02143 ACE_LIB_TEXT ("%p\n"), 02144 ACE_LIB_TEXT ("AcceptEx"))); 02145 } 02146 return -1; 02147 } 02148 #else /* ACE_HAS_WINNT4 .......|| ACE_HAS_AIO_CALLS */ 02149 ACE_UNUSED_ARG (message_block); 02150 ACE_UNUSED_ARG (bytes_to_read); 02151 ACE_UNUSED_ARG (accept_handle); 02152 ACE_UNUSED_ARG (act); 02153 ACE_UNUSED_ARG (priority); 02154 ACE_UNUSED_ARG (signal_number); 02155 ACE_UNUSED_ARG (addr_family); 02156 ACE_NOTSUP_RETURN (-1); 02157 #endif /* (defined (ACE_HAS_WINNT4) && (ACE_HAS_WINNT4 != 0)) || (defined (ACE_HAS_WINSOCK2) && (ACE_HAS_WINSOCK2 != 0)) || (defined (ACE_HAS_AIO_CALLS) */ 02158 } |
|
This cancels all pending accepts operations that were issued by the calling thread. The function does not cancel asynchronous operations issued by other threads. Reimplemented from ACE_WIN32_Asynch_Operation. Definition at line 2181 of file WIN32_Asynch_IO.cpp. References ACE_WIN32_Asynch_Operation::cancel().
02182 { 02183 return ACE_WIN32_Asynch_Operation::cancel (); 02184 } |
|
Initializes the factory with information which will be used with each asynchronous call. If ( == ACE_INVALID_HANDLE), <ACE_Handler::handle> will be called on the to get the correct handle. Reimplemented from ACE_WIN32_Asynch_Operation. Definition at line 2169 of file WIN32_Asynch_IO.cpp. References ACE_WIN32_Asynch_Operation::open(), and ACE_Handler::Proxy_Ptr.
02173 { 02174 return ACE_WIN32_Asynch_Operation::open (handler_proxy, 02175 handle, 02176 completion_key, 02177 proactor); 02178 } |
|
Return the underlying proactor.
Reimplemented from ACE_WIN32_Asynch_Operation. Definition at line 2187 of file WIN32_Asynch_IO.cpp. References ACE_WIN32_Asynch_Operation::proactor().
02188 { 02189 return ACE_WIN32_Asynch_Operation::proactor (); 02190 } |