使用ASIO库实现echo服务器端跟客户端

该代码实现了一个基于Boost.Asio库的异步TCP服务器和客户端。服务器接收客户端连接,读取数据并回显,而客户端发送数据到服务器并打印接收到的响应。整个过程是异步的,使用了智能指针管理对象生命周期。

服务器端:

// TimerServer.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#define _CRT_SECURE_NO_WARNINGS


#include<ctime>
#include <iostream>
#include <string>
#include <functional>
#include <memory>
#include <boost/asio.hpp>

using boost::asio::ip::tcp;

//返回时间
static std::string make_daytime_string()
{
	using namespace std;
	auto now = time(nullptr);
	return ctime(&now);
}


//连接类
class session :public std::enable_shared_from_this<session>
{
public:
	using pointer = std::shared_ptr<session>;
	session(tcp::socket socket) :socket_(std::move(socket)) {};
	tcp::socket& socket() { return socket_; };
	void start()
	{
		do_read();
	}

private:
	void do_read()
	{
		//引用技术增加1 出作用域后减1  匿名函数使用值传递 智能指针增加1 
 		auto self(shared_from_this());
		socket_.async_read_some(
			boost::asio::buffer(data_,max_length),
			[this, self = std::move(self)](auto err, size_t length)
		{
			if (!err)
			{
				do_write(length);
			}
		});
	}
	void do_write(size_t length)
	{

		std::string d(data_, length);
		std::cout << "from client :" << d << std::endl;
		auto self(shared_from_this());
		boost::asio::async_write(
			socket_, boost::asio::buffer(data_, length),
			[this, self](auto err, size_t length)
			{
				if (!err) do_read();
			}
		);
	}

	tcp::socket socket_;
	enum {
		max_length = 1024
	};
	char data_[max_length];
};

class server {
public:
	server(boost::asio::io_context& io, short port) :acceptor_(io, tcp::endpoint(tcp::v4(), port)), _socket(io)
	{
	};
	void start()
	{
		do_accept();
	}
private:
	void do_accept() {

		acceptor_.async_accept(_socket,
			[this](auto& err) {
				if (!err)
				{
					std::make_shared<session>(std::move(_socket))->start();
				}
				do_accept();
				}
		);

	}

private:
	tcp::acceptor acceptor_;
	tcp::socket _socket;
};


//异步
int main(int argc, char* argv[])
{

	try
	{
		if (argc != 2)
		{
			std::cerr << "Usage:async_tcp_echo_server <port> \n";
			return 1;
		}
		boost::asio::io_context io;
		server s(io, atoi(argv[1]));
		s.start();
		io.run();
	}
	catch (const std::exception& e)
	{
		std::cerr << e.what() << std::endl;
	}
	return 0;
}

客户端:

// TimerServer.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#define _CRT_SECURE_NO_WARNINGS


#include<ctime>
#include <iostream>
#include <string>
#include <functional>
#include <memory>
#include <boost/asio.hpp>

using boost::asio::ip::tcp;

//返回时间
static std::string make_daytime_string()
{
	using namespace std;
	auto now = time(nullptr);
	return ctime(&now);
}


//连接类
class session :public std::enable_shared_from_this<session>
{
public:
	using pointer = std::shared_ptr<session>;
	session(tcp::socket socket) :socket_(std::move(socket)) {};
	tcp::socket& socket() { return socket_; };
	void start()
	{
		do_read();
	}

private:
	void do_read()
	{
		//引用技术增加1 出作用域后减1  匿名函数使用值传递 智能指针增加1 
 		auto self(shared_from_this());
		socket_.async_read_some(
			boost::asio::buffer(data_,max_length),
			[this, self = std::move(self)](auto err, size_t length)
		{
			if (!err)
			{
				do_write(length);
			}
		});
	}
	void do_write(size_t length)
	{

		std::string d(data_, length);
		std::cout << "from client :" << d << std::endl;
		auto self(shared_from_this());
		boost::asio::async_write(
			socket_, boost::asio::buffer(data_, length),
			[this, self](auto err, size_t length)
			{
				if (!err) do_read();
			}
		);
	}

	tcp::socket socket_;
	enum {
		max_length = 1024
	};
	char data_[max_length];
};

class server {
public:
	server(boost::asio::io_context& io, short port) :acceptor_(io, tcp::endpoint(tcp::v4(), port)), _socket(io)
	{
	};
	void start()
	{
		do_accept();
	}
private:
	void do_accept() {

		acceptor_.async_accept(_socket,
			[this](auto& err) {
				if (!err)
				{
					std::make_shared<session>(std::move(_socket))->start();
				}
				do_accept();
				}
		);

	}

private:
	tcp::acceptor acceptor_;
	tcp::socket _socket;
};


//异步
int main(int argc, char* argv[])
{

	try
	{
		if (argc != 2)
		{
			std::cerr << "Usage:async_tcp_echo_server <port> \n";
			return 1;
		}
		boost::asio::io_context io;
		server s(io, atoi(argv[1]));
		s.start();
		io.run();
	}
	catch (const std::exception& e)
	{
		std::cerr << e.what() << std::endl;
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值