TAO_DIOP_Acceptor Class Reference

TAO_DIOP_Acceptor. More...

#include <DIOP_Acceptor.h>

Inheritance diagram for TAO_DIOP_Acceptor:

Inheritance graph
[legend]
Collaboration diagram for TAO_DIOP_Acceptor:

Collaboration graph
[legend]
List of all members.

Public Member Functions

 TAO_DIOP_Acceptor (void)
 Constructor.
 ~TAO_DIOP_Acceptor (void)
 Destructor.
const ACE_INET_Addraddress (void) const
const ACE_INET_Addrendpoints (void)
 Returns the array of endpoints in this acceptor.
const ACE_INET_Addrdefault_address (void) const
 Returns address for default endpoint.
void set_default_address (const ACE_INET_Addr &addr)
 Set address for default endpoint.
virtual int hostname (TAO_ORB_Core *orb_core, ACE_INET_Addr &addr, char *&host, const char *specified_hostname=0)
int dotted_decimal_address (ACE_INET_Addr &addr, char *&host)
The TAO_Acceptor Methods
Please check the documentation in Transport_Acceptor.h for details.

virtual int open (TAO_ORB_Core *orb_core, ACE_Reactor *reactor, int version_major, int version_minor, const char *address, const char *options=0)
virtual int open_default (TAO_ORB_Core *orb_core, ACE_Reactor *reactor, int version_major, int version_minor, const char *options=0)
virtual int close (void)
virtual int create_profile (const TAO::ObjectKey &object_key, TAO_MProfile &mprofile, CORBA::Short priority)
virtual int is_collocated (const TAO_Endpoint *endpoint)
virtual CORBA::ULong endpoint_count (void)
virtual int object_key (IOP::TaggedProfile &profile, TAO::ObjectKey &key)

Protected Member Functions

int parse_address (const char *address, ACE_INET_Addr &addr, ACE_CString &specified_hostname, int *def_type=0)
virtual int open_i (const ACE_INET_Addr &addr, ACE_Reactor *reactor)
int probe_interfaces (TAO_ORB_Core *orb_core, int def_type=AF_UNSPEC)
virtual int parse_options (const char *options)
 Parse protocol specific options.
int create_new_profile (const TAO::ObjectKey &object_key, TAO_MProfile &mprofile, CORBA::Short priority)
int create_shared_profile (const TAO::ObjectKey &object_key, TAO_MProfile &mprofile, CORBA::Short priority)

Protected Attributes

ACE_INET_Addraddrs_
char ** hosts_
CORBA::ULong endpoint_count_
TAO_GIOP_Message_Version version_
TAO_ORB_Coreorb_core_
 ORB Core.
ACE_INET_Addr default_address_
 Address for default endpoint.

Private Attributes

TAO_DIOP_Connection_Handlerconnection_handler_

Detailed Description

TAO_DIOP_Acceptor.

The DIOP-specific bridge class for the concrete acceptor.

Definition at line 46 of file DIOP_Acceptor.h.


Constructor & Destructor Documentation

TAO_BEGIN_VERSIONED_NAMESPACE_DECL TAO_DIOP_Acceptor::TAO_DIOP_Acceptor ( void   ) 

Constructor.

Definition at line 31 of file DIOP_Acceptor.cpp.

00032   : TAO_Acceptor (TAO_TAG_DIOP_PROFILE),
00033     addrs_ (0),
00034     hosts_ (0),
00035     endpoint_count_ (0),
00036     version_ (TAO_DEF_GIOP_MAJOR, TAO_DEF_GIOP_MINOR),
00037     orb_core_ (0),
00038 #if defined (ACE_HAS_IPV6)
00039     default_address_ (static_cast<unsigned short> (0), ACE_IPV6_ANY, AF_INET6),
00040 #else
00041     default_address_ (static_cast<unsigned short> (0), static_cast<ACE_UINT32> (INADDR_ANY)),
00042 #endif /* ACE_HAS_IPV6 */
00043     connection_handler_ (0)
00044 {
00045 }

TAO_DIOP_Acceptor::~TAO_DIOP_Acceptor ( void   ) 

Destructor.

Definition at line 47 of file DIOP_Acceptor.cpp.

References close(), and CORBA::string_free().

00048 {
00049   // Make sure we are closed before we start destroying the
00050   // strategies.
00051   this->close ();
00052 
00053   delete [] this->addrs_;
00054 
00055   for (CORBA::ULong i = 0; i < this->endpoint_count_; ++i)
00056     CORBA::string_free (this->hosts_[i]);
00057 
00058   delete [] this->hosts_;
00059 }


Member Function Documentation

TAO_BEGIN_VERSIONED_NAMESPACE_DECL ACE_INLINE const ACE_INET_Addr & TAO_DIOP_Acceptor::address ( void   )  const

@ Helper method for the implementation repository, should go away

Definition at line 8 of file DIOP_Acceptor.inl.

References ACE_ASSERT, and addrs_.

Referenced by open_i().

00009 {
00010   ACE_ASSERT (this->addrs_ != 0);
00011 
00012   // @@ This is busted.
00013   //    The Implementation Repository will have to start supporting
00014   //    IORs with multiple profiles.  For now, we just return the
00015   //    first addr.
00016   //                    -Ossama
00017   return this->addrs_[0];
00018 }

int TAO_DIOP_Acceptor::close ( void   )  [virtual]

Implements TAO_Acceptor.

Definition at line 240 of file DIOP_Acceptor.cpp.

Referenced by ~TAO_DIOP_Acceptor().

00241 {
00242   return 0;
00243 }

int TAO_DIOP_Acceptor::create_new_profile ( const TAO::ObjectKey &  object_key,
TAO_MProfile mprofile,
CORBA::Short  priority 
) [protected]

Helper method to add a new profile to the mprofile for each endpoint.

Definition at line 83 of file DIOP_Acceptor.cpp.

References TAO_Profile::_decr_refcnt(), ACE_NEW_RETURN, TAO_DIOP_Profile::endpoint(), TAO_MProfile::give_profile(), TAO_MProfile::grow(), TAO_Endpoint::priority(), TAO_MProfile::profile_count(), TAO_Codeset_Manager::set_codeset(), TAO_Tagged_Components::set_orb_type(), TAO_MProfile::size(), ACE_OS::strcmp(), TAO_Profile::tagged_components(), TAO_ORB_TYPE, and version_.

00086 {
00087   // Adding this->endpoint_count_ to the TAO_MProfile.
00088   int count = mprofile.profile_count ();
00089   if ((mprofile.size () - count) < this->endpoint_count_
00090       && mprofile.grow (count + this->endpoint_count_) == -1)
00091     return -1;
00092 
00093   // Create a profile for each acceptor endpoint.
00094   for (CORBA::ULong i = 0; i < this->endpoint_count_; ++i)
00095     {
00096       // Skip if the host name
00097       if (i > 0
00098           && (this->addrs_[i].get_port_number () == this->addrs_[0].get_port_number ())
00099           && ACE_OS::strcmp (this->hosts_[i], this->hosts_[0]) == 0)
00100         continue;
00101 
00102       TAO_DIOP_Profile *pfile = 0;
00103       ACE_NEW_RETURN (pfile,
00104                       TAO_DIOP_Profile (this->hosts_[i],
00105                                         this->addrs_[i].get_port_number (),
00106                                         object_key,
00107                                         this->addrs_[i],
00108                                         this->version_,
00109                                         this->orb_core_),
00110                       -1);
00111       pfile->endpoint ()->priority (priority);
00112 
00113       if (mprofile.give_profile (pfile) == -1)
00114         {
00115           pfile->_decr_refcnt ();
00116           pfile = 0;
00117           return -1;
00118         }
00119 
00120       // Do not add any tagged components to the profile if configured
00121       // by the user not to do so, or if an IIOP 1.0 endpoint is being
00122       // created (IIOP 1.0 did not support tagged components).
00123       if (this->orb_core_->orb_params ()->std_profile_components () == 0
00124           || (this->version_.major == 1 && this->version_.minor == 0))
00125         continue;
00126 
00127       pfile->tagged_components ().set_orb_type (TAO_ORB_TYPE);
00128 
00129       TAO_Codeset_Manager *csm = this->orb_core_->codeset_manager ();
00130       if (csm)
00131         csm->set_codeset (pfile->tagged_components ());
00132     }
00133 
00134   return 0;
00135 }

int TAO_DIOP_Acceptor::create_profile ( const TAO::ObjectKey &  object_key,
TAO_MProfile mprofile,
CORBA::Short  priority 
) [virtual]

Implements TAO_Acceptor.

Definition at line 65 of file DIOP_Acceptor.cpp.

References create_shared_profile(), and TAO_INVALID_PRIORITY.

00068 {
00069   // Sanity check.
00070   if (this->endpoint_count_ == 0)
00071     return -1;
00072 
00073   // Check if multiple endpoints should be put in one profile or if
00074   // they should be spread across multiple profiles.
00075   if (priority == TAO_INVALID_PRIORITY &&
00076       this->orb_core_->orb_params ()->shared_profile () == 0)
00077     return this->create_new_profile (object_key, mprofile, priority);
00078   else
00079     return this->create_shared_profile (object_key, mprofile, priority);
00080 }

int TAO_DIOP_Acceptor::create_shared_profile ( const TAO::ObjectKey &  object_key,
TAO_MProfile mprofile,
CORBA::Short  priority 
) [protected]

Helper method to create a profile that contains all of our endpoints.

Definition at line 138 of file DIOP_Acceptor.cpp.

References TAO_Profile::_decr_refcnt(), ACE_NEW_RETURN, TAO_DIOP_Profile::add_endpoint(), TAO_DIOP_Profile::endpoint(), TAO_MProfile::get_profile(), TAO_MProfile::give_profile(), TAO_Endpoint::priority(), TAO_MProfile::profile_count(), TAO_Codeset_Manager::set_codeset(), TAO_Tagged_Components::set_orb_type(), ACE_OS::strcmp(), TAO_Profile::tag(), TAO_Profile::tagged_components(), TAO_ORB_TYPE, and version_.

Referenced by create_profile().

00141 {
00142   CORBA::ULong index = 0;
00143   TAO_Profile *pfile = 0;
00144   TAO_DIOP_Profile *diop_profile = 0;
00145 
00146   // First see if <mprofile> already contains a DIOP profile.
00147   for (TAO_PHandle i = 0; i != mprofile.profile_count (); ++i)
00148     {
00149       pfile = mprofile.get_profile (i);
00150       if (pfile->tag () == TAO_TAG_DIOP_PROFILE)
00151       {
00152         diop_profile = dynamic_cast<TAO_DIOP_Profile *> (pfile);
00153         break;
00154       }
00155     }
00156 
00157   // If <mprofile> doesn't contain a DIOP_Profile, we need to create
00158   // one.
00159   if (diop_profile == 0)
00160     {
00161       ACE_NEW_RETURN (diop_profile,
00162                       TAO_DIOP_Profile (this->hosts_[0],
00163                                         this->addrs_[0].get_port_number (),
00164                                         object_key,
00165                                         this->addrs_[0],
00166                                         this->version_,
00167                                         this->orb_core_),
00168                       -1);
00169       diop_profile->endpoint ()->priority (priority);
00170 
00171       if (mprofile.give_profile (diop_profile) == -1)
00172         {
00173           diop_profile->_decr_refcnt ();
00174           diop_profile = 0;
00175           return -1;
00176         }
00177 
00178       if (this->orb_core_->orb_params ()->std_profile_components () != 0
00179           && (this->version_.major >= 1 && this->version_.minor >= 1))
00180         {
00181           diop_profile->tagged_components ().set_orb_type (TAO_ORB_TYPE);
00182           TAO_Codeset_Manager *csm = this->orb_core_->codeset_manager ();
00183           if (csm)
00184             csm->set_codeset (pfile->tagged_components ());
00185         }
00186 
00187       index = 1;
00188     }
00189 
00190   // Add any remaining acceptor endpoints to the DIOP_Profile.
00191   for (;
00192        index < this->endpoint_count_;
00193        ++index)
00194     {
00195       if (index > 0 &&
00196           this->addrs_[index].get_port_number () == this->addrs_[0].get_port_number () &&
00197           ACE_OS::strcmp (this->hosts_[index], this->hosts_[0]) == 0)
00198         continue;
00199 
00200       TAO_DIOP_Endpoint *endpoint = 0;
00201       ACE_NEW_RETURN (endpoint,
00202                       TAO_DIOP_Endpoint (this->hosts_[index],
00203                                          this->addrs_[index].get_port_number (),
00204                                          this->addrs_[index]),
00205                       -1);
00206       endpoint->priority (priority);
00207       diop_profile->add_endpoint (endpoint);
00208     }
00209 
00210   return 0;
00211 }

ACE_INLINE const ACE_INET_Addr & TAO_DIOP_Acceptor::default_address ( void   )  const

Returns address for default endpoint.

Definition at line 29 of file DIOP_Acceptor.inl.

References default_address_.

00030 {
00031   return this->default_address_;
00032 }

int TAO_DIOP_Acceptor::dotted_decimal_address ( ACE_INET_Addr addr,
char *&  host 
)

Set the host name for the given address using the dotted decimal format.

Definition at line 652 of file DIOP_Acceptor.cpp.

References ACE_DEBUG, ACE_TEXT, ACE_INET_Addr::get_host_addr(), ACE_INET_Addr::get_host_name(), ACE_INET_Addr::get_port_number(), ACE_Addr::get_type(), ACE_INET_Addr::is_any(), LM_DEBUG, CORBA::string_dup(), and TAO_debug_level.

00654 {
00655   int result = 0;
00656   const char *tmp = 0;
00657 
00658   // If the IP address in the INET_Addr is the IN(6)ADDR_ANY address,
00659   // then force the actual IP address to be used by initializing a new
00660   // INET_Addr with the hostname from the original one.  If that fails
00661   // then something is seriously wrong with the systems networking
00662   // setup.
00663   if (addr.is_any ())
00664     {
00665       ACE_INET_Addr new_addr;
00666 #if defined (ACE_HAS_IPV6)
00667       result = new_addr.set (addr.get_port_number (),
00668                              addr.get_host_name (),
00669                              1, /* encode */
00670                              addr.get_type ());
00671 #else /* ACE_HAS_IPV6 */
00672       result = new_addr.set (addr.get_port_number (),
00673                              addr.get_host_name ());
00674 #endif /* !ACE_HAS_IPV6 */
00675       tmp = new_addr.get_host_addr ();
00676     }
00677   else
00678     tmp = addr.get_host_addr ();
00679 
00680   if (tmp == 0 || result != 0)
00681     {
00682       if (TAO_debug_level > 0)
00683         ACE_DEBUG ((LM_DEBUG,
00684                     ACE_TEXT ("TAO (%P|%t) - ")
00685                     ACE_TEXT ("DIOP_Acceptor::dotted_decimal_address, ")
00686                     ACE_TEXT ("%p\n\n"),
00687                     ACE_TEXT ("cannot determine hostname")));
00688       return -1;
00689     }
00690 
00691   host = CORBA::string_dup (tmp);
00692   return 0;
00693 }

CORBA::ULong TAO_DIOP_Acceptor::endpoint_count ( void   )  [virtual]

Implements TAO_Acceptor.

Definition at line 905 of file DIOP_Acceptor.cpp.

00906 {
00907   return this->endpoint_count_;
00908 }

ACE_INLINE const ACE_INET_Addr * TAO_DIOP_Acceptor::endpoints ( void   ) 

Returns the array of endpoints in this acceptor.

Definition at line 21 of file DIOP_Acceptor.inl.

References ACE_ASSERT, and addrs_.

00022 {
00023   ACE_ASSERT (this->addrs_ != 0);
00024 
00025   return this->addrs_;
00026 }

int TAO_DIOP_Acceptor::hostname ( TAO_ORB_Core orb_core,
ACE_INET_Addr addr,
char *&  host,
const char *  specified_hostname = 0 
) [virtual]

Set the host name for the given addr. A hostname may be forced by using specified_hostname. This is useful if the given address corresponds to more than one hostname and the desired one cannot be determined in any other way.

Definition at line 469 of file DIOP_Acceptor.cpp.

References ACE_INET_Addr::get_host_name(), MAXHOSTNAMELEN, TAO_ORB_Core::orb_params(), CORBA::string_dup(), and TAO_ORB_Parameters::use_dotted_decimal_addresses().

00473 {
00474   if (orb_core->orb_params ()->use_dotted_decimal_addresses ())
00475     {
00476       // If dotted decimal addresses are enabled,
00477       // just return ours.
00478       return this->dotted_decimal_address (addr, host);
00479     }
00480   else if (specified_hostname != 0)
00481     {
00482       // If the user specified a hostname, pass it back
00483       // blindly as it overrides our choice of hostname.
00484       host = CORBA::string_dup (specified_hostname);
00485     }
00486   else
00487     {
00488       char tmp_host[MAXHOSTNAMELEN + 1];
00489 
00490       // Get the hostname associated with our address
00491 #if defined (ACE_HAS_IPV6)
00492       // If we have a IPv4-compatible IPv6 address don't do hostname lookup
00493       // because that gets us into trouble. Most likely we get the same hostname
00494       // returned as for the actual IPv4 address but resolving that into an IPv6
00495       // address at the client will fail.
00496       if (addr.is_ipv4_compat_ipv6 () ||
00497           addr.get_host_name (tmp_host, sizeof (tmp_host)) != 0)
00498 #else /* ACE_HAS_IPV6 */
00499       if (addr.get_host_name (tmp_host, sizeof (tmp_host)) != 0)
00500 #endif /* !ACE_HAS_IPV6 */
00501         {
00502           // On failure, just return the decimal address.
00503           return this->dotted_decimal_address (addr, host);
00504         }
00505       else
00506         {
00507           host = CORBA::string_dup (tmp_host);
00508         }
00509     }
00510 
00511   return 0;
00512 }

int TAO_DIOP_Acceptor::is_collocated ( const TAO_Endpoint endpoint  )  [virtual]

Implements TAO_Acceptor.

Definition at line 214 of file DIOP_Acceptor.cpp.

References TAO_DIOP_Endpoint::host(), TAO_DIOP_Endpoint::port(), and ACE_OS::strcmp().

00215 {
00216   const TAO_DIOP_Endpoint *endp =
00217     dynamic_cast<const TAO_DIOP_Endpoint *> (endpoint);
00218 
00219   // Make sure the dynamically cast pointer is valid.
00220   if (endp == 0)
00221     return 0;
00222 
00223   for (CORBA::ULong i = 0; i < this->endpoint_count_; ++i)
00224     {
00225       // compare the port and host name.  Please do *NOT* optimize
00226       // this code by comparing the IP address instead.  That would
00227       // trigger the following bug:
00228       //
00229       // http://deuce.doc.wustl.edu/bugzilla/show_bug.cgi?id=1220
00230       //
00231       if (endp->port () == this->addrs_[i].get_port_number ()
00232           && ACE_OS::strcmp (endp->host (), this->hosts_[i]) == 0)
00233         return 1;  // Collocated
00234     }
00235 
00236   return 0;  // Not collocated
00237 }

int TAO_DIOP_Acceptor::object_key ( IOP::TaggedProfile &  profile,
TAO::ObjectKey &  key 
) [virtual]

Implements TAO_Acceptor.

Definition at line 911 of file DIOP_Acceptor.cpp.

References ACE_DEBUG, ACE_TEXT, LM_DEBUG, and TAO_debug_level.

00913 {
00914   // Create the decoding stream from the encapsulation in the buffer,
00915 #if (TAO_NO_COPY_OCTET_SEQUENCES == 1)
00916   TAO_InputCDR cdr (profile.profile_data.mb ());
00917 #else
00918   TAO_InputCDR cdr (reinterpret_cast<char*> (profile.profile_data.get_buffer ()),
00919                     profile.profile_data.length ());
00920 #endif /* TAO_NO_COPY_OCTET_SEQUENCES == 1 */
00921 
00922   CORBA::Octet major;
00923   CORBA::Octet minor = CORBA::Octet();
00924 
00925   // Read the version. We just read it here. We don't*do any*
00926   // processing.
00927   if (!(cdr.read_octet (major)
00928         && cdr.read_octet (minor)))
00929   {
00930     if (TAO_debug_level > 0)
00931       {
00932         ACE_DEBUG ((LM_DEBUG,
00933                     ACE_TEXT ("TAO (%P|%t) - DIOP_Profile::object_key, v%d.%d\n"),
00934                     major,
00935                     minor));
00936       }
00937     return -1;
00938   }
00939 
00940   CORBA::String_var host;
00941   CORBA::UShort port = 0;
00942 
00943   // Get host and port. No processing here too..
00944   if (cdr.read_string (host.out ()) == 0
00945       || cdr.read_ushort (port) == 0)
00946     {
00947       if (TAO_debug_level > 0)
00948         {
00949           ACE_DEBUG ((LM_DEBUG,
00950                       ACE_TEXT ("TAO (%P|%t) - DIOP_Acceptor::object_key, ")
00951                       ACE_TEXT ("error while decoding host/port")));
00952         }
00953       return -1;
00954     }
00955 
00956   // ... and object key.
00957   if ((cdr >> object_key) == 0)
00958     return -1;
00959 
00960   // We are NOT bothered about the rest.
00961 
00962   return 1;
00963 }

int TAO_DIOP_Acceptor::open ( TAO_ORB_Core orb_core,
ACE_Reactor reactor,
int  version_major,
int  version_minor,
const char *  address,
const char *  options = 0 
) [virtual]

Implements TAO_Acceptor.

Definition at line 246 of file DIOP_Acceptor.cpp.

References ACE_DEBUG, ACE_ERROR_RETURN, ACE_NEW_RETURN, ACE_TEXT, AF_UNSPEC, ACE_String_Base< CHAR >::c_str(), ACE_INET_Addr::get_port_number(), ACE_Addr::get_type(), ACE_String_Base< CHAR >::length(), LM_DEBUG, LM_ERROR, open_i(), ACE_INET_Addr::set(), TAO_GIOP_Message_Version::set_version(), TAO_debug_level, and version_.

00252 {
00253   this->orb_core_ = orb_core;
00254 
00255   if (this->hosts_ != 0)
00256     {
00257       // The hostname cache has already been set!
00258       // This is bad mojo, i.e. an internal TAO error.
00259       ACE_ERROR_RETURN ((LM_ERROR,
00260                          ACE_TEXT ("TAO (%P|%t) - ")
00261                          ACE_TEXT ("DIOP_Acceptor::open, ")
00262                          ACE_TEXT ("hostname already set\n\n")),
00263                         -1);
00264     }
00265 
00266   if (address == 0)
00267     return -1;
00268 
00269   if (major >=0 && minor >= 0)
00270     this->version_.set_version (static_cast<CORBA::Octet> (major),
00271                                 static_cast<CORBA::Octet> (minor));
00272   // Parse options
00273   if (this->parse_options (options) == -1)
00274     return -1;
00275 
00276   ACE_CString specified_hostname;
00277   ACE_INET_Addr addr;
00278   int def_type = AF_UNSPEC;
00279 
00280   if (this->parse_address (address,
00281                            addr,
00282                            specified_hostname,
00283                            &def_type) == -1)
00284     return -1;
00285 
00286   if (specified_hostname.length () == 0)
00287     {
00288       // The address is a port number or port name.  No hostname was
00289       // specified.  The hostname for each network interface and the
00290       // fully qualified domain name must be obtained.
00291 
00292       // Check for multiple network interfaces.
00293       if (this->probe_interfaces (orb_core, def_type) == -1)
00294         return -1;
00295 
00296       // Probe interfaces has a side effect of potentially modifying
00297       // the default address, since that is where the address family
00298       // is considered.
00299       addr.set (this->default_address_);
00300 
00301       return this->open_i (addr,
00302                            reactor);
00303     }
00304 
00305 #if defined (ACE_HAS_IPV6)
00306   // Check for violation of ORBConnectIPV6Only option
00307   if (this->orb_core_->orb_params ()->connect_ipv6_only () &&
00308       (addr.get_type () != AF_INET6 ||
00309        addr.is_ipv4_mapped_ipv6 ()))
00310     {
00311       ACE_ERROR_RETURN ((LM_ERROR,
00312                          ACE_TEXT ("TAO (%P|%t) - ")
00313                          ACE_TEXT ("DIOP_Acceptor::open, ")
00314                          ACE_TEXT ("non-IPv6 endpoints not allowed when ")
00315                          ACE_TEXT ("connect_ipv6_only is set\n\n")),
00316                         -1);
00317     }
00318 #endif /* ACE_HAS_IPV6 */
00319 
00320   if (TAO_debug_level > 2)
00321     {
00322       ACE_DEBUG ((LM_DEBUG,
00323                   ACE_TEXT ("TAO (%P|%t) - ")
00324                   ACE_TEXT ("DIOP_Acceptor::open, specified host=%s:%d\n"),
00325                   (specified_hostname.length () == 0 ? "<null>" : specified_hostname.c_str ()),
00326                   addr.get_port_number ()));
00327     }
00328 
00329   this->endpoint_count_ = 1;  // Only one hostname to store
00330 
00331   ACE_NEW_RETURN (this->addrs_,
00332                   ACE_INET_Addr[this->endpoint_count_],
00333                   -1);
00334 
00335   ACE_NEW_RETURN (this->hosts_,
00336                   char *[this->endpoint_count_],
00337                   -1);
00338 
00339   this->hosts_[0] = 0;
00340 
00341   if (this->hostname (orb_core,
00342                       addr,
00343                       this->hosts_[0],
00344                       specified_hostname.c_str ()) != 0)
00345     return -1;
00346 
00347   // Copy the addr.  The port is (re)set in
00348   // TAO_DIOP_Acceptor::open_i().
00349   if (this->addrs_[0].set (addr) != 0)
00350     return -1;
00351 
00352   return this->open_i (addr,
00353                        reactor);
00354 }

int TAO_DIOP_Acceptor::open_default ( TAO_ORB_Core orb_core,
ACE_Reactor reactor,
int  version_major,
int  version_minor,
const char *  options = 0 
) [virtual]

Implements TAO_Acceptor.

Definition at line 357 of file DIOP_Acceptor.cpp.

References ACE_ERROR_RETURN, ACE_TEXT, LM_ERROR, open_i(), ACE_INET_Addr::set(), TAO_GIOP_Message_Version::set_version(), and version_.

00362 {
00363   this->orb_core_ = orb_core;
00364 
00365   if (this->hosts_ != 0)
00366     {
00367       // The hostname cache has already been set!
00368       // This is bad mojo, i.e. an internal TAO error.
00369       ACE_ERROR_RETURN ((LM_ERROR,
00370                          ACE_TEXT ("TAO (%P|%t) - ")
00371                          ACE_TEXT ("DIOP_Acceptor::open_default, ")
00372                          ACE_TEXT ("hostname already set\n\n")),
00373                         -1);
00374     }
00375 
00376   if (major >= 0 && minor >= 0)
00377     this->version_.set_version (static_cast<CORBA::Octet> (major),
00378                                 static_cast<CORBA::Octet> (minor));
00379 
00380   // Parse options
00381   if (this->parse_options (options) == -1)
00382     return -1;
00383 
00384   // Check for multiple network interfaces.
00385   if (this->probe_interfaces (orb_core) == -1)
00386     return -1;
00387 
00388   // Now that each network interface's hostname has been cached, open
00389   // an endpoint on each network interface using the INADDR_ANY
00390   // address.
00391   ACE_INET_Addr addr;
00392 
00393   if (addr.set (this->default_address_) != 0)
00394     return -1;
00395 
00396   return this->open_i (addr, reactor);
00397 }

int TAO_DIOP_Acceptor::open_i ( const ACE_INET_Addr addr,
ACE_Reactor reactor 
) [protected, virtual]

Implement the common part of the open*() methods. This method is virtual to allow a derived class implementation to be invoked instead.

Definition at line 400 of file DIOP_Acceptor.cpp.

References ACE_DEBUG, ACE_ERROR, ACE_NEW_RETURN, ACE_TEXT, ACE_TEXT_CHAR_TO_TCHAR, address(), TAO_DIOP_Connection_Handler::close(), connection_handler_, default_address_, ACE_INET_Addr::get_port_number(), LM_DEBUG, LM_ERROR, TAO_DIOP_Connection_Handler::local_addr(), TAO_DIOP_Connection_Handler::open_server(), ACE_Event_Handler::READ_MASK, ACE_Reactor::register_handler(), ACE_Event_Handler::remove_reference(), ACE_INET_Addr::set_port_number(), and TAO_debug_level.

Referenced by open(), and open_default().

00402 {
00403   ACE_NEW_RETURN (this->connection_handler_,
00404                   TAO_DIOP_Connection_Handler (this->orb_core_),
00405                   -1);
00406 
00407   this->connection_handler_->local_addr (addr);
00408   int result = this->connection_handler_->open_server ();
00409   if (result == -1)
00410     {
00411       delete this->connection_handler_;
00412       return result;
00413     }
00414 
00415   // Register only with a valid handle
00416   result =
00417     reactor->register_handler (this->connection_handler_,
00418                                ACE_Event_Handler::READ_MASK);
00419   if (result == -1)
00420     {
00421       // Close the handler (this will also delete connection_handler_).
00422       this->connection_handler_->close ();
00423       return result;
00424     }
00425 
00426   // Connection handler ownership now belongs to the Reactor.
00427   this->connection_handler_->remove_reference ();
00428 
00429   ACE_INET_Addr address;
00430 
00431   // We do this make sure the port number the endpoint is listening on
00432   // gets set in the addr.
00433   if (this->connection_handler_->peer ().get_local_addr (address) != 0)
00434     {
00435       if (TAO_debug_level > 0)
00436         ACE_ERROR ((LM_ERROR,
00437                     ACE_TEXT ("TAO (%P|%t) DIOP_Acceptor::open_i, ")
00438                     ACE_TEXT ("%p"),
00439                     ACE_TEXT ("cannot get local addr\n\n")));
00440       return -1;
00441     }
00442 
00443   // Set the port for each addr.  If there is more than one network
00444   // interface then the endpoint created on each interface will be on
00445   // the same port.  This is how a wildcard socket bind() is supposed
00446   // to work.
00447   unsigned short port = address.get_port_number ();
00448   for (CORBA::ULong j = 0; j < this->endpoint_count_; ++j)
00449     this->addrs_[j].set_port_number (port, 1);
00450 
00451   this->default_address_.set_port_number (port);
00452 
00453   if (TAO_debug_level > 5)
00454     {
00455       for (CORBA::ULong i = 0; i < this->endpoint_count_; ++i)
00456         {
00457           ACE_DEBUG ((LM_DEBUG,
00458                       ACE_TEXT ("TAO (%P|%t) - DIOP_Acceptor::open_i, ")
00459                       ACE_TEXT ("listening on: <%s:%u>\n"),
00460                       ACE_TEXT_CHAR_TO_TCHAR (this->hosts_[i]),
00461                       this->addrs_[i].get_port_number ()));
00462         }
00463     }
00464 
00465   return 0;
00466 }

int TAO_DIOP_Acceptor::parse_address ( const char *  address,
ACE_INET_Addr addr,
ACE_CString specified_hostname,
int *  def_type = 0 
) [protected]

Helper method Clear out 'addr' & 'specified_hostname' and initialize them based upon 'address'. If a non-zero pointer is passed in for def_type, this will be set to AF_INET6 if IPv6 support is enabled and supplied hostname is either [] or [::]. It will be set to AF_INET if the hostname is 0.0.0.0, otherwise it is set to AF_UNSPEC. This value is then passed to probe_interfaces by open.

Definition at line 515 of file DIOP_Acceptor.cpp.

References ACE_ERROR_RETURN, ACE_TEXT, AF_INET, AF_UNSPEC, ACE_OS::atoi(), ACE_String_Base< CHAR >::c_str(), ACE_String_Base< CHAR >::clear(), default_address_, ACE_INET_Addr::is_any(), LM_ERROR, MAXHOSTNAMELEN, ACE_OS::memcpy(), ACE_INET_Addr::set(), ACE_INET_Addr::set_port_number(), ACE_OS::strchr(), and ACE_OS::strcpy().

00519 {
00520   {
00521     ACE_INET_Addr tmp;
00522     addr.set (tmp);
00523     specified_hostname.clear();
00524   }
00525 
00526   const char *port_separator_loc = ACE_OS::strchr (address, ':');
00527   char tmp_host[MAXHOSTNAMELEN + 1];
00528   tmp_host[0] = '\0';
00529   bool host_defaulted = port_separator_loc == address;
00530   bool ipv6_in_host = false;
00531   if (def_type)
00532     *def_type = AF_UNSPEC;
00533 
00534 #if defined (ACE_HAS_IPV6)
00535   // Check if this is a (possibly) IPv6 supporting profile containing a
00536   // numeric IPv6 address representation.
00537   if ((this->version_.major > TAO_MIN_IPV6_IIOP_MAJOR ||
00538        this->version_.minor >= TAO_MIN_IPV6_IIOP_MINOR) &&
00539       address[0] == '[')
00540     {
00541       // In this case we have to find the end of the numeric address and
00542       // start looking for the port separator from there.
00543       char const * const cp_pos = ACE_OS::strchr (address, ']');
00544       if (cp_pos == 0)
00545         {
00546           // No valid IPv6 address specified.
00547           ACE_ERROR_RETURN ((LM_ERROR,
00548                              ACE_TEXT ("TAO (%P|%t) - ")
00549                              ACE_TEXT ("DIOP_Acceptor::open, ")
00550                              ACE_TEXT ("invalid IPv6 decimal address specified\n\n")),
00551                             -1);
00552         }
00553       else
00554         {
00555           // Extract out just the host part of the address.
00556           size_t const len = cp_pos - (address + 1);
00557 
00558           if (len >= sizeof (tmp_host))
00559             return -1;
00560 
00561           ipv6_in_host = true;
00562           host_defaulted = (cp_pos == address+1) ||
00563             (cp_pos == address+3 && address[1] == ':' && address[2] == ':');
00564           if (cp_pos[1] == ':')    // Look for a port
00565             port_separator_loc = cp_pos + 1;
00566           else
00567             port_separator_loc = 0;
00568           if (def_type)
00569             *def_type = AF_INET6;
00570 
00571           ACE_OS::memcpy (tmp_host, address + 1, len);
00572           tmp_host[len] = '\0';
00573         }
00574     }
00575   else
00576 #endif /* ACE_HAS_IPV6 */
00577     if (!host_defaulted)
00578       {
00579         if (port_separator_loc != 0)
00580           {
00581             // Extract out just the host part of the address.
00582             size_t const len = port_separator_loc - address;
00583 
00584             if (len >= sizeof (tmp_host))
00585               return -1;
00586 
00587             ACE_OS::memcpy (tmp_host, address, len);
00588             tmp_host[len] = '\0';
00589           }
00590         else
00591           ACE_OS::strcpy (tmp_host, address);
00592       }
00593 
00594   if (!ipv6_in_host && !host_defaulted)
00595     {
00596       if (addr.set ((unsigned short) 0, tmp_host) != 0)
00597         return -1;
00598       this->default_address_.set (addr);
00599       host_defaulted = addr.is_any ();
00600       if (def_type)
00601         *def_type = AF_INET;
00602     }
00603 
00604   if (host_defaulted)
00605     {
00606       // First convert the port into a usable form.
00607       unsigned short portno = 0;
00608       if (port_separator_loc != 0)
00609         {
00610           portno =
00611             static_cast<u_short> (ACE_OS::atoi (port_separator_loc +
00612                                                 sizeof (':')));
00613         }
00614       this->default_address_.set_port_number (portno);
00615 
00616       // Now reset the port and set the host.
00617       if (addr.set (this->default_address_) != 0)
00618         return -1;
00619     }
00620   else if (port_separator_loc == 0)
00621     {
00622       // The address is a hostname.  No port was specified, so assume
00623       // port zero (port will be chosen for us).
00624       specified_hostname = tmp_host[0] == '\0' ? address : tmp_host;
00625       if (addr.set ((unsigned short) 0,
00626                     specified_hostname.c_str ()) != 0)
00627         return -1;
00628     }
00629   else
00630     {
00631       // Host and port were specified.
00632       if (addr.set (address) != 0)
00633         return -1;
00634       if (tmp_host[0] == '\0')
00635         {
00636           // Extract out just the host part of the address.
00637           size_t const len = port_separator_loc - address;
00638 
00639           if (len >= sizeof (tmp_host))
00640             return -1;
00641 
00642           ACE_OS::memcpy (tmp_host, address, len);
00643           tmp_host[len] = '\0';
00644         }
00645       specified_hostname = tmp_host;
00646     }
00647 
00648   return 1;
00649 }

int TAO_DIOP_Acceptor::parse_options ( const char *  options  )  [protected, virtual]

Parse protocol specific options.

Definition at line 966 of file DIOP_Acceptor.cpp.

References ACE_ERROR_RETURN, ACE_TEXT, ACE_TEXT_CHAR_TO_TCHAR, ACE_String_Base< CHAR >::c_str(), ACE_String_Base< CHAR >::find(), ACE_String_Base< CHAR >::length(), LM_ERROR, ACE_String_Base_Const::npos, and ACE_String_Base< CHAR >::substring().

00967 {
00968   if (str == 0)
00969     return 0;  // No options to parse.  Not a problem.
00970 
00971   // Use an option format similar to the one used for CGI scripts in
00972   // HTTP URLs.
00973   // e.g.:  option1=foo&option2=bar
00974 
00975   const ACE_CString options (str);
00976 
00977   const size_t len = options.length ();
00978 
00979   static const char option_delimiter = '&';
00980 
00981   // Count the number of options.
00982   CORBA::ULong option_count = 1;
00983 
00984   // Only check for endpoints after the protocol specification and
00985   // before the object key.
00986   for (size_t i = 0; i < len; ++i)
00987     if (options[i] == option_delimiter)
00988       ++option_count;
00989 
00990   // The idea behind the following loop is to split the options into
00991   // (option, name) pairs.
00992   // For example,
00993   //    `option1=foo&option2=bar'
00994   // will be parsed into:
00995   //    `option1=foo'
00996   //    `option2=bar'
00997 
00998   ACE_CString::size_type begin = 0;
00999   ACE_CString::size_type end = 0;
01000 
01001   for (CORBA::ULong j = 0; j < option_count;)
01002     {
01003       if (j < option_count - 1)
01004         end = options.find (option_delimiter, begin);
01005       else
01006         end = len;
01007 
01008       ++j;  // In this way we fight MS VS warning about unreachable code.
01009 
01010       if (end == begin)
01011         {
01012           ACE_ERROR_RETURN ((LM_ERROR,
01013                              ACE_TEXT ("TAO (%P|%t) - Zero length DIOP option.\n")),
01014                             -1);
01015         }
01016       else if (end != ACE_CString::npos)
01017         {
01018           ACE_CString opt = options.substring (begin, end - begin);
01019 
01020           ACE_CString::size_type const slot = opt.find ("=");
01021 
01022           if (slot == len - 1
01023               || slot == ACE_CString::npos)
01024             ACE_ERROR_RETURN ((LM_ERROR,
01025                                ACE_TEXT ("TAO (%P|%t) - DIOP option <%s> is ")
01026                                ACE_TEXT ("missing a value.\n"),
01027                                ACE_TEXT_CHAR_TO_TCHAR (opt.c_str ())),
01028                               -1);
01029 
01030           ACE_CString name = opt.substring (0, slot);
01031           ACE_CString value = opt.substring (slot + 1);
01032 
01033           begin = end + 1;
01034 
01035           if (name.length () == 0)
01036             ACE_ERROR_RETURN ((LM_ERROR,
01037                                ACE_TEXT ("TAO (%P|%t) - Zero length DIOP ")
01038                                ACE_TEXT ("option name.\n")),
01039                               -1);
01040 
01041           if (name == "priority")
01042             {
01043               ACE_ERROR_RETURN ((LM_ERROR,
01044                                  ACE_TEXT ("TAO (%P|%t) - Invalid DIOP endpoint format: ")
01045                                  ACE_TEXT ("endpoint priorities no longer supported. \n")),
01046                                 -1);
01047             }
01048           else
01049             {
01050               ACE_ERROR_RETURN ((LM_ERROR,
01051                                  ACE_TEXT ("TAO (%P|%t) - Invalid DIOP option: <%s>\n"),
01052                                  ACE_TEXT_CHAR_TO_TCHAR (name.c_str ())),
01053                                 -1);
01054             }
01055         }
01056       else
01057         {
01058           break;  // No other options.
01059         }
01060     }
01061   return 0;
01062 }

int TAO_DIOP_Acceptor::probe_interfaces ( TAO_ORB_Core orb_core,
int  def_type = AF_UNSPEC 
) [protected]

Probe the system for available network interfaces, and initialize the <addrs_> array with an ACE_INET_Addr for each network interface. The port for each initialized ACE_INET_Addr will be set in the open_i() method. This method only gets invoked when no explicit hostname is provided in the specified endpoint.

The optional argument def_type is used to constrain the resulting list of interfaces to be either only IPv6 or IPv4, or both, when ACE_HAS_IPV6 is enabled and the source endpoint was an explicitly declared wildcard.

Definition at line 696 of file DIOP_Acceptor.cpp.

References ACE_DEBUG, ACE_NEW_RETURN, ACE_TEXT, AF_INET, ENOTSUP, ACE::get_ip_interfaces(), LM_DEBUG, LM_WARNING, ACE_OS::memset(), TAO_ORB_Core::orb_params(), and TAO_debug_level.

00697 {
00698   // Extract the hostname for each network interface, and then cache
00699   // it.  The hostnames will then be used when creating a
00700   // TAO_DIOP_Profile for each endpoint setup on the probed
00701   // network interfaces.
00702   ACE_INET_Addr *if_addrs = 0;
00703   size_t if_cnt = 0;
00704 
00705   if (ACE::get_ip_interfaces (if_cnt,
00706                               if_addrs) != 0
00707       && errno != ENOTSUP)
00708     {
00709       // In the case where errno == ENOTSUP, if_cnt and if_addrs will
00710       // not be modified, and will each remain equal to zero.  This
00711       // causes the default interface to be used.
00712       return -1;
00713     }
00714 
00715   if (if_cnt == 0 || if_addrs == 0)
00716     {
00717       if (TAO_debug_level > 0)
00718         {
00719           ACE_DEBUG ((LM_WARNING,
00720                       ACE_TEXT ("TAO (%P|%t) - Unable to probe network ")
00721                       ACE_TEXT ("interfaces.  Using default.")));
00722         }
00723 
00724       if_cnt = 1; // Force the network interface count to be one.
00725       delete [] if_addrs;
00726       ACE_NEW_RETURN (if_addrs,
00727                       ACE_INET_Addr[if_cnt],
00728                       -1);
00729     }
00730 
00731   // Scan for the loopback interface since it shouldn't be included in
00732   // the list of cached hostnames unless it is the only interface.
00733   size_t lo_cnt = 0;  // Loopback interface count
00734   for (size_t j = 0; j < if_cnt; ++j)
00735     if (if_addrs[j].is_loopback ())
00736       lo_cnt++;
00737 
00738 #if defined (ACE_HAS_IPV6)
00739   size_t ipv4_cnt = 0;
00740   size_t ipv4_lo_cnt = 0;
00741   size_t ipv6_ll = 0;
00742   bool ipv6_non_ll = false;
00743   // Scan for IPv4 interfaces since these should not be included
00744   // when IPv6-only is selected.
00745   for (size_t j = 0; j < if_cnt; ++j)
00746     if (if_addrs[j].get_type () != AF_INET6 ||
00747         if_addrs[j].is_ipv4_mapped_ipv6 ())
00748       {
00749         ++ipv4_cnt;
00750         if (if_addrs[j].is_loopback ())
00751           ++ipv4_lo_cnt;  // keep track of IPv4 loopback ifs
00752       }
00753     else if (!if_addrs[j].is_linklocal () &&
00754              !if_addrs[j].is_loopback())
00755       {
00756         ipv6_non_ll = true; // we have at least 1 non-local IPv6 if
00757       }
00758     else if (!orb_core->orb_params ()->use_ipv6_link_local () &&
00759              if_addrs[j].is_linklocal ())
00760       {
00761         ++ipv6_ll;  // count link local addrs to exclude them afterwards
00762       }
00763 #endif /* ACE_HAS_IPV6 */
00764 
00765   // The instantiation for this template is in
00766   // tao/DIOP_Connector.cpp.
00767   ACE_Auto_Basic_Array_Ptr<ACE_INET_Addr> safe_if_addrs (if_addrs);
00768 
00769 #if defined (ACE_HAS_IPV6)
00770   bool ipv4_only = def_type == AF_INET;
00771   bool ipv6_only = (def_type == AF_INET6) ||
00772     orb_core->orb_params ()->connect_ipv6_only ();
00773 #if defined (ACE_WIN32)
00774   if (this->default_address_.get_type () == AF_INET)
00775     ipv4_only = true;
00776   else
00777     ipv6_only = true;
00778 #endif /* ACE_WIN32 */
00779   // If the loopback interface is the only interface then include it
00780   // in the list of interfaces to query for a hostname, otherwise
00781   // exclude it from the list.
00782   bool ignore_lo;
00783   if (ipv6_only)
00784     // only exclude loopback if non-local if exists
00785     ignore_lo = ipv6_non_ll;
00786   else if (ipv4_only)
00787     ignore_lo = ipv4_cnt != ipv4_lo_cnt;
00788   else
00789     ignore_lo = if_cnt != lo_cnt;
00790 
00791   // Adjust counts for IPv6 only if required
00792   size_t if_ok_cnt = if_cnt;
00793   if (ipv6_only)
00794     {
00795       if_ok_cnt -= ipv4_cnt;
00796       lo_cnt -= ipv4_lo_cnt;
00797       ipv4_lo_cnt = 0;
00798     }
00799   else if (ipv4_only)
00800     {
00801       if_ok_cnt = ipv4_cnt;
00802       lo_cnt = ipv4_lo_cnt;
00803     }
00804 
00805   // In case there are no non-local IPv6 ifs in the list only exclude
00806   // IPv4 loopback.
00807   // IPv6 loopback will be needed to successfully connect IPv6 clients
00808   // in a localhost environment.
00809   if (!ipv4_only && !ipv6_non_ll)
00810     lo_cnt = ipv4_lo_cnt;
00811 
00812   if (!ignore_lo)
00813     this->endpoint_count_ = static_cast<CORBA::ULong> (if_ok_cnt - ipv6_ll);
00814   else
00815     this->endpoint_count_ = static_cast<CORBA::ULong> (if_ok_cnt - ipv6_ll - lo_cnt);
00816 #else /* ACE_HAS_IPV6 */
00817   // If the loopback interface is the only interface then include it
00818   // in the list of interfaces to query for a hostname, otherwise
00819   // exclude it from the list.
00820   bool ignore_lo;
00821   ignore_lo = if_cnt != lo_cnt;
00822   if (!ignore_lo)
00823     this->endpoint_count_ = static_cast<CORBA::ULong> (if_cnt);
00824   else
00825     this->endpoint_count_ = static_cast<CORBA::ULong> (if_cnt - lo_cnt);
00826 #endif /* !ACE_HAS_IPV6 */
00827 
00828   if (this->endpoint_count_ == 0)
00829     {
00830       if (TAO_debug_level > 0)
00831         ACE_DEBUG ((LM_DEBUG,
00832                     ACE_TEXT("(%P|%t) - DIOP_Acceptor::probe_interfaces, ")
00833                     ACE_TEXT("found no usable addresses, def_type = %d\n"),
00834                     def_type));
00835       return -1;
00836     }
00837 
00838   ACE_NEW_RETURN (this->addrs_,
00839                   ACE_INET_Addr[this->endpoint_count_],
00840                   -1);
00841 
00842   ACE_NEW_RETURN (this->hosts_,
00843                   char *[this->endpoint_count_],
00844                   -1);
00845 
00846   ACE_OS::memset (this->hosts_, 0, sizeof (char*) * this->endpoint_count_);
00847 
00848   // The number of hosts/interfaces we want to cache may not be the
00849   // same as the number of detected interfaces so keep a separate
00850   // count.
00851   size_t host_cnt = 0;
00852 
00853   for (size_t i = 0; i < if_cnt; ++i)
00854     {
00855 #if defined (ACE_HAS_IPV6)
00856       // Ignore any loopback interface if there are other
00857       // non-loopback interfaces.
00858       if (ignore_lo &&
00859           if_addrs[i].is_loopback () &&
00860           (ipv4_only ||
00861            ipv6_non_ll ||
00862            if_addrs[i].get_type () != AF_INET6))
00863         continue;
00864 
00865       // Ignore any non-IPv4 interfaces when so required.
00866       if (ipv4_only &&
00867           (if_addrs[i].get_type () != AF_INET))
00868         continue;
00869 
00870       // Ignore any non-IPv6 interfaces when so required.
00871       if (ipv6_only &&
00872           (if_addrs[i].get_type () != AF_INET6 ||
00873            if_addrs[i].is_ipv4_mapped_ipv6 ()))
00874         continue;
00875 
00876       // Ignore all IPv6 link local interfaces when so required.
00877       if (!orb_core->orb_params ()->use_ipv6_link_local () &&
00878           if_addrs[i].is_linklocal ())
00879         continue;
00880 #else /* ACE_HAS_IPV6 */
00881       // Ignore any loopback interface if there are other
00882       // non-loopback interfaces.
00883       if (ignore_lo &&
00884           if_addrs[i].is_loopback ())
00885         continue;
00886 #endif /* !ACE_HAS_IPV6 */
00887 
00888       if (this->hostname (orb_core,
00889                           if_addrs[i],
00890                           this->hosts_[host_cnt]) != 0)
00891         return -1;
00892 
00893       // Copy the addr.  The port is (re)set in
00894       // TAO_DIOP_Acceptor::open_i().
00895       if (this->addrs_[host_cnt].set (if_addrs[i]) != 0)
00896         return -1;
00897 
00898       host_cnt++;
00899     }
00900 
00901   return 0;
00902 }

ACE_INLINE void TAO_DIOP_Acceptor::set_default_address ( const ACE_INET_Addr addr  ) 

Set address for default endpoint.

Definition at line 35 of file DIOP_Acceptor.inl.

References default_address_, and ACE_INET_Addr::set().

00036 {
00037   this->default_address_.set (addr);
00038 }


Member Data Documentation

ACE_INET_Addr* TAO_DIOP_Acceptor::addrs_ [protected]

Array of ACE_INET_Addr instances, each one corresponding to a given network interface.

Definition at line 172 of file DIOP_Acceptor.h.

Referenced by address(), and endpoints().

TAO_DIOP_Connection_Handler* TAO_DIOP_Acceptor::connection_handler_ [private]

Definition at line 202 of file DIOP_Acceptor.h.

Referenced by open_i().

ACE_INET_Addr TAO_DIOP_Acceptor::default_address_ [protected]

Address for default endpoint.

Definition at line 198 of file DIOP_Acceptor.h.

Referenced by default_address(), open_i(), parse_address(), and set_default_address().

CORBA::ULong TAO_DIOP_Acceptor::endpoint_count_ [protected]

The number of host names cached in the hosts_ array (equivalent to the number of endpoints opened by this Acceptor).

Definition at line 185 of file DIOP_Acceptor.h.

char** TAO_DIOP_Acceptor::hosts_ [protected]

Cache the information about the endpoints serviced by this acceptor. There may in fact be multiple hostnames for this endpoint. For example, if the IP address is INADDR_ANY (0.0.0.0) then there will be possibly a different hostname for each interface.

Definition at line 181 of file DIOP_Acceptor.h.

TAO_ORB_Core* TAO_DIOP_Acceptor::orb_core_ [protected]

ORB Core.

Definition at line 195 of file DIOP_Acceptor.h.

TAO_GIOP_Message_Version TAO_DIOP_Acceptor::version_ [protected]

The GIOP version for this endpoint @ Theoretically they shouldn't be here!! We need to look at a way to move this out

Definition at line 192 of file DIOP_Acceptor.h.

Referenced by create_new_profile(), create_shared_profile(), open(), and open_default().


The documentation for this class was generated from the following files:
Generated on Tue Feb 2 17:47:30 2010 for TAO_Strategies by  doxygen 1.4.7