1. 程式人生 > >boost::asio 非同步主動連線多個伺服器

boost::asio 非同步主動連線多個伺服器

  1. #include "ATC.hpp"
  2. namespace PWRD{
  3.     namespace Network{
  4.         //-------------------------------------------------------------------------
  5.         //Session
  6.         //-------------------------------------------------------------------------
  7.         Session::Session(boost::asio::ip:
    :tcp::socket &_socket, boost::asio::io_service &io_service, const char *path)
  8.             :socket_(_socket),
  9.             heartbeat_timer_(io_service),
  10.             stopped_(false)
  11.         {
  12.             callback_ = new Callback(path);
  13.             input_stream_ = new char[MAXLEN]
    ;
  14.         }
  15.         Session::~Session(){
  16.             delete callback_;
  17.             delete input_stream_;    
  18.         }
  19.         void Session::start(){
  20.             start_read();
  21.             start_write_heartbeat();
  22.         }
  23.         void Session::stop(){
  24.             stopped_ =
     true;
  25.             socket_.close();
  26.             heartbeat_timer_.cancel();
  27.         }
  28.         void Session::start_read(){
  29.             socket_.async_receive( 
  30.                     boost::asio::buffer(&header_, HEADERLEN),
  31.                     boost::bind(&Session::handle_read_header, this, 
  32.                         boost::asio::placeholders::error)
  33.                     );
  34.         }
  35.         void Session::handle_read_header(const boost::system::error_code& ec){
  36.             if(stopped_)
  37.                 return;    
  38.             if(!ec){
  39.                 if(HEARTBEAT == header_.type){
  40.                     logs.write_log(NORMAL, "info:Receive heartbeat message");    
  41.                     //heartbeat_timer_.expires_from_now(boost::posix_time::seconds(SECONDS));
  42.                     start_read();
  43.                 }    
  44.                 else if(PACKET == header_.type){
  45.                     socket_.async_receive(
  46.                             boost::asio::buffer(input_stream_, header_.length),
  47.                             boost::bind(&Session::handle_read_body, this, 
  48.                                 boost::asio::placeholders::error)
  49.                             );
  50.                     logs.write_log(NORMAL, "info:Receive Packet message: %d bytes", header_.length);    
  51.                 }
  52.             }
  53.             else{
  54.                 logs.write_log(NORMAL, "Error on receive: %s", (ec.message()).c_str());    
  55.                 stop();
  56.             }
  57.         }
  58.         void Session::handle_read_body(const boost::system::error_code& ec){
  59.             if(stopped_)
  60.                 return;    
  61.             if(!ec){
  62.                 if(packet_message_.Parse(input_stream_, header_.length)){
  63.                     Packet * packet = packet_message_.pack();
  64.                     logs.write_log(NORMAL, "info:Receive data: %s", (packet->data()).c_str());
  65.                     callback_->Write(packet);            
  66.                 }
  67.                 start_read();
  68.             }
  69.             else{
  70.                 logs.write_log(NORMAL, "Error on receive: %s", (ec.message()).c_str());    
  71.                 stop();
  72.             }
  73.         }
  74.         void Session::start_write_heartbeat(){
  75.             if(stopped_)
  76.                 return ;    
  77.             Header header;
  78.             header.length = 0;
  79.             header.type = HEARTBEAT;
  80.             boost::asio::async_write(socket_, boost::asio::buffer(&header, HEADERLEN),
  81.                     boost::bind(&Session::handle_write_heartbeat, this,
  82.                         boost::asio::placeholders::error    ));
  83.             logs.write_log(NORMAL, "info:Send heartbeat message--->");
  84.         }
  85.         void Session::handle_write_heartbeat(const boost::system::error_code& ec){
  86.             if(stopped_)
  87.                 return ;    
  88.             if(!ec){
  89.                 heartbeat_timer_.expires_from_now(boost::posix_time::seconds(SECONDS));
  90.                 heartbeat_timer_.async_wait(boost::bind(&Session::start_write_heartbeat, this));
  91.             }
  92.             else{
  93.                 logs.write_log(NORMAL, "info:Error on heartbeat: %s ", (ec.message()).c_str());
  94.                 stop();
  95.             }
  96.         }
  97.         void Session::start_delivery(){
  98.             if(stopped_)
  99.                 return ;    
  100.             /* *
  101.              * SQLite append
  102.              * */
  103.             Configure conf;
  104.             conf_message_.set_conf(conf);
  105.             conf_message_.Serialize();
  106.             header_.length = conf_message_.length();
  107.             header_.type = CONFIG;
  108.             socket_.async_send(
  109.                     boost::asio::buffer(&header_,    HEADERLEN),
  110.                     boost::bind(&Session::handle_write_config, this, _1, conf)
  111.                     //boost::asio::placeholders::error, conf)
  112.                 );
  113.         }
  114.         void Session::delivery(string &ip){
  115.             if(stopped_)
  116.                 return ;    
  117.             /* *
  118.              * SQLite append
  119.              * */
  120.             Configure conf;
  121.             conf_message_.set_conf(conf);
  122.             conf_message_.Serialize();
  123.             header_.length = conf_message_.length();
  124.             header_.type = CONFIG;
  125.             socket_.async_send(
  126.                     boost::asio::buffer(&header_,    HEADERLEN),
  127.                     boost::bind(&Session::handle_write_config, this, _1, conf)
  128.                     //boost::asio::placeholders::error, conf)
  129.                 );
  130.         }
  131.         void Session::handle_write_config(const boost::system::error_code& ec, Configure &conf){
  132.             if(stopped_)
  133.                 return ;    
  134.             if(!ec){
  135.                 socket_.async_send(
  136.                         boost::asio::buffer(conf_message_.data(), 
  137.                             conf_message_.length

    相關推薦

    boost::asio 非同步主動連線伺服器

    #include "ATC.hpp" namespace PWRD{     namespace Network{         //-------------------------------------------------------------------------

    frp客戶端,實現一臺雲伺服器連線區域網內的主機,埠轉發

    很簡單,用不同的frps.ini就行 假設你原來已經啟動了一個frps.ini,現在想再加一個。 那就新建一個frps1.ini,然後埠和之前的不一樣就行。 假設之前有一個7000的埠了,那現在這個用7001就可以啦~ cp frps.ini frps1.ini 如

    linux下socket程式設計實現一個伺服器連線客戶端

    使用socekt通訊一般步驟     1)伺服器端:socker()建立套接字,繫結(bind)並

    sql中連線結果集查詢符合要求的欄位

    1.sql中將查詢到的結果集作為一個表去連線多個結果集查詢想要的欄位,適用於查詢複雜邏輯的欄位; 舉例: select dd.base_grade_value,count(distinct dd.userid) from  (select cc.school_id,bb.us

    本地ssh key連線git賬號

    在開發過程中,可能需要在本地同時連線到多個git賬戶,如公司內部git和github,但是一個使用者的ssh key只能連線到一個git賬戶,這就需要建立多個ssh key,分別連線到不同的賬戶。具體步驟如下: 1.生成ssh key ssh-keygen -t rsa -b 4096 -C

    Windows 2012設定允許單個使用者連線會話的方法

    WINDOWS 2012 伺服器預設只允許單個使用者連線一個遠端桌面會話,如果已有連線登陸,另外的連線再登陸會踢掉之前的連線。如果需要兩個遠端桌面同時連線   找到:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Serv

    如何在 Laravel 中連線 MySQL 資料庫

      第一步、定義資料庫連結 config/database.php <?php return [ 'default' => 'mysql', 'connections' => [ # 主要資料庫連線 'mysql' => [ 'driver' =&g

    matlab字串連線(字串)的經驗

    參考 matlab中字串連線的3種方法  文章,實驗遇到的一些小白問題,如有問題希望大神們給予指導。 Matlab中,兩個或多個字串連線常用的三種方法,如下: 背景知識: 1、char 和 string 區別 從定義的角度來說,單引號‘ ’定義的為char型別,雙

    手把手教你從原始碼開始搭建自己的以太坊公鏈(四)部署及連線節點

    1. 使用相同的創世區塊檔案genesis.json 創世區塊genesis.json檔案內容如下: { "config": { "chainId": 100, "homestea

    利用 apache2 在伺服器上部署專案實踐

    一、背景 應專案需求,要在兩個遠端伺服器上利用 apache2 部署多個專案(前後端分離): Server (Nodejs/Koa2) Android APP、Apple APP (ionic3) 現將部署過程及遇到的問題記錄下來。 二、伺服器配置說明

    使用VPN連線站點的配置方法(圖文詳解)

    以下實戰,配置了兩個站點的VPN請求撥號連線,隨著公司發展在上海也建立一個區域網,現在需要在BJ-VPN上新增到上海網路的請求撥號介面“toSH”,在上海網路的SH-VPN新增到北京網路的請求撥號介面“toBJ”,在SJZ-VPN上新增到上海網路的請求撥號介面“toSH”,在

    java連線mongoDB資料庫

    開發需求: 1.客戶端聊天過程中需要根據玩家uid和所在聊天室ID,去對應服的遊戲資料庫查詢該玩家的使用者資訊,並返回給客戶端。 2.PVP記錄、離線訊息需要記錄到另一個數據庫。 之前的mongoDB工具類只考慮到連線一個數據庫,現在需要根據配置檔案,連線多個數據庫 稍微

    nginx 代理伺服器——server方式

    #user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/ng

    boost asio非同步讀寫網路聊天室【官方示例】

    // // chat_message.hpp // ~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2010 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distri

    Boost.Asio學習之簡單的HTTP伺服器的完善

    以上鍊接裡面的原始碼至少有下面兩個問題: 1.只解析了http協議的頭部資訊(header)。 2.沒有對tcp資料包進行合併的處理,如果客戶端的tcp資料是分包發過來的,該程式碼的解析會出錯,所以這是不可預料的錯誤。 以下是修改後的部分程式碼: 1

    scp批量複製檔案到伺服器

    一、安裝expectyum install expect -y二、編輯自動輸入密碼指令碼#!/usr/bin/expect  set timeout 20    if { [llength $argv] < 2} {      puts "Usage:"      pu

    解決伺服器共享session的幾方案

    轉載地址:http://toutiao.com/a6294758409293086977/  博主還是希望大家去原文地址看,博主下面寫的也都在原文中有解釋,嘿嘿,看人家比看我清晰多了 A、檔案方式:這種方式,將檔案作為一個map,當新增一個數據的時候,就在檔案中增加類似這樣的一條資料:angOwberup

    Git 使用Git bash將本地倉庫連線遠端倉庫

    總結:  git remote add gitee +gitee倉庫的地址git push coding master git push gitee mastergit push origin master關聯多個倉庫時需要指定具體的倉庫起初我是用github的,後來發現了國內的coding和碼雲也超好用啊。

    在叢集中部署伺服器如何解決SESSION問題?

    三種方式: 1. Session複製,Web伺服器之間同步session資訊。 2. 負載均衡支援會話親和,相同的會話請求傳送給同一個Web伺服器。 3. Session不存在Web伺服器本地,而是放在快取伺服器如Redis上。

    boost asio非同步讀寫網路聊天程式客戶端 例項詳解

    // // chat_server.cpp // ~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2013 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boos