📄 ec_mcast.h
字号:
// -*- C++ -*-
// EC_Mcast.h,v 1.21 2003/06/18 08:18:06 jwillemsen Exp
//
// ============================================================================
//
// = DESCRIPTION
// This test attempts to communicate several Event Channels UDP
// using multicast.
// The test reads a configuration file that describe what events are
// received by each "Federation". The user must provide, on the
// command line, which federations are present on each process
// (these are called the "Local Federations").
// The test also creates one supplier for each federation, the
// supplier can send an event of any possible type described in the
// file.
// = HOW
// The test creates one UDP_Sender for each remote federation,
// this is a PushConsumer that sends the events using UDP
// multicast.
// Notice that there is still a win in using multicast because
// multiple copies of the federation may be present.
// To receive the event the test creates one UDP_Receiver for each
// local federation, it joins to the right multicast groups and
// pushes the events it receives, acting as a PushSupplier.
//
// The UDP_Receiversfederation suppliers Mcast packets as local events
// could observe the changes in the local subscriptions and use that
// to join or leave the multicast groups.
// To demostrate this the test will need to reconfigure its
// subscription list every so often (a few seconds seems like a good
// idea).
//
// = TODO
//
// It is unfortunate that the test must know before-hand the remote
// consumer interests. It would be really simple to use a better
// strategy: the test could "observe" changes in the remote EC
// subscription list, it could then modify its local consumers
// subscriptions.
//
// ============================================================================
#ifndef EC_MCAST_H
#define EC_MCAST_H
#include "ace/SString.h"
#if !defined (ACE_LACKS_PRAGMA_ONCE)
# pragma once
#endif /* ACE_LACKS_PRAGMA_ONCE */
#include "ace/High_Res_Timer.h"
#include "orbsvcs/RtecEventChannelAdminC.h"
#include "orbsvcs/RtecEventCommS.h"
#include "orbsvcs/Channel_Clients_T.h"
#include "orbsvcs/Event/ECG_UDP_Sender.h"
#include "orbsvcs/Event/EC_UDP_Admin.h"
#include "orbsvcs/Event/ECG_Mcast_EH.h"
#include "orbsvcs/Event/ECG_UDP_Out_Endpoint.h"
#include "orbsvcs/Event/ECG_UDP_Receiver.h"
#include "orbsvcs/Event/ECG_UDP_Sender.h"
class ECM_Driver;
class ECM_Federation
{
// = DESCRIPTION
// The test reads a configuration file where it obtains the data
// about each "federation". A federation is some application,
// distributed over several processes. The potential set of
// publications and the potential set of subscriptions is known
// beforehand, but the actual publications (or subscriptions) may
// change dynamically.
// As stated above the federation may be present in more than one
// process, but also a process may participate in more than one
// federation.
//
public:
ECM_Federation (char* name,
CORBA::UShort mcast_port,
int supplier_types,
char** supplier_names,
int consumer_types,
char** consumer_names);
// Constructor, it assumes ownership of the buffers, strings must be
// allocated using CORBA::string_alloc(), buffers using operator new.
~ECM_Federation (void);
// Dtor
const char* name (void) const;
// The name of the federation....
CORBA::UShort mcast_port (void) const;
// The port used by this federation to receive mcast messages.
int supplier_types (void) const;
// The number of different event types published by this federation.
const char* supplier_name (CORBA::ULong i) const;
// The name (mcast addr in A.B.C.D format) of the event type <i>
CORBA::ULong supplier_ipaddr (CORBA::ULong i) const;
// The ipaddr (in host byte order) of the event type <i>
int consumer_types (void) const;
// The number of different event types consumed by this federation.
const char* consumer_name (CORBA::ULong i) const;
// The name (mcast addr in A.B.C.D format) of the event type <i>
CORBA::ULong consumer_ipaddr (CORBA::ULong i) const;
// The ipaddr (in host byte order) of the event type <i>
void open (TAO_ECG_UDP_Out_Endpoint *endoint,
RtecEventChannelAdmin::EventChannel_ptr ec
ACE_ENV_ARG_DECL);
// Connect the UDP sender to the EC.
void close (ACE_ENV_SINGLE_ARG_DECL);
// Close the UDP sender, disconnect from the EC
int sender_local_addr (ACE_INET_Addr& addr);
// Return the sender local address
RtecUDPAdmin::AddrServer_ptr addr_server (ACE_ENV_SINGLE_ARG_DECL);
// This address server can be used to convert event headers
// (type,source) to UDP addresses (ipaddr,port)
private:
char* name_;
CORBA::UShort mcast_port_;
int supplier_types_;
char** supplier_names_;
CORBA::ULong* supplier_ipaddr_;
int consumer_types_;
char** consumer_names_;
CORBA::ULong* consumer_ipaddr_;
TAO_EC_Servant_Var<TAO_ECG_UDP_Sender> sender_;
// The sender
TAO_EC_Simple_AddrServer addr_server_;
// Resolve event headers (type,source) to UDP addresses
// (ipaddr,port)
};
class ECM_Local_Federation;
class ECM_Supplier : public POA_RtecEventComm::PushSupplier
{
//
// = TITLE
// Helper class to simulate an application acting as an event
// supplier.
//
// = DESCRIPTION
// This class connects as a consumer for timeouts in the EC. On
// every timeout it delegates on the ECM_Local_Federation class,
// usually this results in some reconfiguration and/or some events
// sent.
//
public:
ECM_Supplier (ECM_Local_Federation* federation);
void open (const char* name,
RtecEventChannelAdmin::EventChannel_ptr event_channel
ACE_ENV_ARG_DECL);
// This method connects the supplier to the EC.
void close (ACE_ENV_SINGLE_ARG_DECL);
// Disconnect from the EC.
void activate (RtecEventChannelAdmin::EventChannel_ptr event_channel,
RtecEventComm::Time interval
ACE_ENV_ARG_DECL);
// Connect as a consumer to start receiving events.
RtecEventComm::EventSourceID supplier_id (void) const;
// The supplier ID.
void push (const RtecEventComm::EventSet& events
ACE_ENV_ARG_DECL);
void disconnect_push_consumer (ACE_ENV_SINGLE_ARG_DECL_NOT_USED);
// Implement the callbacks for our consumer personality.
// = The POA_RtecEventComm::PushSupplier methods.
virtual void disconnect_push_supplier (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
ACE_THROW_SPEC ((CORBA::SystemException));
private:
ECM_Local_Federation* federation_;
// To callback the federation.
RtecEventComm::EventSourceID supplier_id_;
// We generate an id based on the name....
RtecEventChannelAdmin::ProxyPushConsumer_var consumer_proxy_;
// We talk to the EC (as a supplier) using this proxy.
ACE_PushConsumer_Adapter<ECM_Supplier> consumer_;
// We also connect to the EC as a consumer so we can receive the
// timeout events.
RtecEventChannelAdmin::ProxyPushSupplier_var supplier_proxy_;
// We talk to the EC (as a supplier) using this proxy.
};
class ECM_Consumer : public POA_RtecEventComm::PushConsumer
{
//
// = TITLE
// Helper class to simulate an application acting as an event
// consumer.
//
// = DESCRIPTION
// This class connects as an event consumer to the EC. The events
// are actually handled by the ECM_Local_Federation.
public:
ECM_Consumer (ECM_Local_Federation* federation);
void open (const char* name,
RtecEventChannelAdmin::EventChannel_ptr event_channel,
ACE_RANDR_TYPE &seed
ACE_ENV_ARG_DECL);
// This method connects the consumer to the EC.
void close (ACE_ENV_SINGLE_ARG_DECL);
// Disconnect from the EC.
void connect (ACE_RANDR_TYPE& seed
ACE_ENV_ARG_DECL);
void disconnect (ACE_ENV_SINGLE_ARG_DECL);
// Disconnect from the supplier, but do not forget about it or close
// it.
// = The POA_RtecEventComm::PushComsumer methods.
virtual void push (const RtecEventComm::EventSet& events
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException));
virtual void disconnect_push_consumer (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
ACE_THROW_SPEC ((CORBA::SystemException));
private:
ECM_Local_Federation* federation_;
// To callback.
RtecEventChannelAdmin::ProxyPushSupplier_var supplier_proxy_;
// We talk to the EC using this proxy.
RtecEventChannelAdmin::ConsumerAdmin_var consumer_admin_;
// We talk to the EC using this proxy.
};
class ECM_Local_Federation
{
// = DESCRIPTION
// This class is used to represent a federation that is actually
// running in this process.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -