Путаница с сигнатурами хэндлеров асинхронных функций boost.Asio

175
02 июля 2022, 21:00

Не могу понять, почему я не могу вызывать функцию async_accept с параметрами, указанными в main в коде ниже. Я знаю что сигнатура хэндлера async_accept следующая: void (*handler)(const boost::system::error_code&), но почему я могу передавать в async_accept функции с совершенно иной сигнатурой(используя bind), но не могу передать именно метод ReceiveMessage,хотя функцию out(с сигнатурой void out(Session::SessionSharedPtr session)) я передать могу. В случае же с std::bind(&Session::ReceiveMessage, session, outFunc);компилятор пишет No matching member function for call to 'async_accept' . Т.е в обоих случаях сигнатуры функций отличаются от заданной, но на случай с функцией out, компилятор не ругается, а с членом класса ReceiveMessage ругается. Как это исправить?

#include <iostream>
#include <functional>
#include <memory>
#include <boost/asio.hpp>

using boost::asio::ip::tcp;
class Session : public std::enable_shared_from_this<Session>{
private:
    tcp::socket sock;
    std::string message;
    uint16_t maxMessageLength;
private:
    Session(boost::asio::io_context& context, uint16_t maxMessageLength);
    void onRead(std::function<void()> handler);
public:
    typedef std::shared_ptr<Session> SessionSharedPtr;
public:
    static SessionSharedPtr CreateNewSession(boost::asio::io_context& context, short messageLength = 2048);
    void ReceiveMessage(std::function<void(const boost::system::error_code&, size_t)> handler);
    void SendMessage(std::string& message, std::function<void(const boost::system::error_code&, size_t)> handler);
    std::string& GetMessage();
    tcp::socket& GetSocket();
    ~Session();
};
Session::Session(boost::asio::io_context &context, uint16_t maxMessageLength) : sock(context)
{
    this->maxMessageLength = maxMessageLength;
    message.resize(maxMessageLength);
}
Session::SessionSharedPtr Session::CreateNewSession(boost::asio::io_context &context, short messageLength) {
    return Session::SessionSharedPtr(new Session(context, messageLength));
}
void Session::ReceiveMessage(std::function<void(const boost::system::error_code&, size_t)> handler) {
    sock.async_read_some(boost::asio::buffer(message, maxMessageLength), handler);
}
void Session::SendMessage(std::string &messageToSend,
                          std::function<void(const boost::system::error_code &, size_t)> handler) {
    sock.async_write_some(boost::asio::buffer(messageToSend, maxMessageLength), handler);
}
Session::~Session() {
    sock.close();
}
std::string &Session::GetMessage() {
    return message;
}
tcp::socket &Session::GetSocket() {
    return sock;
}
void Session::onRead(std::function<void()> handler) {
    handler();
}
void out(Session::SessionSharedPtr session){
    std::cout << session->GetMessage();
}
int main() {
    boost::asio::io_context context;
    tcp::acceptor acceptor(context);
    auto session = Session::CreateNewSession(context);
    auto outFunc = std::bind(out, session);
    auto readFunc = std::bind(&Session::ReceiveMessage, session, outFunc);
    acceptor.async_accept(session->GetSocket(), readFunc);
    return 0;
}
READ ALSO
Помогите решить проблему с кодом на Arduino

Помогите решить проблему с кодом на Arduino

Прошу, помогите найти код в ошибке и решить проблему, а то моя тупая головушка не может понять конкретного местаПрошу, не судите строго, я новичок...

206
Как присвоить unsigned char const * к void*?

Как присвоить unsigned char const * к void*?

У меня не много опыта с С++, но вот, что мне нужно сделатьУ меня есть метод который должен скастить unsigned char const * к void*

216
Выбор между std::generate() и std::for_each()

Выбор между std::generate() и std::for_each()

Помогите выбрать реализацию метода из двух вариантов - calc1() и calc2():

138
Чтение файла и отправка по tcp

Чтение файла и отправка по tcp

Идея какая, я открываю файл и считываю его построчно, каждую строку я конвертирую в char вывожу на экран и отправляю при помощи send() на tcp серверФайл...

176