ACE_Reactor模式(handle_input的工作)V1.0
handle_input的呼叫時機
我們通過Acceptor-Connector模式一(Acceptor的工作)知道了接受器主要是當連線建立之後建立服務處理器,並啟動服務處理的open方法來實現正式通訊流程的。
所以,open方法中總是有跟socket有關的read,write方法的呼叫。當這些read,write方法執行完畢之後,就會呼叫handle_read方法或handle_write方法。
handle_input的工作
由於handle_input函式是處理read操作的後事的,所以這裡涉及到還要不要有後續:
(1)如果read完畢就結束流程,那這裡只需要返回-1,由反應器來呼叫服務處理器的handle_close()方法,而這個方法的預設實現就是delete this
(2)如果read完畢並不結束流程,那就繼續執行其他流程,比如用write操作給對端寫返回資料。
下面的例子僅僅展示handle_input什麼也不做,用於結束流程的情況:
server.cpp
功能:收到客戶端的資料之後就列印出來,然後結束流程
#include <ace/Log_Msg.h>
#include "ace/Svc_Handler.h"
#include <ace/Acceptor.h>
#include "ace/SOCK_Acceptor.h"
#include "ace/INET_Addr.h"
#include "ace/Reactor.h"
#include "ace/Message_Block.h"
class My_Time_Server_Handler : public ACE_Svc_Handler<ACE_SOCK_Stream,ACE_NULL_SYNCH>
{
public:
~My_Time_Server_Handler();
//由接收器在接收到對端的連線請求之後呼叫此方法
virtual int open(void *)
{
ACE_DEBUG((LM_DEBUG,"one client connection established.\n"));
//當有TCP連線收到了資料之後,會呼叫這個類的handle_input()方法來處理
//所以需要實現handle_input()方法
ACE_Reactor::instance()->register_handler(this,ACE_Event_Handler::READ_MASK);
ACE_Message_Block* blk = new ACE_Message_Block(1024);
this->peer().recv_n(blk->wr_ptr(),1024);
ACE_DEBUG((LM_DEBUG,"服務端收到:%s\n",blk->rd_ptr()));
return 0;// OK
}
//這個方法僅僅是被反應器呼叫,但是具體做什麼事,由當前類自己說了算
//當前實現是將收到的資料列印出來
virtual int handle_input (ACE_HANDLE fd = ACE_INVALID_HANDLE)
{
ACE_DEBUG((LM_DEBUG,"服務處理器read完畢\n"));
//此處返回-1會讓反應器呼叫服務處理器的handle_close()方法,
//而這個方法的預設實現就是delete this
return -1;
}
};
My_Time_Server_Handler::~My_Time_Server_Handler()
{
ACE_DEBUG((LM_DEBUG,"~My_Time_Server_Handler()\n"));
}
int main(int argc, char *argv[])
{
ACE_INET_Addr local_addr(1500);
ACE_Acceptor<My_Time_Server_Handler,ACE_SOCK_Acceptor> acceptor;
acceptor.open(local_addr,ACE_Reactor::instance());
//截過連線資訊
ACE_Reactor::instance()->run_reactor_event_loop();
return 0;
}
client.cpp
功能:向服務端傳送一個字串,由服務端負責列印出來
#include <ace/Log_Msg.h>
#include <ace/SOCK_Connector.h>
#include "ace/INET_Addr.h"
#include <string>
using namespace std;
int main(int argc, char *argv[])
{
ACE_INET_Addr addr(1500,"127.0.0.1"); //remote address
ACE_SOCK_Connector client_connetor; // connetor for socket client
ACE_SOCK_Stream sock_stream; // stream is for socket read/write
if(client_connetor.connect(sock_stream,addr)==-1) //connect to remote address
{
ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("(%P|%t) %p\n"),ACE_TEXT ("connection failed!")));
return -1;
}
string command_to_server("give_me_time");
int send_lenth;
if ((send_lenth =sock_stream.send_n(command_to_server.c_str(),command_to_server.size())) == -1)
{
ACE_DEBUG((LM_DEBUG,"客戶端傳送獲取時間命令失敗!\n"));
}
if (sock_stream.close () == -1) //close the connection
{
ACE_ERROR ((LM_ERROR,ACE_TEXT ("(%P|%t) %p\n"),ACE_TEXT ("sock close")));
return -1;
}
return 0;
}
相關文章
- ACE_Reactor系列React
- ACE_Reactor (V1.01)React
- 安全開發工作總結v1.0
- 工作中常用的設計模式--策略模式設計模式
- 防火牆模式工作模式簡介防火牆模式
- 工作中常用的設計模式--介面卡模式設計模式
- kube-proxy的三種工作模式模式
- 虛擬化的五種工作模式模式
- Thrift server端的幾種工作模式分析Server模式
- MacBook Pro 高功率模式:是如何工作的?Mac模式
- kube-proxy IPVS 模式的工作原理模式
- Apache 工作的三種模式:Prefork、Worker、EventApache模式
- 談談工作中的設計模式設計模式
- Linux中VIM的工作模式詳解!Linux模式
- Nginx 工作模式和程式模型Nginx模式模型
- go併發-工作池模式Go模式
- 快速掌握 Go 工作區模式Go模式
- 遠端辦公 | 適應時代的工作模式模式
- CLR的GC工作模式介紹(Workstation和Server)GC模式Server
- 談談創業公司技術的工作模式創業模式
- AI 開發的捷徑:工作流模式AI模式
- [ARM] ARM處理器的7種工作模式和2種工作狀態模式
- Apache安裝部署及工作模式Apache模式
- 面試官:RabbitMQ有哪些工作模式?面試MQ模式
- 共享辦公室,開放多元化的新工作模式模式
- 關於Apache的兩種工作模式prefork和workerApache模式
- Hadoop2.7實戰v1.0之Hive-2.0.0+MySQL本地模式安裝HadoopHiveMySql模式
- SVGA Flutter v1.0 全新的動畫格式SVGFlutter動畫
- 我工作的那點事--學習《設計模式》例項應用(strategy模式)設計模式
- 我工作的那點事--學習《設計模式》例項應用(Mediator模式)設計模式
- 我工作的那點事--學習《設計模式》例項應用(factory模式)設計模式
- 我工作的那點事--學習《設計模式》例項應用(Prototype模式)設計模式
- 我工作的那點事--學習《設計模式》例項應用(Builder模式)設計模式UI
- 我工作的那點事--學習《設計模式》例項應用(Observer模式)設計模式Server
- 我工作的那點事--學習《設計模式》例項應用(decorator模式)設計模式
- SQL Server 的備份和恢復模式的工作方式SQLServer模式
- 檢視無線網路卡工作模式模式
- Go 1.18:工作區模式workspace modeGo模式