Не могу понять, почему я не могу вызывать функцию 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;
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Прошу, помогите найти код в ошибке и решить проблему, а то моя тупая головушка не может понять конкретного местаПрошу, не судите строго, я новичок...
У меня не много опыта с С++, но вот, что мне нужно сделатьУ меня есть метод который должен скастить unsigned char const * к void*
Помогите выбрать реализацию метода из двух вариантов - calc1() и calc2():
Идея какая, я открываю файл и считываю его построчно, каждую строку я конвертирую в char вывожу на экран и отправляю при помощи send() на tcp серверФайл...