SObjectizer  5.1
so_5_transport/raw_channel/tcp_cln

tcp_cln.cpp

/*
Пример, демонстрирующий работу с серверным raw-соединением.
Производится попытка подключения к указанному адресу,
после чего в соединение отсылаются все необязательные
аргументы командной строки. После этого осуществляется
переход в режим чтения и отображения данных.
*/
#include <iostream>
#include <vector>
#include <string>
#include <ace/OS_main.h>
// Базовые заголовочные файлы SObjectizer.
#include <so_5/rt/h/rt.hpp>
// Диспетчер активных агентов.
// Описание агента, который обслуживает клиентский
// канал и средств для создания каналов.
// Средства для создания tcp соединений.
//
// Класс агента, который будет работать с серверным соединением.
//
class a_main_t
:
{
typedef so_5_transport::a_client_base_t base_type_t;
public :
a_main_t(
const so_5::rt::mbox_ref_t & notification_mbox,
const std::vector< std::string > & rest_of_argv )
:
base_type_t( env, notification_mbox ),
m_rest_of_argv( rest_of_argv )
{}
virtual ~a_main_t()
{}
// Реакция на подключение клиента.
virtual void
// Реакция на неудавшееся подключение клиента.
virtual void
// Реакция на отключение клиента.
virtual void
// Реакция на поступление данных в канал.
virtual void
private :
const std::vector< std::string > m_rest_of_argv;
};
void
a_main_t::so_handle_client_connected(
{
std::cout << "\na_main_t::so_handle_client_connected\n"
"channel id: " << msg.m_channel_id << "\n"
"local address: "
"remote address: "
<< msg.m_controller->remote_address_as_string() << std::endl;
// Активируем чтение из сокета.
for( size_t i = 0; i < m_rest_of_argv.size(); ++i )
{
out_trx->ostream().write(
m_rest_of_argv[ i ].data(),
m_rest_of_argv[ i ].size() );
char newlines [] = "\r\n\r\n";
out_trx->ostream().write( newlines, 4 );
}
out_trx->commit();
}
void
a_main_t::so_handle_client_failed(
{
std::cout << "\na_main_t::so_handle_client_failed\n"
"reason: "<< msg.m_reason << std::endl;
so_environment().stop();
}
void
a_main_t::so_handle_client_disconnected(
{
std::cout << "\na_main_t::so_handle_client_disconnected\n"
"channel id: " << msg.m_channel_id << "\n"
"reason: "<< msg.m_reason << std::endl;
}
void
a_main_t::so_handle_incoming_package(
{
const size_t stream_size = in_trx->stream_size();
if( stream_size > 0 )
{
std::cout << "\na_main_t::so_handle_incoming_package\n"
"channel id: " << msg.m_channel_id << "\n"
"available data size: " << stream_size << "\n"
"data:\n";
std::vector< char > data( stream_size );
in_trx->istream().read( &data[0], stream_size );
std::cout.write( &data[0], stream_size );
std::cout << std::endl;
}
in_trx->commit();
}
struct client_data_t
{
std::string m_server_addr;
std::vector< std::string > m_rest_of_argv;
void
{
// Создаем кооперацию
so_5::rt::nonempty_name_t( "test_client_application" ),
"active_obj" ) );
connector_creator( env );
std::unique_ptr< a_client_transport_agent_t > ta(
new a_client_transport_agent_t(
env,
connector_creator.create( m_server_addr ) ) );
new a_main_t(
env,
ta->query_notificator_mbox(),
m_rest_of_argv ) );
coop->add_agent( client );
coop->add_agent( so_5::rt::agent_ref_t( ta.release() ) );
// Регистрируем кооперацию
so_5::ret_code_t rc = env.register_coop( std::move( coop ) );
// Если не удается зарегистрировать кооперацию
// напишем сообщение об ошибке.
if( 0 != rc )
std::cerr << "reg coop ret_code = " << rc << "\n\n";
else
{
std::cout << "Type \"quit\" to quit." << std::endl;
std::string cmd;
do
{
std::cin >> cmd;
} while( cmd != "quit" );
}
env.stop();
}
};
int
main( int argc, char ** argv )
{
if( 2 <= argc )
{
client_data_t client_data;
client_data.m_server_addr = argv[ 1 ];
for( size_t i = 2; i < argc; ++i )
client_data.m_rest_of_argv.push_back( argv[ i ] );
client_data,
&client_data_t::init,
.add_named_dispatcher(
so_5::rt::nonempty_name_t( "active_obj" ),
.add_layer(
std::unique_ptr< so_5_transport::reactor_layer_t >(
}
else
std::cerr << "sample.so_5_transport.raw_channel.tcp_cln <port>" << std::endl;
return 0;
}

Документация по SObjectizer v.5.1 'Джимара'. Последние изменения: Ср 15 Май 2013 12:56:18. Создано системой  doxygen1.8.3.1 Intervale SourceForge.net Logo