Boost Asio 异步TCP服务器框架

Boost Asio 异步TCP服务器框架

flyfish 2015-5-30

session 类 头文件

#pragma once

#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>

class session: public boost::enable_shared_from_this<session>
{
public:
	session(boost::asio::io_service &io_service);
	bool started_;
	bool started() const;
	void start();
	void stop();

	void start_send();	

	boost::asio::ip::tcp::socket &socket();
	int heartbeat_count_;

private:
	boost::asio::ip::tcp::socket socket_;
	boost::asio::streambuf sbuf_;

	enum{max_msg=4096};
	unsigned char read_buffer[max_msg];
	unsigned char write_buffer[max_msg];

	std::size_t check_frame(const boost::system::error_code &ec, std::size_t bytes_transferred);//校验数据
	void parse_frame(const boost::system::error_code &ec, std::size_t bytes_transferred);//解析数据

	void receive_handler(const boost::system::error_code &ec, std::size_t bytes_transferred);
	void send_handler(const boost::system::error_code &ec);
};

typedef boost::shared_ptr<session> session_ptr;

session 类 实现文件

#include "session.h"
session::session(boost::asio::io_service &io_service): socket_(io_service)
{ 

} 

bool session::started() const
{
	return started_;
}

void session::start() {

started_=true;
socket_.async_receive(boost::asio::buffer(read_buffer),
	boost::bind(&session::receive_handler,
	shared_from_this(),
	boost::asio::placeholders::error,
	boost::asio::placeholders::bytes_transferred));
} 

std::size_t session::check_frame(const boost::system::error_code &ec, std::size_t bytes_transferred)//校验
{
	return 1;
}
void session::parse_frame(const boost::system::error_code &ec, std::size_t bytes_transferred)//解析
{
	if (!ec)
	{

		socket_.async_receive(boost::asio::buffer(read_buffer),
			boost::bind(&session::receive_handler,
			shared_from_this(),
			boost::asio::placeholders::error,
			boost::asio::placeholders::bytes_transferred));
	}
}

void session::receive_handler(const boost::system::error_code &ec, std::size_t bytes_transferred)
{
	if (ec)return;
	if (!started())return;

	{ 

		boost::asio::async_read(socket_,boost::asio::buffer(read_buffer),
			boost::bind(&session::check_frame,
			shared_from_this(), boost::asio::placeholders::error,
			bytes_transferred),

			boost::bind(&session::parse_frame,
			shared_from_this(),
			boost::asio::placeholders::error,
			bytes_transferred));

		socket_.async_receive(boost::asio::buffer(read_buffer),
			boost::bind(&session::receive_handler,
			shared_from_this(),
			boost::asio::placeholders::error,
			boost::asio::placeholders::bytes_transferred));
	} 

}

void session::stop()
{

	if (!started_) return;
	started_=false;

	socket_.close();
}

void session::start_send()
{
	//test
	string tmp="1123456789abcdefghijklmnopqrstuvwxyz";
	std::copy(tmp.begin(),tmp.end(),write_buffer);
	socket_.async_write_some(boost::asio::buffer(write_buffer,20),boost::bind(&session::send_handler,
		shared_from_this(),
		boost::asio::placeholders::error));

}

void session::send_handler(const boost::system::error_code &ec)
{
	if (!ec)
	{ 

	}
	else
	{
		//发送不成功的处理 

	}
}
boost::asio::ip::tcp::socket &session::socket() {
	return socket_;
}

channel 类头文件

#pragma once
#include "session.h"

class channel
{
public:
	channel(boost::asio::io_service &io_service, boost::asio::ip::tcp::endpoint &endpoint);
	void handle_accept(session_ptr new_session, const boost::system::error_code& error);
	void run();

private:
	boost::asio::io_service &io_service_;
	boost::asio::ip::tcp::acceptor acceptor_;

public:
	typedef boost::system::error_code error_code;
};

channel类实现文件

#include "stdafx.h"
#include "channel.h"
//std::vector<session_ptr > sessions;
channel::channel(boost::asio::io_service &io_service, boost::asio::ip::tcp::endpoint &endpoint)
	: io_service_(io_service), acceptor_(io_service, endpoint)
{
	session_ptr new_session(new session(io_service_));

	//we need to monitor for the client list change event ,a new client connects or one client gets disconnected,
	// and notify all clients when this happens.Thus,we need to keep an array of clients,
	//sessions.push_back(new_session);

	//each new client connection will then trigger another asynchronous wait
	acceptor_.async_accept(new_session->socket(),
		boost::bind(&channel::handle_accept,
		this,
		new_session,
		boost::asio::placeholders::error));
}

void channel::handle_accept(session_ptr new_session, const boost::system::error_code& error) {
	if (error) {
		return;
	}

	new_session->start();

	session_ptr next_session(new session(io_service_));

	acceptor_.async_accept(next_session->socket(),
		boost::bind(&channel::handle_accept,
	    this,
		next_session,
		boost::asio::placeholders::error));
}

void channel::run() {

		boost::thread t(boost::bind(&boost::asio::io_service::run,boost::ref(io_service_)));

		//int thread_count=(std::max)(static_cast<int>(boost::thread::hardware_concurrency()),1);
		//boost::thread_group tg;
		//for (int i=0;i<thread_count;i++)
		//{
		//	tg.create_thread(boost::bind(&boost::asio::io_service::run,boost::ref(io_service_)));
		//	boost::this_thread::sleep(boost::posix_time::seconds(5));
		//}

}

调用

boost::asio::io_service g_io_service;
boost::asio::io_service::work g_work(g_io_service);
boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::address_v4::from_string("192.168.1.2"), 1234);
channel g_c(g_io_service, endpoint);
g_c.run();

时间: 2024-10-21 06:24:42

Boost Asio 异步TCP服务器框架的相关文章

boost asio 异步实现tcp通讯

---恢复内容开始--- asioboost 目录(?)[-] 一前言 二实现思路 通讯包数据结构 连接对象 连接管理器 服务器端的实现 对象串行化 一.前言 boost asio可算是一个简单易用,功能又强大可跨平台的C++通讯库,效率也表现的不错,linux环境是epoll实现的,而windows环境是iocp实现的.而tcp通讯是项目当中经常用到通讯方式之一,实现的方法有各式各样,因此总结一套适用于自己项目的方法是很有必要,很可能下一个项目直接套上去就可以用了. 二.实现思路 1.通讯包数

boost::asio::ip::tcp实现网络通信的小例子

同步方式: Boost.Asio是一个跨平台的网络及底层IO的C++编程库,它使用现代C++手法实现了统一的异步调用模型. 头文件 #include <boost/asio.hpp> 名空间 using namespace boost::asio; ASIO库能够使用TCP.UDP.ICMP.串口来发送/接收数据,下面先介绍TCP协议的读写操作 对于读写方式,ASIO支持同步和异步两种方式,首先登场的是同步方式,下面请同步方式自我介绍一下: 大家好!我是同步方式! 我的主要特点就是执着!所有的

boost asio异步读写网络聊天程序客户端 实例详解

// // chat_client.cpp // ~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2013 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://ww

C#网络编程系列文章(三)之TcpListener实现异步TCP服务器

原创性声明 本文作者:小竹zz 本文地址http://blog.csdn.net/zhujunxxxxx/article/details/44258719 转载请注明出处 本文介绍 TcpListener 类提供一些简单方法,用于在阻止同步模式下侦听和接受传入连接请求. 可使用 TcpClient 或 Socket 来连接 TcpListener. 可使用 IPEndPoint.本地 IP 地址及端口号或者仅使用端口号,来创建 TcpListener. 可以将本地 IP 地址指定为 Any,将本

6.swoole学习笔记--异步tcp服务器

<?php //创建tcp服务器 $host='0.0.0.0'; $port=9501; $serv=new swoole_server($host,$port); //设置异步进程工作数 $serv->set(array('task_worker_num'=>4)); //投递异步任务 $serv->on('receive',function($serv,$fd,$from_id,$data){ $task_id=$serv->task($data); echo &quo

boost::asio::socket tcp 连接 在程序结束时崩溃。

刚开始的时候一直不知道怎么回事,不过幸好我有在每个class 的析构时都打印一条信息. 这个时候发现我的一个tcp_connection (就是自定义的一个连接类) 在最后才被析构. 所以感觉这里可能出了问题. 由于tcp_connection 是派生自boost::enable_shared_from_this<tcp_connection> 的,猜想可能是需要提前释放某些资源,而不导致io_service 这个资源释放的时候某些数据不对.所以我就在socket 调用close() 之后将这

boost asio 学习(七) 网络基础 连接器和接收器(TCP示例)

http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting- started-with-boostasio?pg=8 7. Networking basics: connectors and acceptors (TCP)我们来学习boost的TCP网络编程.之前的篇章已经介绍了网络系统框架.我们只需要学习网络API函数即可 我们首先学习如何同步的连接主机.我们的代码作为客户端运行,使用tcp::socket对象.tcp::s

10 C++ Boost ASIO网路通信库 TCP/UDP,HTTP

  tcp 同步服务器,显示服务器端时间 tcp 同步服务器,提供多种选择 多线程的tcp 同步服务器 tcp 同步客户端 boost 域名地址解析 tcp异步服务器 tcp 异步客户端 UDP同步服务器 UDP同步客户端 UDP异步服务器 UDP异步客户端 HTTP同步客户端 HTTP异步客户端 同步实验: 异步实验 多线程异步实验 tcp 同步服务器,显示服务器端时间 [email protected]:~/boost$ cat main.cpp  #include <ctime> #in

C/C++利用Boost::Asio网络库建立自己的Socket服务器

引言 寸光阴,当下我们或许更需要利用现有的知识,应用现有的技术.网络是当前互联网的根本,了解网络便开始显得极其重要.今天我们利用Boost库中Asio部分,浅尝网络服务器.此处不做过于深入的开展,为达成学习目的,只做简单的异步并发服务器. 注意:本篇代码没有直接引用boost等命名空间,为的是新入门Boost的同学能够更好的了解每个参数在boost的具体命名空间位置,有助于更好的理解boost的布局. 版权所有:_OE_,转载请注明出处:http://blog.csdn.net/csnd_ayo