Я делал пример с эхо-сервером в boost :: asio. Но использование boost :: make_shard вызовет «неизвестное исключение», а std :: make_shared - нет. Смотрите закомментированную строку.
Я использую Visual Studio 2017 и Boost 1.67. Комментируемая часть будет зависать, а некомментированная - нет. Похоже, что Boost lib соответствует vs141 в boost / stage / lib.
#include <iostream>
#include <boost/asio.hpp>
#include <boost/make_shared.hpp>
using boost::asio::ip::tcp;
using std::cout;
using std::endl;
using std::size_t;
class session :public std::enable_shared_from_this<session> {
public:
session(tcp::socket socket) :socket_(std::move(socket)) {
}
void start() {
do_read();
}
private:
void do_read() {
auto self(shared_from_this());
socket_.async_read_some(boost::asio::buffer(buffer_, maxlen),
[this, self](boost::system::error_code error, size_t read_len) {
if (!error) {
do_write(read_len);
}
else {
cout << error.message() << endl;
}
});
}
void do_write(size_t len_write) {
auto self(shared_from_this());
boost::asio::async_write(socket_, boost::asio::buffer(buffer_, len_write),
[this, self](boost::system::error_code error, size_t byte_transferred) {
if (!error) {
do_read();
}
else {
cout << "error 3,only " << byte_transferred << " bytes writen" << endl;
}
});
}
tcp::socket socket_;
enum { maxlen = 1024 };
char buffer_[maxlen];
};
class server {
public:
server(boost::asio::io_context& io_context, short port)
:acceptor_(io_context, tcp::endpoint(tcp::v4(), port)) {
start();
}
void start() {
acceptor_.async_accept(
[this](boost::system::error_code ec, tcp::socket socket)
{
if (!ec)
{
std::make_shared<session>(std::move(socket))->start();
// boost::make_shared<session>(std::move(socket))->start();
}
start();
});
}
private:
tcp::acceptor acceptor_;
};
int main(int argc, char **argv) {
if (argc != 2) {
cout << "usage: server.exe Port" << endl;
}
try {
boost::asio::io_context io_context;
server server(io_context, std::atoi(argv[1]));
io_context.run();
}
catch (std::exception e) {
cout << e.what() << endl;
}
}