#include <iostream>
using namespace std;
#include "ace/Init_ACE.h"
#include "ace/INET_Addr.h"
#include "ace/Proactor.h"
#include "ace/Asynch_Acceptor.h"
#include "ace/Asynch_Connector.h"
class MyServiceHandler;
typedef ACE_Asynch_Acceptor<MyServiceHandler> ServiceAcceptor;
typedef ACE_Asynch_Connector<MyServiceHandler> ServiceConnector;
class MyServiceHandler : public ACE_Service_Handler
{
public:
virtual ~MyServiceHandler();
virtual void open(ACE_HANDLE new_handle, ACE_Message_Block &message_block);
virtual void handle_read_stream (const ACE_Asynch_Read_Stream::Result &result);
virtual void handle_write_stream(const ACE_Asynch_Write_Stream::Result &result);
virtual void addresses(const ACE_INET_Addr &remote_address, const ACE_INET_Addr &local_address);
protected:
ACE_Asynch_Read_Stream reader;
ACE_Asynch_Write_Stream writer;
};
MyServiceHandler::~MyServiceHandler()
{
ACE_OS::closesocket(handle());
}
void MyServiceHandler::open(ACE_HANDLE new_handle, ACE_Message_Block &message_block)
{
this->handle(new_handle);
if( reader.open(*this, handle()) == -1 || writer.open(*this, handle()) == -1 ) {
return;
}
ACE_Message_Block* pMB = new ACE_Message_Block(512);
reader.read(*pMB, 512);
}
void MyServiceHandler::handle_read_stream(const ACE_Asynch_Read_Stream::Result &result)
{
if( !result.success() ) {
return;
}
ACE_Message_Block* pMB = &result.message_block();
*(pMB->wr_ptr()+1) = 0;
cout << result.bytes_to_read() << " "
<< result.bytes_transferred() << " "
<< result.message_block().wr_ptr()
<< endl;
pMB->length(0);
char buf[32] = {0};
ACE_OS::sprintf(buf, "Client %d", this->handle());
pMB->copy(buf, ACE_OS::strlen(buf));
writer.write(*pMB, pMB->length());
}
void MyServiceHandler::handle_write_stream(const ACE_Asynch_Write_Stream::Result &result)
{
result.message_block().release();
delete this;
}
void MyServiceHandler::addresses(const ACE_INET_Addr &remote_address, const ACE_INET_Addr &local_address)
{
cout << remote_address.get_ip_address() << endl;
}
int main(int argc, char* argv[])
{
ACE::init();
ACE_INET_Addr addr(10000);
ServiceAcceptor acceptor;
if( acceptor.open(addr) == -1 ) {
cout << "Open port failed ";
return -1;
}
cout << "Listen port ok ... ";
ACE_Proactor::instance()->proactor_run_event_loop();
ACE::fini();
return 0;
}