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

147
17 октября 2019, 14:30

Пишу асинхронный 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;
}
Answer 1

Во-первых сервер моментально разрушается еще даже до запуску io службы:

tcp_server server{service, 5000};

Во-вторых аксептор не переведен в режим прослушивания:

acceptor.listen();
acceptor.async_accept(
READ ALSO
Вывести wchar_t в ncurses с помощью printw

Вывести wchar_t в ncurses с помощью printw

Вывести в терминал могу так std::wcout << serialNumber << std:: endl; Но мне нужно вывести в ncurses меню там используется printwНа что получаю ошибку main

157
Контейнеры map/set и кэш процессора

Контейнеры map/set и кэш процессора

В книге Артур О'Двайр "Осваиваем C++17 STL"

141
Нет либы для boost::asio

Нет либы для boost::asio

Пути к boost и к либам есть

111