13 / 12 / 1
Регистрация: 25.01.2023
Сообщений: 423
1

Написать простой асинхронный сервер с помощью boost

25.07.2024, 18:04. Показов 1476. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Приветствую. Есть код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Server
{
private:
    asio::ip::tcp::acceptor acceptor;
    void StartAccept()
    {
        
    }
public:
    Server(asio::io_service& io_serv) : acceptor_(io_serv, asio::ip::tcp::endpoint(asio::ip::tcp::v4(), 51111))
    {
        StartAccept();
    }
 
    void HandleAccept(/*параметры?*/)
    {
        
    }
};
Помогите написать тело StartAccept, чтобы сервер был способен обрабатывать множество запросов. И также правильно указать параметры для функции-обработчика.
Я писал эти функции так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void StartAccept()
{
    RequestHandler::Pointer connection = RequestHandler::Create(acceptor_.get_executor()/*???*/);
    acceptor.async_accept(connection->GetSocket(), 
        bind(&Server::HandleAccept, this, connection, asio::placeholders::error));//???
}
void HandleAccept(Handler::Pointer connection, asio::error_code& err)
{
    if (!err) {
        connection->Start();
    }
    StartAccept();
}
Но в StartAccept я не понимаю
1) Как из возвращаемого значения get_executor() asio::any_io_executor вывести asio::io:service.
2) Какие параметры требует acceptor.accept.
Класс RequestHandler выглядит так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
class RequestHandler : public enable_shared_from_this<RequestHandler>
{
private:
    asio::ip::tcp::socket socket;
    const int size = sizeof(int);
    int sum;
 
public:
    typedef shared_ptr<RequestHandler> Pointer;
    RequestHandler(asio::io_service& io_service) : socket(io_service) {}
    static Pointer Create(asio::io_service& io_service)
    {
        return Pointer(new RequestHandler(io_service));
    }
    asio::ip::tcp::socket& GetSocket()
    {
        return socket;
    }
 
    void Start()
    {
        socket.async_read_some(asio::buffer(&sum, size), bind(&RequestHandler::Read,
                shared_from_this(), asio::placeholders::error, asio::placeholders::bytes_transferred));
    }
 
    void Read(const asio::error_code& err, size_t bytes_transferred)
    {
        if (!err) {
            cout << sum << endl;
        }
        else {
            std::cerr << "error: " << err.message() << std::endl;
            socket.close();
        }
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.07.2024, 18:04
Ответы с готовыми решениями:

Асинхронный сервер и клиент Boost Asio
Здравствуйте. Попробовал написать нечто такое. Но на этом этапе чтения не происходит ничего. Дальше...

Написать сервер с помощью ACE или Boost
Здравствуйте всем-всем. Начал изучать сетевые приложения и сопутствующие им атрибуты. Примерно...

Boost Asio - простой локальный Сервер-Клиент: IPv4 и IPv6
Здравствуйте, Пробую Boost Asio, ну соответственно для начала простейший Сервер-Клиент: ...

Как написать асинхронный UDP сервер?
Дайте пожалуйста код асинхронного UDP сервера и клиента для теста, необходимо чтобы клиент...

2
160 / 55 / 27
Регистрация: 09.05.2022
Сообщений: 351
25.07.2024, 20:42 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include <iostream>
#include <memory>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
 
using boost::asio::ip::tcp;
 
class RequestHandler : public std::enable_shared_from_this<RequestHandler>
{
private:
    tcp::socket socket_;
    const int size = sizeof(int);
    int sum;
 
public:
    typedef std::shared_ptr<RequestHandler> Pointer;
    
    RequestHandler(boost::asio::io_service& io_service) : socket_(io_service) {}
 
    static Pointer Create(boost::asio::io_service& io_service)
    {
        return std::make_shared<RequestHandler>(io_service);
    }
 
    tcp::socket& GetSocket()
    {
        return socket_;
    }
 
    void Start()
    {
        socket_.async_read_some(boost::asio::buffer(&sum, size),
            boost::bind(&RequestHandler::Read, shared_from_this(),
            boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
    }
 
    void Read(const boost::system::error_code& err, size_t bytes_transferred)
    {
        if (!err) {
            std::cout << "Received sum: " << sum << std::endl;
        }
        else {
            std::cerr << "Error: " << err.message() << std::endl;
            socket_.close();
        }
    }
};
 
class Server
{
private:
    tcp::acceptor acceptor_;
    
    void StartAccept()
    {
        RequestHandler::Pointer connection = RequestHandler::Create(acceptor_.get_io_service());
        acceptor_.async_accept(connection->GetSocket(), 
            boost::bind(&Server::HandleAccept, this, connection, boost::asio::placeholders::error));
    }
 
    void HandleAccept(RequestHandler::Pointer connection, const boost::system::error_code& error)
    {
        if (!error) {
            connection->Start();
        }
        StartAccept();
    }
 
public:
    Server(boost::asio::io_service& io_service)
        : acceptor_(io_service, tcp::endpoint(tcp::v4(), 51111))
    {
        StartAccept();
    }
};
 
int main()
{
    try {
        boost::asio::io_service io_service;
        Server server(io_service);
        io_service.run();
    }
    catch (std::exception& e) {
        std::cerr << "Exception: " << e.what() << std::endl;
    }
 
    return 0;
}
0
13 / 12 / 1
Регистрация: 25.01.2023
Сообщений: 423
26.07.2024, 22:23  [ТС] 3
karlhildekruger, да, я пытался писать точно как у вас, но у меня в строке 56 не получается вызвать метод get_io_service: класс asio::basic_socket_acceptor<asio::ip::tcp, asio::any_io_executor> не содержит члена get_io_executor. Есть только методы get_executor и get_option. И следующая строка тоже выдает ошибку: Ошибка C2672 "asio::basic_socket_acceptor<asio::ip::tcp,asio::any_io_executor>::async_accept" : не найдена соответствующая перегруженная функция.

Добавлено через 4 часа 12 минут
Цитата Сообщение от INexteR Посмотреть сообщение
класс asio::basic_socket_acceptor<asio::ip::tcp, asio::any_io_executor> не содержит члена get_io_executor.
Исправил эту ошибку:
C++
1
Handler::Pointer connection = Handler::Create(acceptor_.get_executor().context());
Т.е. заменил asio::io_service на asio::execution_context

Добавлено через 1 час 17 минут
Я так понял чтобы переписать 57 строку без ошибок нужно подключить также boost/bind. Но у меня в проекте используется только asio. Как правильно подключить boost/bind?
0
26.07.2024, 22:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.07.2024, 22:23
Помогаю со студенческими работами здесь

Решить проблему: простой веб сервер на основе boost::asio падает именно при первом же обращении к серверу
Запускаю код указанный ниже, но при обращении на айпи и порт который слушает сервер, сервер падает...

Как написать простой клиент-сервер
Доброго времени суток господа. Возникла маленькая проблемка. Пытаюсь разобраться с сокетами, но...

Как написать простой веб сервер
Доброго времени суток. Цель: разгрызть веб, написав программу-веб сервер. Суть: С браузера клиента...

Написать клиент-сервер (самый простой)
Всем доброго времени суток ! Я поставил себе задачу написать клиент-сервер (самый простой) ,...

Пробую написать простой сервер на Linux. Не запускается
Пытаюсь учить сети под линукс. У меня Mint 17, Возможно запуск программы делаю неправильно. Всё...

Асинхронный сервер
Есть идея небольшого проекта, для его реализации необходимо написать сервер, который будет работать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru