boost::asio 非同步主動連線多個伺服器
-
#include "ATC.hpp"
-
namespace PWRD{
-
namespace Network{
-
//-------------------------------------------------------------------------
-
//Session
-
//-------------------------------------------------------------------------
-
Session::Session(boost::asio::ip:
-
:socket_(_socket),
-
heartbeat_timer_(io_service),
-
stopped_(false)
-
{
-
callback_ = new Callback(path);
-
input_stream_ = new char[MAXLEN]
-
}
-
Session::~Session(){
-
delete callback_;
-
delete input_stream_;
-
}
-
void Session::start(){
-
start_read();
-
start_write_heartbeat();
-
}
-
void Session::stop(){
-
stopped_ =
-
socket_.close();
-
heartbeat_timer_.cancel();
-
}
-
void Session::start_read(){
-
socket_.async_receive(
-
boost::asio::buffer(&header_, HEADERLEN),
-
boost::bind(&Session::handle_read_header, this,
-
boost::asio::placeholders::error)
-
);
-
}
-
void Session::handle_read_header(const boost::system::error_code& ec){
-
if(stopped_)
-
return;
-
if(!ec){
-
if(HEARTBEAT == header_.type){
-
logs.write_log(NORMAL, "info:Receive
heartbeat message");
-
//heartbeat_timer_.expires_from_now(boost::posix_time::seconds(SECONDS));
-
start_read();
-
}
-
else if(PACKET == header_.type){
-
socket_.async_receive(
-
boost::asio::buffer(input_stream_, header_.length),
-
boost::bind(&Session::handle_read_body, this,
-
boost::asio::placeholders::error)
-
);
-
logs.write_log(NORMAL, "info:Receive
Packet message: %d bytes", header_.length);
-
}
-
}
-
else{
-
logs.write_log(NORMAL, "Error
on receive: %s", (ec.message()).c_str());
-
stop();
-
}
-
}
-
void Session::handle_read_body(const boost::system::error_code& ec){
-
if(stopped_)
-
return;
-
if(!ec){
-
if(packet_message_.Parse(input_stream_, header_.length)){
-
Packet * packet = packet_message_.pack();
-
logs.write_log(NORMAL, "info:Receive
data: %s", (packet->data()).c_str());
-
callback_->Write(packet);
-
}
-
start_read();
-
}
-
else{
-
logs.write_log(NORMAL, "Error
on receive: %s", (ec.message()).c_str());
-
stop();
-
}
-
}
-
void Session::start_write_heartbeat(){
-
if(stopped_)
-
return ;
-
Header header;
-
header.length = 0;
-
header.type = HEARTBEAT;
-
boost::asio::async_write(socket_, boost::asio::buffer(&header, HEADERLEN),
-
boost::bind(&Session::handle_write_heartbeat, this,
-
boost::asio::placeholders::error ));
-
logs.write_log(NORMAL, "info:Send
heartbeat message--->");
-
}
-
void Session::handle_write_heartbeat(const boost::system::error_code& ec){
-
if(stopped_)
-
return ;
-
if(!ec){
-
heartbeat_timer_.expires_from_now(boost::posix_time::seconds(SECONDS));
-
heartbeat_timer_.async_wait(boost::bind(&Session::start_write_heartbeat, this));
-
}
-
else{
-
logs.write_log(NORMAL, "info:Error
on heartbeat: %s ", (ec.message()).c_str());
-
stop();
-
}
-
}
-
void Session::start_delivery(){
-
if(stopped_)
-
return ;
-
/* *
-
* SQLite append
-
* */
-
Configure conf;
-
conf_message_.set_conf(conf);
-
conf_message_.Serialize();
-
header_.length = conf_message_.length();
-
header_.type = CONFIG;
-
socket_.async_send(
-
boost::asio::buffer(&header_, HEADERLEN),
-
boost::bind(&Session::handle_write_config, this, _1, conf)
-
//boost::asio::placeholders::error, conf)
-
);
-
}
-
void Session::delivery(string &ip){
-
if(stopped_)
-
return ;
-
/* *
-
* SQLite append
-
* */
-
Configure conf;
-
conf_message_.set_conf(conf);
-
conf_message_.Serialize();
-
header_.length = conf_message_.length();
-
header_.type = CONFIG;
-
socket_.async_send(
-
boost::asio::buffer(&header_, HEADERLEN),
-
boost::bind(&Session::handle_write_config, this, _1, conf)
-
//boost::asio::placeholders::error, conf)
-
);
-
}
-
void Session::handle_write_config(const boost::system::error_code& ec, Configure &conf){
-
if(stopped_)
-
return ;
-
if(!ec){
-
socket_.async_send(
-
boost::asio::buffer(conf_message_.data(),
-
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