#include <iostream>
using namespace std;
#include "ace/Init_ACE.h"
#include "ace/INET_Addr.h"
#include "ace/SOCK_Stream.h"
#include "ace/SOCK_Connector.h"
#include "ace/SOCK_Acceptor.h"
#include "ace/Acceptor.h"
#include "ace/Reactor.h"
#include "ace/Dev_Poll_Reactor.h"
#include "ace/Event_Handler.h"
#include "ace/Svc_Handler.h"
class TestHandler;
typedef ACE_Acceptor<TestHandler, ACE_SOCK_ACCEPTOR> TestAccptor;
class TestHandler : public ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH>
{
public:
typedef ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH> super;
int open(void * /**//* = 0 */);
int handle_input(ACE_HANDLE fd /**//* = ACE_INVALID_HANDLE */);
int handle_output(ACE_HANDLE fd /**//* = ACE_INVALID_HANDLE */);
int handle_close(ACE_HANDLE /**//* = ACE_INVALID_HANDLE */, ACE_Reactor_Mask /**//* = ACE_Event_Handler::ALL_EVENTS_MASK */);
};
int TestHandler::open(void * )
{
return reactor()->register_handler(this, RWE_MASK);
}
int TestHandler::handle_input(ACE_HANDLE fd )
{
char buf[128] = {0};
int ret = peer().recv(buf, 127);
if( ret <= 0 ) {
return -1;
}
buf[ret] = 0;
printf("%s ", buf);
return 0;
}
int TestHandler::handle_output(ACE_HANDLE fd )
{
char buf[128] = {0};
ACE_OS::sprintf(buf, "client %u", this->get_handle());
peer().send(buf, strlen(buf));
reactor()->cancel_wakeup(this, WRITE_MASK); // Select is LT
return 0;
}
int TestHandler::handle_close(ACE_HANDLE , ACE_Reactor_Mask )
{
return reactor()->register_handler(this, RWE_MASK);
}
int TestHandler::handle_input(ACE_HANDLE fd )
{
char buf[128] = {0};
int ret = peer().recv(buf, 128);
if( ret <= 0 ) {
return -1;
}
buf[ret] = 0;
printf("%s ", buf);
return 0;
}
int TestHandler::handle_output(ACE_HANDLE fd )
{
char buf[128] = {0};
ACE_OS::sprintf(buf, "client %u", this->get_handle());
peer().send(buf, strlen(buf));
reactor()->cancel_wakeup(this, WRITE_MASK); // Select is LT
return 0;
}
int TestHandler::handle_close(ACE_HANDLE , ACE_Reactor_Mask )
{
delete this;
return 0;
}
int main(void)
{
ACE::init();
ACE_Dev_Poll_Reactor dev_reactor(1024);
ACE_Reactor reactor(&dev_reactor);
ACE_Reactor::instance(&reactor);
TestAccptor accptor;
ACE_INET_Addr addr(10000);
if( accptor.open(addr) == -1 ) {
cout << "Open port failed .. " << endl;
return -1;
}
cout << "Open port ok .. " << endl;
ACE_Reactor::instance()->run_reactor_event_loop();
ACE::fini();
return 0;
}