mrjbom
@mrjbom

Async_accept возвращает ошибку в boost::asio?

Пишу асинхронный TCP-сервер, однако у меня при запуске, возникает "Ошибка акцептора", то есть в accept_handler возвращается ошибка, что делать?
error.message() говорит "Операция ввода/вывода была прервана из-за завершения потока команд или по запросу приложения".

#include <iostream>
#include <boost/asio.hpp>
#include <string>
#include <clocale>

using namespace boost::asio;
using namespace std;

class tcp_server
{
private:
    ip::tcp::socket socket;
    ip::tcp::acceptor acceptor;
    int clientCount = 0;
    int port = 0;
    enum { max_lenght = 256 };
    char readBuff[max_lenght];
    char writeBuff[max_lenght];
public:
    tcp_server(io_service& service, int port) : socket(service), acceptor(
        service,
        ip::tcp::endpoint(ip::tcp::v4(), port))
    {
        this->port = port;
        do_accept();
    }
    void do_accept()
    {
        acceptor.async_accept(
            socket,
            [this](const boost::system::error_code& error) {
            this->accept_handler(error);
        }
        );
    }
    void accept_handler(const boost::system::error_code& error)
    {
        if (!error)
        {
        }
        else
        {
            cout << "Ошибка акцептора\n";
            system("pause");
        }
    }
    void do_read()
    {
        if (socket.available())
        {
            socket.async_read_some(
                buffer(readBuff),
                [this](const boost::system::error_code& error, size_t bytes_transferred) {
                this->read_handler(error, bytes_transferred);
            }
            );
        }
    }
    void read_handler(const boost::system::error_code& error, size_t bytes_transferred)
    {
        if (!error)
        {
            strcpy_s(writeBuff, readBuff);
            socket.async_write_some(
                buffer(writeBuff),
                [this](const boost::system::error_code& error, size_t bytes_transferred) {
                this->write_handler(error, bytes_transferred);
            }
            );
        }
        else
        {
            cout << "Ошибка чтения из сокета\n";
            system("pause");
        }
    }
    void write_handler(const boost::system::error_code& error, size_t bytes_transferred)
    {
        if (!error)
        {

        }
        else
        {
            cout << "Ошибка записи в сокет\n";
            system("pause");
        }
    }
};

int main(int argc, char *argv[])
{
    try
    {
        setlocale(LC_ALL, "Rus");
        io_service service;
        tcp_server(service, 5000);
        service.run();
    }
    catch (exception& ex)
    {
        cout << "Исключение: " << ex.what();
        system("pause");
    }
    return 0;
}
  • Вопрос задан
  • 337 просмотров
Пригласить эксперта
Ответы на вопрос 1
@laphroaig
tcp_server(service, 5000);
У тебя "сервер" уничтожается сразу после создания, акцептор закрывается, все операции отменяются.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
19 апр. 2024, в 03:01
1000 руб./за проект
18 апр. 2024, в 21:56
2000 руб./за проект
18 апр. 2024, в 21:00
150 руб./за проект