您的位置:首页 > 其它

ACE_Proactor示例

2007-11-01 09:49 411 查看


#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;


}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: