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

被折叠的 条评论
为什么被折叠?



