boost asio 文件服务器,基于boost::asio封装搭建的简单服务器
经过一天的简单学习,尝试自己写一个简单的服务器,能够实现以下三大回调功能:onConnect onMessage onClose
下面直接贴出代码
1.BaseServer抽象类
BaseServer.h
/*
name:BaseServer
use:the basest server
author:hezijian([email protected])
*/
#ifdef _MSC_VER
#define _WIN32_WINNT 0x0501
#endif
#ifndef _BASE_SERVER_H_
#define _BASE_SERVER_H_
#include
#include "SERVER_CONSTANT.h"
using namespace boost::asio;
using boost::system::error_code;
using ip::tcp;
class Session{
public:
Session(io_service& iosev):
m_buf((char*)malloc(SERVER_CONTANT::SESSION_BUF_LEN)),
m_socket(iosev)
{
memset(m_buf,0,SERVER_CONTANT::SESSION_BUF_LEN);
}
~Session(){
delete[] m_buf;
}
inline ip::tcp::socket& getSocket(){return m_socket;}
inline char* getBuf(){return m_buf;}
private:
ip::tcp::socket m_socket;
char* m_buf;
};
class BaseServer
{
public:
BaseServer(io_service &iosev);
//初始化
void init();
//等待连接
void start();
//当有连接时
void connect(std::shared_ptr pSession, error_code ec);
//当有消息传递时
void message(std::shared_ptr pSession, error_code ec);
//当断开连接时
void close(std::shared_ptr pSession, error_code ec);
//以下是回调函数,由子类重写
virtual void onConnect(std::shared_ptr pSession, error_code ec)=0;
virtual void onMessage(std::shared_ptr pSession, error_code ec)=0;
virtual void onClose(std::shared_ptr pSession, error_code ec)=0;
private:
io_service &m_iosev;
ip::tcp::acceptor m_acceptor;
int m_unique_id;
};
#endif
BaseServer.cpp
#include "BaseServer.h"
#include
BaseServer::BaseServer(io_service &iosev):
m_iosev(iosev),m_acceptor(iosev, tcp::endpoint(tcp::v4(), SERVER_CONTANT::PORT)),m_unique_id(1){
init();
}
void BaseServer::init(){
return;
}
void BaseServer::start(){
std::shared_ptr pSession(new Session(m_iosev));
m_acceptor.async_accept(pSession->getSocket(),
std::bind(&BaseServer::connect,this, pSession, std::placeholders::_1));
}
void BaseServer::connect(std::shared_ptr pSession, error_code ec){
std::cout <<
"一个新的连接:" << pSession->getSocket().remote_endpoint().address()
<< std::endl;
onConnect(pSession,ec);
if(ec) return;
//继续等待连接
start();
pSession->getSocket().async_read_some(buffer(pSession->getBuf(),SERVER_CONTANT::SESSION_BUF_LEN),
std::bind(&BaseServer::message,this,pSession,std::placeholders::_1));
}
void BaseServer::message(std::shared_ptr pSession, error_code ec){
if(ec){
BaseServer::close(pSession,ec);
return;
}
std::cout <<
"从客户端"<< pSession->getSocket().remote_endpoint().address() << "收到数据:" << pSession->getBuf()
<< std::endl;
onMessage(pSession,ec);
//清空缓冲区,继续等待数据
memset(pSession->getBuf(),0,sizeof(pSession->getBuf()));
pSession->getSocket().async_read_some(buffer(pSession->getBuf(),SERVER_CONTANT::SESSION_BUF_LEN),
std::bind(&BaseServer::message,this,pSession,std::placeholders::_1));
}
void BaseServer::close(std::shared_ptr pSession, error_code ec){
std::cout << boost::system::system_error(ec).what() << std::endl;
std::cout << pSession->getSocket().remote_endpoint().address() << " disconnect" << std::endl;
pSession->getSocket().shutdown(boost::asio::ip::tcp::socket::shutdown_both, const_cast<:system::error_code>(ec));
pSession->getSocket().close(const_cast<:system::error_code>(ec));
onClose(pSession,ec);
return;
}
说明,BaseServer是一个抽象类,必须由子类重写回调函数才能实例化,SERVER_CONSTANT是服务器常量的管理头文件。
Session暂时是一个包装了socket和buf的类,以后可能还会丰富修改
2.MyServer继承BaseServer
MyServer.h
#ifndef _MY_SERVER_H_
#define _MY_SERVER_H_
#include "BaseServer.h"
class MyServer : public BaseServer{
public:
MyServer(io_service& iosev);
virtual void onConnect(std::shared_ptr pSession, error_code ec);
virtual void onMessage(std::shared_ptr pSession, error_code ec);
virtual void onClose(std::shared_ptr pSession, error_code ec);
};
#endif
MyServer.cpp
#include "MyServer.h"
MyServer::MyServer(io_service& iosev):BaseServer(iosev){
}
void MyServer::onConnect(std::shared_ptr pSession, error_code ec){
printf("onConnect\n");
}
void MyServer::onMessage(std::shared_ptr pSession, error_code ec){
printf("onMessage\n");
}
void MyServer::onClose(std::shared_ptr pSession, error_code ec){
printf("onClose\n");
}
3.main函数
#include "MyServer.h"
#include
int main(int argc, char* argv[])
{
try{
io_service iosev;
MyServer sev(iosev);
// 开始等待连接
sev.start();
std::cout << "服务器启动成功!" << std::endl;
iosev.run();
}catch(std::exception e){
std::cout << e.what() << std::endl;
}
return 0;
}
原文:http://blog.csdn.net/hezijian22/article/details/41621595
boost asio 文件服务器,基于boost::asio封装搭建的简单服务器相关推荐
- 基于CentOS7.6系统搭建远程GIT服务器
基于CentOS7.6系统搭建远程GIT服务器 0 背景 0.0 GIT是什么 0.1 为什么搭建远程GIT服务器 1. 功课 2. 过程 3. 总结 4. 参考资料 0 背景 0.0 GIT是什么 ...
- boost asio 文件服务器,使用boost ASIO库封装TCP服务器类
使用异步TCP方式,可在此基础上增加更多功能. 头文件AsioTcp.h: #pragma once #include #include #include typedef boost::asio::i ...
- 基于滴滴云主机搭建 FTP 文件共享服务器(一)
FTP 简单介绍 什么是 FTP 服务器? FTP 服务器(File Transfer Protocol Server)是在互联网上提供文件共享存储和访问服务的计算机,它们依照 FTP 协议提供服务. ...
- Tomact和MySql搭建android简单服务器
之前已经写了怎么搭建eclipse加tomcat整合成服务器环境,如果有人不知道怎么配置,可以看我的那篇博客. 现在环境搭配好的情况下,在eclipse里新建一个Web工程,在src包下新建一个ser ...
- 搭建一个简单的问答系统(v2.0)
之前刚接触机器学习的时候,写过一篇<基于sklearn库,搭建一个简单的问答系统>.此篇文章是在上篇的逻辑上,对一些函数进行了优化,并对检索方式进行了一些优化,再各个环节上时间复杂度都提高 ...
- Boost:基于boost::asio的延迟udp服务器测试程序
Boost:基于boost::asio的延迟udp服务器测试程序 实现功能 C++实现代码 客户端源码 服务端源码 实现功能 boost::asio模块,基于boost::asio的延迟udp服务器测 ...
- Boost:基于boost::asio的延迟tcp服务器测试程序
Boost:基于boost::asio的延迟tcp服务器测试程序 实现功能 C++实现代码 客户端源码 服务端源码 实现功能 boost::asio模块,基于boost::asio的延迟tcp服务器测 ...
- Boost:基于boost::asio单元测试的测试程序
Boost:基于boost::asio单元测试的测试程序 实现功能 C++实现代码 实现功能 boost::asio模块,基于boost::asio单元测试的测试程序 C++实现代码 #ifndef ...
- Boost:基于boost::asio模块引用计数程序
Boost:基于boost::asio模块引用计数程序 实现功能 C++实现代码 实现功能 基于boost::asio模块引用计数程序 C++实现代码 #include <boost/asio. ...
最新文章
- caffe转caffe2
- TCP/IP协议模型详解
- HDU4549 M斐波那契数列 —— 斐波那契、费马小定理、矩阵快速幂
- 60多套html5移动端模板_美容整形高保真移动端原型模板发布
- Cocos游戏引擎3D特效全新升级 更流畅更炫酷
- django建表报错
- 使VM的虚拟机内存超越物理内存的方法
- 简而言之,JUnit:Hello World
- Python | 程序从列表中删除范围内的所有元素
- 【华为云 ModelArts-Lab AI实战营】第二期
- Centos 7 mysql 5.7 给root开启远程访问权限,修改root密码
- MY CSDB BLOG 第一篇
- 百度注册登录页面简单实现——仿照
- Android数据编码之Base64
- 一套成熟的BPM系统应该有的功能
- 论文笔记2:Combining Lexical, Syntactic, and Semantic Features with Maximum Entropy Models for Extracting
- java进阶之多线程二线程池
- 如何为YouTube启用暗模式
- 亚商投资顾问 早餐FM/0926 特斯拉跌4.59%,亚马逊跌3.01%
- “融而开放、合以创新”T-HIM融合通信技术开发实战
热门文章
- 苹果手机(iPhone)添加outlook邮箱设置
- 机器学习 反向传播_机器学习中的神秘化反向传播:您想了解的隐藏数学
- 乌镇互联网大会——中国最成功的商人花一辈子才悟到的道理(转自知乎)
- swi prolog 和java_制作适用于GNU和SWI的Prolog代码
- js中在另一个页面打开ppt、word
- Python之数据分析总结
- 【ASP.NET Core】配置应用程序地址的N多种方法
- SQL三值逻辑和NULL
- 用卡尔曼滤波处理工程数据的方法与思考with基于GPS与INS组合导航的滤波模型仿真
- 操作系统饥饿现象_操作系统中的饿死现象怎样理解?