boost asio 一个聊天的基本框架
示例代码
#include "Util.h"
#include "MyAsio.h"
#include "TcpConnectionManager.h"
#include "SocketMessageRecvDispatchManager.h"
/*
作 者: itdef
技术博客 http://www.cnblogs.com/itdef/
技术交流群 群号码:324164944
欢迎c c++ windows驱动爱好者 服务器程序员沟通交流
部分老代码存放地点 http://www.oschina.net/code/list_by_user?id=614253
*/ unsigned int DEF::tcp_connection::i = ;
extern DEF::TcpConnectManager g_tcp_connect_manager;
extern DEF::SocketMessageRecvDispatchManager g_socket_message_recv_dispatch_manager; void DEF::AsioLoopThread() {
try
{
boost::asio::io_service io_service;
DEF::tcp_server server(io_service);
io_service.run();
}
catch (std::exception& e)
{
std::cerr << e.what() << std::endl;
}
} std::thread DEF::StartAsioLoopThread()
{
std::thread t = std::thread(DEF::AsioLoopThread);
return t;
} void DEF::tcp_connection::handle_read_head(const boost::system::error_code& error,
size_t bytes_transferred)
{
//收到错误格式信息
if (error || bufHead_.flag != '|')
{
std::weak_ptr<DEF::tcp_connection> wp(shared_from_this());
g_tcp_connect_manager.LeaveWithLock(wp);
std::cerr << __FUNCTION__ << "(). wrong flag or " << error.message()<< std::endl;
return;
} boost::asio::async_read(socket_, boost::asio::buffer(recvBuffBody, bufHead_.bufferLenth),
boost::bind(&tcp_connection::handle_read_body, shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
} void DEF::tcp_connection::start()
{
std::weak_ptr<DEF::tcp_connection> wp(shared_from_this());
g_tcp_connect_manager.JoinWithLock(wp); boost::asio::async_read(socket_, boost::asio::buffer(&bufHead_, sizeof(bufHead_)),
boost::bind(&tcp_connection::handle_read_head, shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
} std::string DEF::SharedPtr2StringId(const std::shared_ptr<DEF::tcp_connection>& ptr) {
std::stringstream ss;
ss << ptr;
std::string str_ptr_id;
ss >> str_ptr_id;
return str_ptr_id;
} void DEF::tcp_connection::handle_read_body(const boost::system::error_code& error,
size_t bytes_transferred)
{
if (error) {
std::weak_ptr<DEF::tcp_connection> wp(shared_from_this());
g_tcp_connect_manager.LeaveWithLock(wp);
std::cerr << __FUNCTION__ <<" "<< error.message()<< std::endl;
return;
}
recvBuffBody[bytes_transferred] = '\0';
//std::cout << "recv " << recvBuffBody << std::endl;
g_socket_message_recv_dispatch_manager.PostSockRecvMessageAndNotify(recvBuffBody);
boost::asio::async_read(socket_, boost::asio::buffer(&bufHead_, sizeof(bufHead_)),
boost::bind(&tcp_connection::handle_read_head, shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
消息队列表
#pragma once
#include <mutex>
#include <deque>
#include <string> #include "Util.h"
/*
作 者: itdef
技术博客 http://www.cnblogs.com/itdef/
技术交流群 群号码:324164944
欢迎c c++ windows驱动爱好者 服务器程序员沟通交流
部分老代码存放地点 http://www.oschina.net/code/list_by_user?id=614253
*/
NAMESPACEBEGIN(DEF) struct MessageQueueWithLock {
std::mutex messageQueuemtx;
std::condition_variable messageQueuecv;
volatile bool ready = false;
std::deque<std::string> messageDeq; void PostMessageAndNotify(const std::string& json) {
std::lock_guard<std::mutex> lck(messageQueuemtx);
messageDeq.push_back(json);
messageQueuecv.notify_one();
} std::string WaitForMessageDequeOnce() {
std::string s;
{
std::unique_lock<std::mutex> lck(messageQueuemtx);
while (messageDeq.empty())
messageQueuecv.wait(lck);
}
{
std::lock_guard<std::mutex> lck(messageQueuemtx);
if (!messageDeq.empty()) {
s = messageDeq.front();
messageDeq.pop_front();
}
}
return s;
}
}; NAMESPACEEND
一个全局管理连接的容器
#pragma once
#pragma once
#include "Util.h"
#include <map>
#include <mutex>
#include <memory>
#include <sstream> #include "MyAsio.h"
/*
作 者: itdef
技术博客 http://www.cnblogs.com/itdef/
技术交流群 群号码:324164944
欢迎c c++ windows驱动爱好者 服务器程序员沟通交流
部分老代码存放地点 http://www.oschina.net/code/list_by_user?id=614253
*/
NAMESPACEBEGIN(DEF)
//class tcp_connection;
class TcpConnectManager {
public:
typedef std::string SOCKWEAKPTRID;
TcpConnectManager() {}
~TcpConnectManager() {} void JoinWithLock(const std::weak_ptr<tcp_connection>& ptr); void LeaveWithLock(const std::weak_ptr<tcp_connection>& ptr); std::weak_ptr<tcp_connection> FindWeakPtrBySockPtrIdWithLock(const std::string& sock_ptr_id);
TcpConnectManager& operator=(const TcpConnectManager&) = delete;
TcpConnectManager(const TcpConnectManager&) = delete;
private:
std::mutex mtx;
std::map<SOCKWEAKPTRID, std::weak_ptr<DEF::tcp_connection>> connection_infos;
}; NAMESPACEEND
boost asio 一个聊天的基本框架的更多相关文章
- 改进基于Boost.Asio的聊天服务
Boost.Asio是个非常易用的C++异步网络库,官方文档中一个示例是聊天服务,分为chat_message.chat_client.chat_server三个部分.chat_server的启动代码 ...
- boost asio 网络聊天 代码修改学习
简化asio的聊天代码 去除ROOM的设计 所有连接客户端均在同一个ROOM下 /*********************************************************** ...
- boost::asio实现一个echo服务器
以前使用ACE实现Server框架,但是觉得太笨重,决定采用boost.asio来写服务器程序: 1.服务器构建在linux上面:当然也可以在windows下运行 2.io部分采用非阻塞模式.业务逻辑 ...
- boost asio异步读写网络聊天程序client 实例具体解释
boost官方文档中聊天程序实例解说 数据包格式chat_message.hpp <pre name="code" class="cpp">< ...
- boost asio异步读写网络聊天程序客户端 实例详解
boost官方文档中聊天程序实例讲解 数据包格式chat_message.hpp <pre name="code" class="cpp">< ...
- boost.asio新框架的设计概念总结
1.66版本,boost.asio库重新设计了框架,目前最新版为1.71.读了几天代码后,对框架中相关概念总结.因为是泛型编程的库,所以分析的概念层的设计. 可通过boost官方文档,strand的1 ...
- socket通信框架——boost asio
boost asio是一个封装了基本socket的跨平台通信框架.它支持异步访问,并支持tcp的自动封闭控制等操作. 一个简单的通信协议可以为: header body body长 数据 通过boos ...
- (原创)如何使用boost.asio写一个简单的通信程序(二)
先说下上一篇文章中提到的保持io_service::run不退出的简单办法.因为只要异步事件队列中有事件,io_service::run就会一直阻塞不退出,所以只要保证异步事件队列中一直有事件就行了, ...
- (原创)如何使用boost.asio写一个简单的通信程序(一)
boost.asio相信很多人听说过,作为一个跨平台的通信库,它的性能是很出色的,然而它却谈不上好用,里面有很多地方稍不注意就会出错,要正确的用好asio还是需要花一番精力去学习和实践的,本文将通过介 ...
随机推荐
- node-pre-gyp install --fallback-to-build 错误
[node-pre-gyp install --fallback-to-build 错误] npm install bcrypt时遇上错误 此时,安装node-gyp npm install -g n ...
- attenuation
attenuation - 必应词典 美[əˌtenjʊ'eɪʃ(ə)n]英[əˌtenjʊ'eɪʃ(ə)n] n.减弱:稀释:[物]衰减:变细 网络衰减量:衰减作用:衰减值
- 了解Queue
在并发队列上JDK提供了两套实现,一个是以ConcurrentLinkedQueue为代表的高性能队列,一个是以BlockingQueue接口为代表的阻塞队列,无论哪种都继承自Queue, 可以对应着 ...
- TZOJ 4712 Double Shortest Paths(最小费用最大流)
描述 Alice and Bob are walking in an ancient maze with a lot of caves and one-way passages connecting ...
- FortiGate防火墙内存使用率高问题
1.现象:zabbix监控到防火墙内存使用率频繁超过80%,而FortiGate防火墙内存超过80%将开启自身保护模式而不能新加策略等. 2.分析:这种情况一般是某些进程再释放内存的时候卡住.可以先查 ...
- Python: subprocess.Popen()不支持unicode问题解决
起源: 所下载视频,有音视频分离者,需要合并起来,采用python之subprocess.Popen()调用ffmpeg实现.python版本为2.7.13,而音视频文件路径,有unicode字符者, ...
- ThreadLocal ——android消息机制handler在非主线程创建not called Looper.prepare() 错误的原因
引用自:https://www.jianshu.com/p/a8fa72e708d3 引出: 使用Handler的时候,其必须要跟一个Looper绑定.在UI线程可直接初始化Handler来使用.但是 ...
- PHP统计网站pv(访问量)
//首先判断有没有统计的文件 if(is_file("pv.txt")){//有 //取文件里面的值 $count=file_get_contents("pv.txt&q ...
- docker搭建lnmp(二)
上一篇利用 不同的命令来构建 nginx,mysql,php镜像 和 容器. 这样做比较麻烦,也很容易出错,当然可以写入 sh脚本来执行.但是可以通过 docker-compose 来达到效果,管理起 ...
- Cmd下修改文件访问控制权限
保证自己的磁盘分区格式是NTFS.FAT32是不行的. 一.Cacls.exe命令的使用 这是一个在Windows 2000/XP/Server 2003操作系统下都可以使用的命令,作用是显示或者修改 ...