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;
}
相关文章推荐
- 探究 ACE 的 Proactor_Test 示例中的 Acceptor 和 Connector 分别如何与 Proactor 关联。
- [ACE_Proactor网络通信示例-Part.1]
- (转)ACE示例3 - ACE Proactor
- ACE前摄器Proactor模式示例程序
- [ACE_Proactor网络通信示例-Part.2]
- [ACE_Proactor网络通信示例-Part.3]
- ACE Proactor模型示例
- ACE_Proactor网络通信示例
- ACE示例 - ACE Proactor
- ACE示例3 - ACE Proactor
- ACE Proactor模式的一个问题
- ACE前摄器Proactor模式
- 关于ACE中的Proactor的改造问题
- ACE 安装指南及示例
- ACE中的Proactor介绍和应用实例
- 【风】的ACE笔记(6) Proactor机制下的异步SOCKET开发
- ACE前摄器Proactor模式
- ACE Proactor机制下的异步SOCKET开发
- ACE_Proactor UDP V2.0
- ACE中的两种I/O多路复用模式 Reactor 和 Proactor 的比较