SObjectizer  5.1
so_5_transport/raw_channe/tcp_srv

tcp_srv.cpp

/*
Пример, демонстрирующий работу с серверным raw-соединением.
Создается серверное соединение и отображаются события,
которые происходят с этим соединением.
*/
#include <iostream>
#include <ace/OS_main.h>
// Базовые заголовочные файлы SObjectizer.
#include <so_5/rt/h/rt.hpp>
// Диспетчер активных агентов.
// Описание агента, который обслуживает серверный
// канал и средств для создания каналов.
// Средства для создания tcp соединений.
//
// Класс агента, который будет обрабатывать данные.
//
class a_main_t
:
{
typedef so_5_transport::a_server_base_t base_type_t;
public:
a_main_t(
const so_5::rt::mbox_ref_t & notification_mbox )
:
base_type_t( env, notification_mbox )
{}
virtual ~a_main_t()
{}
// Обработка статуса создания сокета.
virtual void
// Реакция на подключение клиента.
virtual void
// Реакция на неудавшееся подключение клиента.
virtual void
// Реакция на отключение клиента.
virtual void
// Реакция на поступление данных в канал.
virtual void
private:
};
void
a_main_t::so_handle_create_server_socket_result(
{
std::cout << "\na_main_t::so_handle_create_server_socket_result\n";
if( msg.m_succeed )
std::cout << "server socket successfuly created.";
else
{
std::cout << "server socket not created.";
// Останавливаем выполнение среды SO.
so_environment().stop();
}
std::cout << std::endl;
}
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;
// Активируем чтение из сокета.
}
void
a_main_t::so_handle_client_failed(
{
std::cout << "\na_main_t::so_handle_client_failed\n"
"reason: "<< msg.m_reason << std::endl;
}
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 );
out_trx->ostream().write( &data[0], stream_size );
out_trx->commit();
std::cout << std::endl;
}
in_trx->commit();
}
void
init( so_5::rt::so_environment_t & env, const std::string & server_addr )
{
// Создаем кооперацию
so_5::rt::nonempty_name_t( "test_server_application" ),
"active_obj" ) );
acceptor_creator( env );
std::unique_ptr< a_server_transport_agent_t > ta(
new a_server_transport_agent_t(
env,
acceptor_creator.create( server_addr ) ) );
new a_main_t( env, ta->query_notificator_mbox() ) );
coop->add_agent( serv );
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 )
{
std::string server_addr( argv[ 1 ] );
&init,
server_addr,
.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_srv <port>" << std::endl;
return 0;
}

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