#include <ATM_Acceptor.h>
Public Types | |
typedef ACE_ATM_Addr | PEER_ADDR |
typedef ACE_ATM_Stream | PEER_STREAM |
Public Member Functions | |
ACE_ATM_Acceptor (void) | |
Default constructor. | |
~ACE_ATM_Acceptor () | |
ACE_ATM_Acceptor (const ACE_Addr &remote_sap, int backlog=ACE_DEFAULT_BACKLOG, ACE_ATM_Params params=ACE_ATM_Params()) | |
Initiate a passive mode connection. | |
ACE_HANDLE | open (const ACE_Addr &remote_sap, int backlog=ACE_DEFAULT_BACKLOG, ACE_ATM_Params params=ACE_ATM_Params()) |
Initiate a passive mode socket. | |
int | close (void) |
Close down the acceptor and release resources. | |
int | accept (ACE_ATM_Stream &new_sap, ACE_Addr *remote_addr=0, ACE_Time_Value *timeout=0, int restart=1, int reset_new_handle=0, ACE_ATM_Params params=ACE_ATM_Params(), ACE_ATM_QoS qos=ACE_ATM_QoS()) |
int | get_local_addr (ACE_ATM_Addr &local_addr) |
Get the local address currently listening on. | |
void | dump (void) const |
Dump the state of an object. | |
Public Attributes | |
ACE_ALLOC_HOOK_DECLARE | |
Declare the dynamic allocation hooks. | |
Private Attributes | |
ATM_Acceptor | acceptor_ |
This class wraps up the ACE_SOCK_Acceptor and ACE_TLI_Acceptor to make the mechanism for the ATM protocol transparent.
Definition at line 60 of file ATM_Acceptor.h.
|
Definition at line 100 of file ATM_Acceptor.h. |
|
Definition at line 101 of file ATM_Acceptor.h. |
|
Default constructor.
Definition at line 26 of file ATM_Acceptor.cpp. References ACE_TRACE.
00027 { 00028 ACE_TRACE ("ACE_ATM_Acceptor::ACE_ATM_Acceptor"); 00029 } |
|
Definition at line 31 of file ATM_Acceptor.cpp. References ACE_TRACE.
00032 { 00033 ACE_TRACE ("ACE_ATM_Acceptor::~ACE_ATM_Acceptor"); 00034 } |
|
Initiate a passive mode connection.
Definition at line 17 of file ATM_Acceptor.inl. References ACE_ERROR, ACE_LIB_TEXT, ACE_TRACE, LM_ERROR, and open().
|
|
Accept a new data transfer connection. A timeout of 0 means block forever, a timeout of {0, 0} means poll. restart == 1 means "restart if interrupted." Definition at line 236 of file ATM_Acceptor.cpp. References ACE_OS::accept(), acceptor_, ACE_TRACE, ATM_QoS, ACE_ATM_QoS::get_qos(), ACE_ATM_Params::get_rw_flag(), ACE_ATM_Stream::get_stream(), ACE_ATM_Params::get_user_data(), ACE_OS::printf(), and ACE_OS::setsockopt().
00243 { 00244 ACE_TRACE ("ACE_ATM_Acceptor::accept"); 00245 #if defined (ACE_HAS_FORE_ATM_XTI) 00246 ATM_QoS optbuf = qos.get_qos (); 00247 00248 return (acceptor_.accept (new_sap.get_stream (), 00249 remote_addr, 00250 timeout, 00251 restart, 00252 reset_new_handle, 00253 params.get_rw_flag (), 00254 params.get_user_data (), 00255 &optbuf)); 00256 #elif defined (ACE_HAS_FORE_ATM_WS2) 00257 ACE_HANDLE n_handle; 00258 ACE_HANDLE s_handle = ((ACE_SOCK_Acceptor *) this) -> get_handle (); 00259 struct sockaddr_atm *cli_addr 00260 = (struct sockaddr_atm *)remote_addr -> get_addr (); 00261 int caddr_len = sizeof (struct sockaddr_atm); 00262 00263 do { 00264 n_handle = ACE_OS::accept (s_handle, 00265 reinterpret_cast<struct sockaddr *> (cli_addr), 00266 &caddr_len); 00267 } while (n_handle == ACE_INVALID_HANDLE && errno == EINTR); 00268 00269 ((ACE_ATM_Addr *)remote_addr) -> set (cli_addr, 00270 ((ACE_ATM_Addr *)remote_addr) -> get_selector ()); 00271 ((ACE_IPC_SAP *)&new_sap) -> set_handle (n_handle); 00272 00273 return 0; 00274 #elif defined (ACE_HAS_LINUX_ATM) 00275 ACE_UNUSED_ARG (params); 00276 00277 ACE_HANDLE s_handle = ((ACE_SOCK_Acceptor *) this) -> get_handle (); 00278 struct atm_qos accept_qos = qos.get_qos (); 00279 00280 if (ACE_OS::setsockopt (s_handle, 00281 SOL_ATM, 00282 SO_ATMQOS, 00283 reinterpret_cast<char*> (&accept_qos), 00284 sizeof (accept_qos)) < 0) { 00285 ACE_OS::printf ("Acceptor (accept): error setting Qos"); 00286 } 00287 00288 return (acceptor_.accept (new_sap.get_stream (), 00289 remote_addr, 00290 timeout, 00291 restart, 00292 reset_new_handle)); 00293 #else 00294 ACE_UNUSED_ARG (new_sap); 00295 ACE_UNUSED_ARG (remote_addr); 00296 ACE_UNUSED_ARG (timeout); 00297 ACE_UNUSED_ARG (restart); 00298 ACE_UNUSED_ARG (reset_new_handle); 00299 ACE_UNUSED_ARG (params); 00300 ACE_UNUSED_ARG (qos); 00301 return (0); 00302 #endif /* ACE_HAS_FORE_ATM_XTI */ 00303 } |
|
Close down the acceptor and release resources.
Definition at line 32 of file ATM_Acceptor.inl. References acceptor_.
00033 { 00034 #if defined (ACE_HAS_FORE_ATM_XTI) || defined (ACE_HAS_FORE_ATM_WS2) || defined (ACE_HAS_LINUX_ATM) 00035 return (acceptor_.close()); 00036 #else 00037 return 0; 00038 #endif // ACE_HAS_FORE_ATM_XTI || ACE_HAS_FORE_ATM_WS2 || ACE_HAS_LINUX_ATM 00039 } |
|
Dump the state of an object.
Definition at line 9 of file ATM_Acceptor.inl. References ACE_TRACE.
00010 { 00011 #if defined (ACE_HAS_DUMP) 00012 ACE_TRACE ("ACE_ATM_Acceptor::dump"); 00013 #endif /* ACE_HAS_DUMP */ 00014 } |
|
Get the local address currently listening on.
Definition at line 37 of file ATM_Acceptor.cpp. References acceptor_, ACE_DEBUG, ACE_LIB_TEXT, ACE_TRACE, ATM_Addr, ACE_ATM_Addr::get_addr(), ACE_OS::getsockname(), LM_DEBUG, ACE_OS::memcpy(), and ACE_OS::printf().
00038 { 00039 ACE_TRACE ("ACE_ATM_Acceptor::get_local_addr"); 00040 00041 #if defined (ACE_HAS_FORE_ATM_WS2) 00042 unsigned long ret = 0; 00043 DWORD deviceID = 0; 00044 ATM_ADDRESS addr; 00045 struct sockaddr_atm *laddr; 00046 00047 if (::WSAIoctl ((int) ((ACE_SOCK_Acceptor *)this) -> get_handle (), 00048 SIO_GET_ATM_ADDRESS, 00049 (LPVOID) &deviceID, 00050 sizeof (DWORD), 00051 (LPVOID)&addr, 00052 sizeof (ATM_ADDRESS), 00053 &ret, 00054 0, 00055 0) == SOCKET_ERROR) { 00056 ACE_OS::printf ("ATM_Acceptor (get_local_addr): WSIoctl: %d\n", 00057 ::WSAGetLastError ()); 00058 return -1; 00059 } 00060 00061 laddr = (struct sockaddr_atm *)local_addr.get_addr (); 00062 ACE_OS::memcpy ((void *)& (laddr -> satm_number), 00063 (void *)&addr, 00064 ATM_ADDR_SIZE - 1); 00065 00066 return 0; 00067 #elif defined (ACE_HAS_FORE_ATM_XTI) 00068 ACE_UNUSED_ARG (local_addr); 00069 00070 return 0; 00071 #elif defined (ACE_HAS_LINUX_ATM) 00072 ATM_Addr *myaddr = (ATM_Addr *)local_addr.get_addr (); 00073 int addrlen = sizeof (myaddr->sockaddratmsvc); 00074 00075 if (ACE_OS::getsockname (acceptor_.get_handle (), 00076 (struct sockaddr *) & (myaddr->sockaddratmsvc), 00077 &addrlen) < 0) { 00078 ACE_DEBUG ((LM_DEBUG, 00079 ACE_LIB_TEXT ("ATM_Acceptor (get_local_addr): ioctl: %d\n"), 00080 errno)); 00081 return -1; 00082 } 00083 00084 return (0); 00085 #else 00086 ACE_UNUSED_ARG (local_addr); 00087 00088 return 0; 00089 #endif /* ACE_HAS_FORE_ATM_WS2 && ACE_HAS_FORE_ATM_XTI */ 00090 } |
|
Initiate a passive mode socket.
Definition at line 93 of file ATM_Acceptor.cpp. References acceptor_, ACE_DEBUG, ACE_FLAG_MULTIPOINT_C_LEAF, ACE_FLAG_MULTIPOINT_D_LEAF, ACE_LIB_TEXT, ACE_TRACE, ATM_Addr, ATM_QoS, ACE_OS::bind(), ACE_ATM_Addr::get_addr(), ACE_ATM_Params::get_device(), ACE_ATM_Params::get_flags(), ACE_ATM_Params::get_info(), ACE_ATM_Params::get_oflag(), ACE_ATM_Params::get_protocol(), ACE_ATM_Params::get_protocol_family(), ACE_ATM_Params::get_protocol_info(), ACE_ATM_QoS::get_qos(), ACE_ATM_Params::get_reuse_addr(), ACE_ATM_Params::get_sock_group(), ACE_ATM_Params::get_type(), ACE_OS::ioctl(), ACE_OS::listen(), LM_DEBUG, ACE_OS::memset(), ACE_OS::perror(), ACE_OS::printf(), ACE_ATM_Addr::set_selector(), ACE_OS::setsockopt(), and ACE_OS::socket(). Referenced by ACE_ATM_Acceptor().
00096 { 00097 ACE_TRACE ("ACE_ATM_Acceptor::open"); 00098 #if defined (ACE_HAS_FORE_ATM_XTI) 00099 ACE_HANDLE handle = acceptor_.open (remote_sap, 00100 params.get_reuse_addr (), 00101 params.get_oflag (), 00102 params.get_info (), 00103 backlog, 00104 params.get_device ()); 00105 return (handle == ACE_INVALID_HANDLE ? -1 : 0); 00106 #elif defined (ACE_HAS_FORE_ATM_WS2) 00107 struct sockaddr_atm local_atm_addr; 00108 ACE_HANDLE ret; 00109 DWORD flags = 0; 00110 00111 /* Create a local endpoint of communication */ 00112 00113 // Only leaves can listen. 00114 flags = ACE_FLAG_MULTIPOINT_C_LEAF | ACE_FLAG_MULTIPOINT_D_LEAF; 00115 00116 if ((ret = ACE_OS::socket (AF_ATM, 00117 SOCK_RAW, 00118 ATMPROTO_AAL5, 00119 0, 00120 0, 00121 flags)) 00122 == ACE_INVALID_HANDLE) { 00123 ACE_OS::printf ("Acceptor (open): socket %d\n", 00124 ::WSAGetLastError ()); 00125 return (ret); 00126 } 00127 00128 ((ACE_SOCK_Acceptor *)this) -> set_handle (ret); 00129 00130 /* Set up the address information to become a server */ 00131 ACE_OS::memset ((void *) &local_atm_addr, 0, sizeof local_atm_addr); 00132 local_atm_addr.satm_family = AF_ATM; 00133 local_atm_addr.satm_number.AddressType = SAP_FIELD_ANY_AESA_REST; 00134 local_atm_addr.satm_number.Addr[ ATM_ADDR_SIZE - 1 ] 00135 = ((ACE_ATM_Addr *)&remote_sap) -> get_selector (); 00136 local_atm_addr.satm_blli.Layer2Protocol = SAP_FIELD_ANY; 00137 local_atm_addr.satm_blli.Layer3Protocol = SAP_FIELD_ABSENT; 00138 local_atm_addr.satm_bhli.HighLayerInfoType = SAP_FIELD_ABSENT; 00139 00140 /* Associate address with endpoint */ 00141 if (ACE_OS::bind (((ACE_SOCK_Acceptor *)this) -> get_handle (), 00142 reinterpret_cast<struct sockaddr *> (&local_atm_addr), 00143 sizeof local_atm_addr) == -1) { 00144 ACE_OS::printf ("Acceptor (open): bind %d\n", ::WSAGetLastError ()); 00145 return (ACE_INVALID_HANDLE); 00146 } 00147 00148 /* Make endpoint listen for service requests */ 00149 if (ACE_OS::listen (( (ACE_SOCK_Acceptor *)this) -> get_handle (), 00150 backlog) 00151 == -1) { 00152 ACE_OS::printf ("Acceptor (open): listen %d\n", ::WSAGetLastError ()); 00153 return (ACE_INVALID_HANDLE); 00154 } 00155 00156 return 0; 00157 #elif defined (ACE_HAS_LINUX_ATM) 00158 //we need to set the qos before binding to the socket 00159 //use remote_sap as local_sap 00160 00161 ACE_ATM_Addr local_sap; 00162 ATM_Addr *local_sap_addr = (ATM_Addr*)local_sap.get_addr (); 00163 ACE_ATM_QoS def_qos; 00164 ATM_QoS qos = def_qos.get_qos (); 00165 00166 ACE_HANDLE handle; 00167 if ((handle = ACE_OS::socket (params.get_protocol_family (), 00168 params.get_type (), 00169 params.get_protocol (), 00170 params.get_protocol_info (), 00171 params.get_sock_group (), 00172 params.get_flags () 00173 )) 00174 == ACE_INVALID_HANDLE) { 00175 ACE_DEBUG (LM_DEBUG, 00176 ACE_LIB_TEXT ("Acceptor (socket): socket %d\n"), 00177 errno); 00178 return (ACE_INVALID_HANDLE); 00179 } 00180 00181 ((ACE_SOCK_Acceptor *)this) -> set_handle (handle); 00182 if (ACE_OS::setsockopt (handle, 00183 SOL_ATM, 00184 SO_ATMQOS, 00185 reinterpret_cast<char*> (&qos), 00186 sizeof (qos)) < 0) { 00187 ACE_OS::printf ("Acceptor (setsockopt): setsockopt:%d\n", 00188 errno); 00189 } 00190 00191 struct atmif_sioc req; 00192 struct sockaddr_atmsvc aux_addr[1024]; 00193 00194 req.number = 0; 00195 req.arg = aux_addr; 00196 req.length = sizeof (aux_addr); 00197 if (ACE_OS::ioctl (handle, 00198 ATM_GETADDR, 00199 &req) < 0) { 00200 ACE_OS::perror ("Acceptor (setsockopt): ioctl:"); 00201 } 00202 else { 00203 local_sap_addr->sockaddratmsvc = aux_addr[0]; 00204 } 00205 local_sap.set_selector (( (ACE_ATM_Addr*)&remote_sap)->get_selector ()); 00206 00207 if (ACE_OS::bind (handle, 00208 reinterpret_cast<struct sockaddr *> ( 00209 &(local_sap_addr->sockaddratmsvc)), 00210 sizeof (local_sap_addr->sockaddratmsvc) 00211 ) == -1) { 00212 ACE_DEBUG (LM_DEBUG, 00213 ACE_LIB_TEXT ("Acceptor (open): bind %d\n"), 00214 errno); 00215 return -1; 00216 } 00217 // Make endpoint listen for service requests 00218 if (ACE_OS::listen (handle, 00219 backlog) 00220 == -1) { 00221 ACE_DEBUG (LM_DEBUG, 00222 ACE_LIB_TEXT ("Acceptor (listen): listen %d\n"), 00223 errno); 00224 return -1; 00225 } 00226 00227 return 0; 00228 #else 00229 ACE_UNUSED_ARG (remote_sap); 00230 ACE_UNUSED_ARG (backlog); 00231 ACE_UNUSED_ARG (params); 00232 #endif /* ACE_HAS_FORE_ATM_XTI/ACE_HAS_FORE_ATM_WS2/ACE_HAS_LINUX_ATM */ 00233 } |
|
Definition at line 110 of file ATM_Acceptor.h. Referenced by accept(), close(), get_local_addr(), and open(). |
|
Declare the dynamic allocation hooks.
Definition at line 107 of file ATM_Acceptor.h. |