📄 qos_udp.cpp
字号:
// }
// }
// return 0;
// }
int
TAO_AV_UDP_QoS_Connector::connect (TAO_FlowSpec_Entry *entry,
TAO_AV_Transport *&transport,
TAO_AV_Core::Flow_Component flow_comp)
{
ACE_UNUSED_ARG (flow_comp);
ACE_DECLARE_NEW_CORBA_ENV;
int result = 0;
this->entry_ = entry;
this->flowname_ = entry->flowname ();
ACE_INET_Addr *local_addr;
if (entry->get_peer_addr () != 0)
{
local_addr = ACE_dynamic_cast (ACE_INET_Addr*, entry->get_peer_addr ());
}
else
ACE_NEW_RETURN (local_addr,
ACE_INET_Addr ("0"),
-1);
TAO_AV_Flow_Handler *flow_handler = 0;
TAO_AV_UDP_QoS_Flow_Handler *handler;
ACE_NEW_RETURN (handler,
TAO_AV_UDP_QoS_Flow_Handler,
-1);
flow_handler = handler;
handler->endpoint (this->endpoint_);
handler->flowspec_entry (this->entry_);
handler->av_core (this->av_core_);
ACE_INET_Addr *inet_addr = ACE_dynamic_cast (ACE_INET_Addr*,
entry->address ());
ACE_QoS_Params qos_params;
ACE_QoS* ace_qos = 0;
FillQoSParams (qos_params,
0,
ace_qos);
result = handler->get_socket ()->open (*local_addr,
qos_params,
AF_INET,
0,
0,
0,
ACE_OVERLAPPED_SOCKET_FLAG
| ACE_FLAG_MULTIPOINT_C_LEAF
| ACE_FLAG_MULTIPOINT_D_LEAF,
1);
if (result < 0)
ACE_ERROR_RETURN ((LM_ERROR,
"Data socket open failed (%N|%l)\n"),
-1);
result = handler->get_socket ()->get_local_addr (*local_addr);
ACE_INET_Addr *session_addr = 0;
if (this->entry_->role () == TAO_FlowSpec_Entry::TAO_AV_CONSUMER)
{
ACE_NEW_RETURN (session_addr,
ACE_INET_Addr,
-1);
session_addr->set (local_addr->get_port_number (),
local_addr->get_host_name ());
}
else
{
session_addr = inet_addr;
}
char sess_buf [BUFSIZ];
session_addr->addr_to_string (sess_buf,
BUFSIZ);
if (TAO_debug_level > 0)
ACE_DEBUG ((LM_DEBUG,
"Session Address is %s\n",
sess_buf));
// Create a destination address for the QoS session. The same
// address should be used for the subscribe call later. A copy
// is made below only to distinguish the two usages of the dest
// address.
ACE_INET_Addr dest_addr (*session_addr);
TAO_AV_UDP_QoS_Session_Helper helper;
this->qos_session_ = helper.open_qos_session (handler,
*session_addr);
if (this->qos_session_ == 0)
ACE_ERROR_RETURN ((LM_ERROR,
"QoS Session Open Failed (%N|%l)\n"),
-1);
else
ACE_DEBUG ((LM_DEBUG,
"QoS session opened successfully\n"));
if (this->entry_->role () == TAO_FlowSpec_Entry::TAO_AV_PRODUCER)
{
//this->qos_session_->source_port (local_addr->get_port_number ());
ACE_INET_Addr* src_addr;
ACE_NEW_RETURN (src_addr,
ACE_INET_Addr (local_addr->get_port_number (),
local_addr->get_host_name ()),
-1);
this->qos_session_->source_addr (src_addr);
}
handler->qos_session (this->qos_session_);
this->qos_manager_ =
handler->get_socket ()->qos_manager ();
AVStreams::QoS qos;
int qos_available = this->endpoint_->qos ().get_flow_qos (this->flowname_.c_str (),
qos);
if (qos_available == 0)
{
ACE_Flow_Spec* ace_flow_spec;
ACE_NEW_RETURN (ace_flow_spec,
ACE_Flow_Spec,
-1);
handler->translate (qos.QoSParams,
ace_flow_spec);
if (helper.set_qos (*ace_flow_spec,
handler) == -1)
ACE_ERROR_RETURN ((LM_ERROR,
"Unable to set QoS (%N|%l)\n"),
-1);
else
{
if( TAO_debug_level > 0)
ACE_DEBUG ((LM_DEBUG,
"(%N,%l) Setting QOS succeeds.\n"));
}
}
TAO_AV_Protocol_Object *object =
this->flow_protocol_factory_->make_protocol_object (this->entry_,
this->endpoint_,
flow_handler,
flow_handler->transport ());
AVStreams::Negotiator_ptr negotiator;
ACE_TRY_EX (negotiator)
{
CORBA::Any_ptr negotiator_any =
this->endpoint_->get_property_value ("Negotiator"
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK_EX (negotiator);
*negotiator_any >>= negotiator;
handler->negotiator (negotiator);
}
ACE_CATCHANY
{
ACE_DEBUG ((LM_DEBUG,
"Negotiator not found for flow %s\n",
this->entry_->flowname ()));
}
ACE_ENDTRY;
flow_handler->protocol_object (object);
this->endpoint_->set_flow_handler (this->flowname_.c_str (),flow_handler);
this->entry_->protocol_object (object);
result = handler->get_socket ()->get_local_addr (*local_addr);
if (result < 0)
ACE_ERROR_RETURN ((LM_ERROR,
"Get local addr failed (%N|%l)\n"),
result);
local_addr->set (local_addr->get_port_number (),
local_addr->get_host_name ());
if (TAO_debug_level > 0)
{
char buf[BUFSIZ];
local_addr->addr_to_string (buf,
BUFSIZ);
ACE_DEBUG ((LM_DEBUG,
"Local Address is %s\n",
buf));
}
entry->set_local_addr (local_addr);
entry->handler (flow_handler);
transport = flow_handler->transport ();
// call activate svc handler.
return this->activate_svc_handler (handler);
}
int
TAO_AV_UDP_QoS_Connector::activate_svc_handler (TAO_AV_UDP_QoS_Flow_Handler *handler)
{
int result = 0;
TAO_AV_UDP_QoS_Session_Helper helper;
result = helper.activate_qos_handler (this->qos_session_,
handler);
if (result == -1)
ACE_ERROR_RETURN ((LM_ERROR,
"(%N,%l) Error in registering the Decorator with the Reactor\n"),
-1);
return result;
}
int
TAO_AV_UDP_QoS_Connector::close (void)
{
return 0;
}
//------------------------------------------------------------
// TAO_AV_UDP_Protocol_Factory
//------------------------------------------------------------
TAO_AV_UDP_QoS_Factory::TAO_AV_UDP_QoS_Factory (void)
{
if (TAO_debug_level > 0)
ACE_DEBUG ((LM_DEBUG,
"TAO_AV_UDP_QoS_Factory::TAO_AV_UDP_QoS_Factory\n"));
}
TAO_AV_UDP_QoS_Factory::~TAO_AV_UDP_QoS_Factory (void)
{
}
int
TAO_AV_UDP_QoS_Factory::match_protocol (const char *protocol_string)
{
if (TAO_debug_level > 0)
ACE_DEBUG ((LM_DEBUG,
"TAO_AV_UDP_QoS_Factory::match_protocol\n"));
if (ACE_OS::strcasecmp (protocol_string,"QoS_UDP") == 0)
return 1;
return 0;
}
TAO_AV_Acceptor*
TAO_AV_UDP_QoS_Factory::make_acceptor (void)
{
if (TAO_debug_level > 0)
ACE_DEBUG ((LM_DEBUG,
"TAO_AV_UDP_QoS_Factory::make_acceptor "));
TAO_AV_Acceptor *acceptor = 0;
ACE_NEW_RETURN (acceptor,
TAO_AV_UDP_QoS_Acceptor,
0);
return acceptor;
}
TAO_AV_Connector*
TAO_AV_UDP_QoS_Factory::make_connector (void)
{
if (TAO_debug_level > 0)
ACE_DEBUG ((LM_DEBUG,
"TAO_AV_UDP_QoS_Factory::make_connector "));
TAO_AV_Connector *connector = 0;
ACE_NEW_RETURN (connector,
TAO_AV_UDP_QoS_Connector,
0);
return connector;
}
int
TAO_AV_UDP_QoS_Factory::init (int /* argc */,
char * /* argv */ [])
{
return 0;
}
//------------------------------------------------------------
// TAO_AV_UDP_Flow_Factory
//------------------------------------------------------------
TAO_AV_UDP_QoS_Flow_Factory::TAO_AV_UDP_QoS_Flow_Factory (void)
{
if (TAO_debug_level > 0)
ACE_DEBUG ((LM_DEBUG,
"TAO_AV_UDP_QoS_Flow_Factory::TAO_AV_UDP_QoS_Flow_Factory\n"));
}
TAO_AV_UDP_QoS_Flow_Factory::~TAO_AV_UDP_QoS_Flow_Factory (void)
{
}
int
TAO_AV_UDP_QoS_Flow_Factory::init (int /* argc */,
char * /* argv */ [])
{
return 0;
}
int
TAO_AV_UDP_QoS_Flow_Factory::match_protocol (const char *flow_string)
{
if (ACE_OS::strcasecmp (flow_string,"QoS_UDP") == 0)
return 1;
return 0;
}
TAO_AV_Protocol_Object*
TAO_AV_UDP_QoS_Flow_Factory::make_protocol_object (TAO_FlowSpec_Entry *entry,
TAO_Base_StreamEndPoint *endpoint,
TAO_AV_Flow_Handler *handler,
TAO_AV_Transport *transport)
{
TAO_AV_Callback *callback = 0;
endpoint->get_callback (entry->flowname (),
callback);
TAO_AV_UDP_Object *object = 0;
ACE_NEW_RETURN (object,
TAO_AV_UDP_Object (callback,
transport),
0);
callback->open (object,
handler);
endpoint->set_protocol_object (entry->flowname (),
object);
return object;
}
ACE_FACTORY_DEFINE (TAO_AV, TAO_AV_UDP_QoS_Flow_Factory)
ACE_STATIC_SVC_DEFINE (TAO_AV_UDP_QoS_Flow_Factory,
ACE_TEXT ("UDP_QoS_Flow_Factory"),
ACE_SVC_OBJ_T,
&ACE_SVC_NAME (TAO_AV_UDP_QoS_Flow_Factory),
ACE_Service_Type::DELETE_THIS |
ACE_Service_Type::DELETE_OBJ,
0)
ACE_FACTORY_DEFINE (TAO_AV, TAO_AV_UDP_QoS_Factory)
ACE_STATIC_SVC_DEFINE (TAO_AV_UDP_QoS_Factory,
ACE_TEXT ("UDP_QoS_Factory"),
ACE_SVC_OBJ_T,
&ACE_SVC_NAME (TAO_AV_UDP_QoS_Factory),
ACE_Service_Type::DELETE_THIS |
ACE_Service_Type::DELETE_OBJ,
0)
#endif /* ACE_HAS_RAPI || ACE_HAS_WINSOCK2_GQOS */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -