server.cpp
来自「这是广泛使用的通信开源项目,对于大容量,高并发的通讯要求完全能够胜任,他广泛可用」· C++ 代码 · 共 450 行
CPP
450 行
// server.cpp,v 1.15 2003/11/04 08:12:59 dhinton Exp
// ================================================================
//
// = LIBRARY
// TAO/tests/POA/Adapter_Activator
//
// = FILENAME
// server.cpp
//
// = DESCRIPTION
// This example is very similar to the Explicit_Activation example
// except that the POAs are deleted once the object references have
// been created. After this, an adapter activator is install in the
// RootPOA to reactivate the POAs on demand.
//
// Similar to the Explicit_Activation, the client for this example
// is Generic_Servant.
//
// = AUTHOR
// Irfan Pyarali
//
// ================================================================
#include "ace/Get_Opt.h"
#include "test_i.h"
#include "ace/OS_NS_stdio.h"
#include "ace/OS_NS_string.h"
ACE_RCSID(Adapter_Activator, server, "server.cpp,v 1.15 2003/11/04 08:12:59 dhinton Exp")
// This is to remove "inherits via dominance" warnings from MSVC.
// MSVC is being a little too paranoid.
#if defined (_MSC_VER)
# pragma warning (disable : 4250)
#endif /* _MSC_VER */
class reference_counted_test_i : public virtual PortableServer::RefCountServantBase,
public virtual test_i
{
public:
reference_counted_test_i (CORBA::ORB_ptr orb,
PortableServer::POA_ptr poa);
// Constructor - takes a POA and a value parameter
};
reference_counted_test_i::reference_counted_test_i (CORBA::ORB_ptr orb,
PortableServer::POA_ptr poa)
: test_i (orb,
poa)
{
}
class Adapter_Activator : public PortableServer::AdapterActivator
{
public:
Adapter_Activator (PortableServer::POAManager_ptr poa_manager,
CORBA::ORB_ptr orb);
CORBA::Boolean unknown_adapter (PortableServer::POA_ptr parent,
const char *name
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException));
CORBA::PolicyList first_poa_policies_;
CORBA::PolicyList second_poa_policies_;
private:
PortableServer::POAManager_var poa_manager_;
CORBA::ORB_var orb_;
};
Adapter_Activator::Adapter_Activator (PortableServer::POAManager_ptr poa_manager,
CORBA::ORB_ptr orb)
: poa_manager_ (PortableServer::POAManager::_duplicate (poa_manager)),
orb_ (CORBA::ORB::_duplicate (orb))
{
}
CORBA::Boolean
Adapter_Activator::unknown_adapter (PortableServer::POA_ptr parent,
const char *name
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException))
{
if (ACE_OS::strcmp (name, "firstPOA") == 0)
{
PortableServer::POA_var child = parent->create_POA (name,
this->poa_manager_.in (),
this->first_poa_policies_
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (0);
// Creation of firstPOA is over. Destroy the Policy objects.
for (CORBA::ULong i = 0;
i < this->first_poa_policies_.length ();
++i)
{
this->first_poa_policies_[i]->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK_RETURN (0);
}
child->the_activator (this
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (0);
reference_counted_test_i *servant =
new reference_counted_test_i (this->orb_.in (),
child.in ());
child->set_servant (servant
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (0);
// This means that the ownership of <servant> now belongs to the
// POA.
servant->_remove_ref (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK_RETURN (0);
// Finally everything is fine
return 1;
}
else if (ACE_OS::strcmp (name, "secondPOA") == 0)
{
PortableServer::POA_var child = parent->create_POA (name,
this->poa_manager_.in (),
this->second_poa_policies_
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (0);
// Creation of secondPOA is over. Destroy the Policy objects.
for (CORBA::ULong i = 0;
i < this->second_poa_policies_.length ();
++i)
{
this->second_poa_policies_[i]->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK_RETURN (0);
}
reference_counted_test_i *servant =
new reference_counted_test_i (this->orb_.in (),
child.in ());
PortableServer::ObjectId_var oid =
PortableServer::string_to_ObjectId ("third test");
child->activate_object_with_id (oid.in (),
servant
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (0);
// This means that the ownership of <servant> now belongs to the
// POA.
servant->_remove_ref (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK_RETURN (0);
// Finally everything is fine
return 1;
}
else
{
// Unknown POA.
return 0;
}
}
const char *ior_output_file = "ior";
static int
parse_args (int argc, char **argv)
{
ACE_Get_Opt get_opts (argc, argv, "f:");
int c;
while ((c = get_opts ()) != -1)
switch (c)
{
case 'f':
ior_output_file = get_opts.opt_arg ();
break;
case '?':
default:
ACE_ERROR_RETURN ((LM_ERROR,
"usage: %s "
"[-f ior_output_file]"
"\n",
argv [0]),
-1);
}
// Indicates successful parsing of command line.
return 0;
}
static int
write_iors_to_file (const char *first_ior,
const char *second_ior,
const char *third_ior)
{
char ior_output_file_1[BUFSIZ];
char ior_output_file_2[BUFSIZ];
char ior_output_file_3[BUFSIZ];
ACE_OS::sprintf (ior_output_file_1, "%s_1", ior_output_file);
ACE_OS::sprintf (ior_output_file_2, "%s_2", ior_output_file);
ACE_OS::sprintf (ior_output_file_3, "%s_3", ior_output_file);
FILE *output_file_1 = ACE_OS::fopen (ior_output_file_1, "w");
FILE *output_file_2 = ACE_OS::fopen (ior_output_file_2, "w");
FILE *output_file_3 = ACE_OS::fopen (ior_output_file_3, "w");
if (output_file_1 == 0 ||
output_file_2 == 0 ||
output_file_3 == 0)
ACE_ERROR_RETURN ((LM_ERROR, "Cannot open output files for writing IORs: %s, %s %s\n",
ior_output_file_1,
ior_output_file_2,
ior_output_file_3),
-1);
u_int result = 0;
result = ACE_OS::fprintf (output_file_1,
"%s",
first_ior);
if (result != ACE_OS::strlen (first_ior))
ACE_ERROR_RETURN ((LM_ERROR,
"ACE_OS::fprintf failed while writing %s to %s\n",
first_ior,
ior_output_file_1),
-1);
result = ACE_OS::fprintf (output_file_2,
"%s",
second_ior);
if (result != ACE_OS::strlen (second_ior))
ACE_ERROR_RETURN ((LM_ERROR,
"ACE_OS::fprintf failed while writing %s to %s\n",
second_ior,
ior_output_file_2),
-1);
result = ACE_OS::fprintf (output_file_3,
"%s",
third_ior);
if (result != ACE_OS::strlen (third_ior))
ACE_ERROR_RETURN ((LM_ERROR,
"ACE_OS::fprintf failed while writing %s to %s\n",
third_ior,
ior_output_file_3),
-1);
ACE_OS::fclose (output_file_1);
ACE_OS::fclose (output_file_2);
ACE_OS::fclose (output_file_3);
return 0;
}
int
main (int argc, char **argv)
{
ACE_DECLARE_NEW_CORBA_ENV;
ACE_TRY
{
// Initialize the ORB first.
CORBA::ORB_var orb = CORBA::ORB_init (argc,
argv,
0
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
int result = parse_args (argc, argv);
if (result != 0)
return result;
// Obtain the RootPOA.
CORBA::Object_var obj =
orb->resolve_initial_references ("RootPOA"
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
// Get the POA_var object from Object_var.
PortableServer::POA_var root_poa =
PortableServer::POA::_narrow (obj.in ()
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
// Get the POAManager of the RootPOA.
PortableServer::POAManager_var poa_manager =
root_poa->the_POAManager (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_TRY_CHECK;
Adapter_Activator *adapter_activator =
new Adapter_Activator (poa_manager.in (),
orb.in ());
PortableServer::AdapterActivator_var adapter_activator_var =
adapter_activator;
root_poa->the_activator (adapter_activator_var.in ()
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
PortableServer::POA_var first_poa;
PortableServer::POA_var second_poa;
{
// Policies for the firstPOA to be created.
CORBA::PolicyList &policies = adapter_activator->first_poa_policies_;
policies.length (4);
// Id Assignment Policy
policies[0] =
root_poa->create_id_assignment_policy (PortableServer::SYSTEM_ID
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
// Lifespan policy
policies[1] =
root_poa->create_lifespan_policy (PortableServer::PERSISTENT
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
// Request Processing policy
policies[2] =
root_poa->create_request_processing_policy (PortableServer::USE_DEFAULT_SERVANT
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
// Id Uniqueness
policies[3] =
root_poa->create_id_uniqueness_policy (PortableServer::MULTIPLE_ID
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
// Create the firstPOA under the RootPOA.
first_poa = root_poa->create_POA ("firstPOA",
poa_manager.in (),
policies
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
}
{
// Policies for the secondPOA to be created.
CORBA::PolicyList &policies = adapter_activator->second_poa_policies_;
policies.length (2);
// Id Assignment Policy
policies[0] =
root_poa->create_id_assignment_policy (PortableServer::USER_ID
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
// Lifespan policy
policies[1] =
root_poa->create_lifespan_policy (PortableServer::PERSISTENT
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
// Create the secondPOA under the firstPOA.
second_poa = first_poa->create_POA ("secondPOA",
poa_manager.in (),
policies
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
}
// Create a servant.
reference_counted_test_i first_servant (orb.in (),
root_poa.in ());
PortableServer::ObjectId_var first_oid =
root_poa->activate_object (&first_servant
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
// Get Object Reference for the first_servant object.
test_var first_test = first_servant._this (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_TRY_CHECK;
CORBA::Object_var second_test =
first_poa->create_reference ("IDL:test:1.0"
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
PortableServer::ObjectId_var third_oid =
PortableServer::string_to_ObjectId ("third test");
CORBA::Object_var third_test =
second_poa->create_reference_with_id (third_oid.in (),
"IDL:test:1.0"
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
// Stringyfy all the object references and print them out.
CORBA::String_var first_ior =
orb->object_to_string (first_test.in ()
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
CORBA::String_var second_ior =
orb->object_to_string (second_test.in ()
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
CORBA::String_var third_ior =
orb->object_to_string (third_test.in () ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
ACE_DEBUG ((LM_DEBUG,
"%s\n%s\n%s\n",
first_ior.in (),
second_ior.in (),
third_ior.in ()));
int write_result = write_iors_to_file (first_ior.in (),
second_ior.in (),
third_ior.in ());
if (write_result != 0)
return write_result;
first_poa->destroy (1,
1
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
poa_manager->activate (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_TRY_CHECK;
orb->run (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_TRY_CHECK;
}
ACE_CATCHANY
{
ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "Exception caught");
return -1;
}
ACE_ENDTRY;
ACE_CHECK_RETURN (-1);
return 0;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?