代码并未在作者github上提供

将书中代码敲至vc 并调试运行 依赖BOOST库

编译环境vs2015 boost1.59

// Client.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <boost/thread.hpp>
#include <thread>
#include <string>
#include "../Common/RWHandler.h" class Connector
{
public:
Connector(io_service& ios, const string& strIp, short port) :m_ios(ios), m_socket(ios),
m_serverAddr(tcp::endpoint(address::from_string(strIp), port)), m_isConnected(false),
m_chkThread(nullptr)
{
CreateEventHandler(ios);
}
~Connector(){}
bool Start()
{
m_eventHandler->GetSocket().async_connect(m_serverAddr, [this](const boost::system::error_code& error)
{
if (error)
{
HandleConnectError(error);
return;
}
cout << "connect ok" << endl;
m_isConnected = true;
m_eventHandler->HandleRead();
});
boost::this_thread::sleep(boost::posix_time::seconds(1));
return m_isConnected;
} bool IsConnected()const
{
return m_isConnected;
} void Send(char* data, int len)
{
if (!m_isConnected)
return;
m_eventHandler->HandleWrite(data,len);
} void AsyncSend(char* data, int len)
{
if (!m_isConnected)
return;
//m_eventHandler->HandleAsyncWrite(data, len);
m_eventHandler->HandleWrite(data, len);
}
private:
void CreateEventHandler(io_service& ios)
{
m_eventHandler = std::make_shared<RWHandler>(ios);
m_eventHandler->SetCallBackError([this](int connid) { HandleRWError(connid); });
} void CheckConnect()
{
if (m_chkThread != nullptr)
return;
m_chkThread = std::make_shared<std::thread>([this]
{
while (true)
{
if (!IsConnected())
Start();
boost::this_thread::sleep(boost::posix_time::seconds(1));
}
});
} void HandleConnectError(const boost::system::error_code& error)
{
m_isConnected = false;
cout << error.message() << endl;
m_eventHandler->CloseSocket();
CheckConnect();
} void HandleRWError(int connid)
{
m_isConnected = false;
CheckConnect();
}
private:
io_service& m_ios;
tcp::socket m_socket; tcp::endpoint m_serverAddr; std::shared_ptr<RWHandler> m_eventHandler;
bool m_isConnected;
std::shared_ptr<std::thread> m_chkThread;
}; int main()
{
io_service ios;
boost::asio::io_service::work work(ios);
boost::thread thd([&ios] {ios.run(); }); Connector conn(ios, "127.0.0.1", 9900);
conn.Start();
std::string str;
if (!conn.IsConnected())
{
cin >> str;
return -1;
} const int len = 512;
char line[len] = ""; while (cin >> str)
{
char header[HEAD_LEN] = {};
int totalLen = str.length() + 1 + HEAD_LEN;
std::sprintf(header, "%d", totalLen);
memcpy(line, header, HEAD_LEN);
memcpy(line + HEAD_LEN, str.c_str(), str.length() + 1);
conn.Send(line, totalLen); } return 0;
}

  

// Server.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include "../Common/RWHandler.h"
#include "../Common/Message.h" #include <boost/asio/buffer.hpp>
#include <unordered_map>
#include <numeric> const int MaxConnectionNum = 65536;
const int MaxRecvSize = 65536;
class Server {
public:
Server(io_service& ios, short port) :m_ios(ios), m_acceptor(ios, tcp::endpoint(tcp::v4(), port)),
m_connIdPool(MaxConnectionNum)
{
m_connIdPool.resize(MaxConnectionNum);
std::iota(m_connIdPool.begin(), m_connIdPool.end(), 1);
} ~Server(){} void Accept()
{
cout << "Start listening " << endl;
std::shared_ptr<RWHandler> handler = CreateHandler(); m_acceptor.async_accept(handler->GetSocket(), [this, handler](const boost::system::error_code& error)
{
if (error)
{
cout << error.value() << " " << error.message() << endl;
HandleAcpError(handler, error);
return;
}
m_handlers.insert(std::make_pair(handler->GetConnId(),handler));
cout << "current connect count: " << m_handlers.size() << endl; handler->HandleRead();
Accept();
});
} private:
void HandleAcpError(std::shared_ptr<RWHandler> eventHandler, const boost::system::error_code& error)
{
cout << "Error,error reason: " << error.value() << error.message() << endl;
eventHandler->CloseSocket();
StopAccept();
} void StopAccept()
{
boost::system::error_code ec;
m_acceptor.cancel(ec);
m_acceptor.close(ec);
m_ios.stop();
} std::shared_ptr<RWHandler> CreateHandler()
{
int connId = m_connIdPool.front();
m_connIdPool.pop_front();
std::shared_ptr<RWHandler> handler = std::make_shared<RWHandler>(m_ios);
handler->SetConnId(connId);
handler->SetCallBackError([this](int connId)
{
RecyclConnid(connId);
});
return handler;
} void RecyclConnid(int connId)
{
auto it = m_handlers.find(connId);
if (it != m_handlers.end())
m_handlers.erase(it);
//==
cout << "current connect count: " << m_handlers.size() << endl;
m_connIdPool.push_back(connId);
}
private:
io_service& m_ios;
tcp::acceptor m_acceptor;
std::unordered_map<int, std::shared_ptr<RWHandler>> m_handlers;
list<int> m_connIdPool; }; int main()
{
io_service ios; Server server(ios, 9900);
server.Accept();
ios.run(); return 0;
}

  

#pragma once

class Message {
public:
enum { header_length = 4 };
enum { max_body_length = 512 }; Message() :body_length_(0){ } const char* data() const { return data_; } char* data() { return data_; } size_t length()const { return header_length + body_length_; } const char* body()const { return data_ + header_length; } char* body() { return data_ + header_length; } size_t body_length()const { return body_length_; } void body_length(size_t new_length)
{
body_length_ = new_length;
if (body_length_ > max_body_length)
body_length_ = max_body_length;
} bool decode_header()
{
char header[header_length + 1] = "";
std::strncat(header, data_, header_length);
body_length_ = std::atoi(header) - header_length;
if (body_length_ > max_body_length)
{
body_length_ = 0;
return false;
}
return true;
} void encode_header()
{
char header[header_length + 1] = "";
std::sprintf(header,"%4d",body_length_);
std::memcpy(data_,header,header_length);
}
private:
char data_[header_length + max_body_length];
std::size_t body_length_;
};

  

#pragma once
#include <array>
#include <functional>
#include <iostream> using namespace std; #include <boost/asio.hpp>
using namespace boost::asio;
using namespace boost::asio::ip;
using namespace boost; const int MAX_IP_PACK_SIZE = 65536;
const int HEAD_LEN = 4; class RWHandler {
public:
RWHandler(io_service& ios) :m_sock(ios) {}
~RWHandler(){}
void HandleRead() {
async_read(m_sock, buffer(m_buff), transfer_at_least(HEAD_LEN), [this](const boost::system::error_code& ec,
size_t size) {
if (ec != nullptr)
{
HandleError(ec);
return;
}
cout << m_buff.data() + HEAD_LEN << endl;
HandleRead();
});
} void HandleWrite(char* data, int len)
{
boost::system::error_code ec;
write(m_sock, buffer(data, len), ec);
if (ec != nullptr)
HandleError(ec);
} tcp::socket& GetSocket() { return m_sock; } void CloseSocket()
{
boost::system::error_code ec;
m_sock.shutdown(tcp::socket::shutdown_send, ec);
m_sock.close(ec);
} void SetConnId(int connId) { m_connId = connId; } int GetConnId()const { return m_connId; } template<typename F>void SetCallBackError(F f) { m_callbackError = f; } private:
void HandleError(const boost::system::error_code& ec)
{
CloseSocket();
cout << ec.message() << endl;
if (m_callbackError)
m_callbackError(m_connId);
} private:
tcp::socket m_sock;
std::array<char, MAX_IP_PACK_SIZE> m_buff;
int m_connId;
std::function<void(int)> m_callbackError;
};

  

深入应用c++11 随书代码的更多相关文章

  1. 《数字图像处理原理与实践(MATLAB文本)》书代码Part7

    这篇文章是<数字图像处理原理与实践(MATLAB文本)>一本书的代码系列Part7(由于调整先前宣布订单,请读者注意分页程序,而不仅仅是基于标题数的一系列文章),第一本书特色186经225 ...

  2. 一个 11 行 Python 代码实现的神经网络

    一个 11 行 Python 代码实现的神经网络 2015/12/02 · 实践项目 · 15 评论· 神经网络 分享到:18 本文由 伯乐在线 - 耶鲁怕冷 翻译,Namco 校稿.未经许可,禁止转 ...

  3. 《Lucene实战(第2版)》 配书代码在IDEA下的编译方法

    参考: hankcs http://www.hankcs.com/program/java/lucene-combat-2nd-edition-book-with-code-compiled-unde ...

  4. Cocos2d-x手机游戏开发与项目实践具体解释_随书代码

    Cocos2d-x手机游戏开发与项目实战具体解释_随书代码 作者:沈大海  因为原作者共享的资源为UTF-8字符编码.下载后解压在win下显示乱码或还出现文件不全问题,现完整整理,解决全部乱码问题,供 ...

  5. 2015年第11本:代码整洁之道Clean Code

    前一段时间一直在看英文小说,在读到<Before I fall>这本书时,读了40%多实在看不下去了,受不了美国人啰啰嗦嗦的写作风格,还是读IT专业书吧. 从5月9日开始看<代码整洁 ...

  6. Xeon Phi 《协处理器高性能编程指南》随书代码整理 part 1

    ▶ 第三章,逐步优化了一个二维卷积计算的过程 ● 基准代码 #include <stdio.h> #include <stdlib.h> #include <string ...

  7. Java EE互联网轻量级框架整合开发— SSM框架(中文版带书签)、原书代码

    Java EE互联网轻量级框架整合开发 第1部分 入门和技术基础 第1章 认识SSM框架和Redis 2 1.1 Spring框架 2 1.2 MyBatis简介 6 1.3 Spring MVC简介 ...

  8. Python数据处理pdf (中文版带书签)、原书代码、数据集

    Python数据处理 前言 xiii第1 章 Python 简介 11.1 为什么选择Python 41.2 开始使用Python 41.2.1 Python 版本选择 51.2.2 安装Python ...

  9. 低功耗蓝牙4.0BLE编程-nrf51822开发(11)-蓝牙串口代码分析

    代码实例:点击打开链接 实现的功能是从uart口发送数据至另一个蓝牙串口,或是从蓝牙读取数据通过uart打印出数据. int main(void) { // Initialize leds_init( ...

随机推荐

  1. centos7.3安装zend guard loader3.3 for php5.6

    1 下载zend guard loader 到这里选择自己的系统版本  我选择的64位 for php5.6.3  linux http://www.zend.com/en/products/load ...

  2. OpenACC 异步计算

    ▶ 按照书上的例子,使用 async 导语实现主机与设备端的异步计算 ● 代码,非异步的代码只要将其中的 async 以及第 29 行删除即可 #include <stdio.h> #in ...

  3. 微信小程序注册身份证验证

    // 校验身份证号 //校验码校验 checkCode: function (val) { var p = /^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2])) ...

  4. 1 python 文件处理

    1.打开文件open 函数 open函数最常用的使用方法如下:文件句柄 = open('文件路径', '模式',编码方式). encode='' 1.关于文件路径 #文件路径: 主要有两种,一种是使用 ...

  5. LESS CSS 实例

    值得参考的 10 个 LESS CSS 实例   2 收藏(185) LESS, Sass 和其他 CSS 预处理器是一种超棒的方法用来扩展 CSS 功能,使之更适合程序员.你可以使用变量.函数.混合 ...

  6. Java HashMap两种遍历方式

    第一种: Map map = new HashMap(); Iterator iter = map.entrySet().iterator(); while (iter.hasNext()) { Ma ...

  7. Spark数据类型SparseMatrix 解释

    http://blog.csdn.net/sinat_29508201/article/details/54089771 parseMatrix Spark的mllib包中提供了机器学习的两种基本数据 ...

  8. k-means处理图片

    问题描述:把给定图片,用图片中最主要的三种颜色来表示该图片 k-means思想: 1.选择k个点作为初始中心 2.将每个点指派到最近的中心,形成k个簇cluster 3.重新计算每个簇的中心 4.如果 ...

  9. html资源 链接

    http://m.aicai.com/index.do?agentId=1&vt=5

  10. update from

    update table1 set table1.column1 =(select table2.column1 from table2  where 关联条件) where exists(selec ...