Аватар для INexteR
15 / 14 / 1
Регистрация: 25.01.2023
Сообщений: 440

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

25.07.2024, 18:04. Показов 8057. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.07.2024, 18:04
Ответы с готовыми решениями:

Асинхронный сервер и клиент Boost Asio
Здравствуйте. Попробовал написать нечто такое. Но на этом этапе чтения не происходит ничего. Дальше std::cout&lt;&lt;&quot;Server: I...

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

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

2
184 / 72 / 35
Регистрация: 09.05.2022
Сообщений: 387
25.07.2024, 20:42
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
 Аватар для INexteR
15 / 14 / 1
Регистрация: 25.01.2023
Сообщений: 440
26.07.2024, 22:23  [ТС]
karlhildekruger, да, я пытался писать точно как у вас, но у меня в строке 56 не получается вызвать метод get_io_service: класс asio::basic_socket_acceptor<asio::ip::tc p, asio::any_io_executor> не содержит члена get_io_executor. Есть только методы get_executor и get_option. И следующая строка тоже выдает ошибку: Ошибка C2672 "asio::basic_socket_acceptor<asio::ip::t cp,asio::any_io_executor>::async_accept" : не найдена соответствующая перегруженная функция.

Добавлено через 4 часа 12 минут
Цитата Сообщение от INexteR Посмотреть сообщение
класс asio::basic_socket_acceptor<asio::ip::tc p, 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.07.2024, 22:23
Помогаю со студенческими работами здесь

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

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

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

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

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


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

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

Новые блоги и статьи
Обнаружение объектов в реальном времени на Python с YOLO и OpenCV
AI_Generated 29.04.2025
Компьютерное зрение — одна из самых динамично развивающихся областей искусственного интеллекта. В нашем мире, где визуальная информация стала доминирующим способом коммуникации, способность машин. . .
Эффективные парсеры и токенизаторы строк на C#
UnmanagedCoder 29.04.2025
Обработка текстовых данных — частая задача в программировании, с которой сталкивается почти каждый разработчик. Парсеры и токенизаторы составляют основу множества современных приложений: от. . .
C++ в XXI веке - Эволюция языка и взгляд Бьярне Страуструпа
bytestream 29.04.2025
C++ существует уже более 45 лет с момента его первоначальной концепции. Как и было задумано, он эволюционировал, отвечая на новые вызовы, но многие разработчики продолжают использовать C++ так, будто. . .
Слабые указатели в Go: управление памятью и предотвращение утечек ресурсов
golander 29.04.2025
Управление памятью — один из краеугольных камней разработки высоконагруженных приложений. Го (Go) занимает уникальную нишу в этом вопросе, предоставляя разработчикам автоматическое управление памятью. . .
Разработка кастомных расширений для компилятора C++
NullReferenced 29.04.2025
Создание кастомных расширений для компиляторов C++ — инструмент оптимизации кода, внедрения новых языковых функций и автоматизации задач. Многие разработчики недооценивают гибкость современных. . .
Гайд по обработке исключений в C#
stackOverflow 29.04.2025
Разработка надёжного программного обеспечения невозможна без грамотной обработки исключительных ситуаций. Любая программа, независимо от её размера и сложности, может столкнуться с непредвиденными. . .
Создаем RESTful API с Laravel
Jason-Webb 28.04.2025
REST (Representational State Transfer) — это архитектурный стиль, который определяет набор принципов для создания веб-сервисов. Этот подход к построению API стал стандартом де-факто в современной. . .
Дженерики в C# - продвинутые техники
stackOverflow 28.04.2025
История дженериков началась с простой идеи — создать механизм для разработки типобезопасного кода без потери производительности. До их появления программисты использовали неуклюжие преобразования. . .
Тестирование в Python: PyTest, Mock и лучшие практики TDD
py-thonny 28.04.2025
Тестирование кода играет весомую роль в жизненном цикле разработки программного обеспечения. Для разработчиков Python существует богатый выбор инструментов, позволяющих создавать надёжные и. . .
Работа с PDF в Java с iText
Javaican 28.04.2025
Среди всех форматов PDF (Portable Document Format) заслуженно занимает особое место. Этот формат, созданный компанией Adobe, превратился в универсальный стандарт для обмена документами, не зависящий. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru