/ Ako vytvoriť ReadHandler s lambda - c ++, boost, tcp, lambda, boost - asio

Ako vytvoriť ReadHandler s lambda - c + +, boost, tcp, lambda, boost - asio

Snažím sa čítať definovaný počet bajtov z TCP spojenia pomocou boost :: asio, ale asio neakceptuje rukoväť, ktorú dám.

#include <boost/asio.hpp>

int main(){
int port = 2222;
boost::asio::io_service io_service_;
boost::asio::ip::tcp::acceptor acceptor_(io_service_, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), port));
char packet_type[4];

boost::asio::ip::tcp::socket socket_(io_service_);
acceptor_.async_accept(socket_, [&](boost::system::error_code ec){

boost::asio::async_read(socket_, boost::asio::buffer(packet_type, 4),
[](boost::system::error_code &ec, std::size_t N) // <- error
{

});
});
}

Chyba, ktorú mám, je:

error C2338: ReadHandler type requirements not met
: see reference to function template instantiation "boost::asio::async_result<Handler>::type boost::asio::async_read<boost::asio::ip::tcp::socket,boost::asio::mutable_buffers_1,main::<lambda_3400466f101ccf7a8013d928754266a0>::()::<lambda_af1dbf92bb67c9e911b61eb3b897934f>>(AsyncReadStream &,const MutableBufferSequence &,ReadHandler &&)" being compiled
with
[
Handler=main::<lambda_3400466f101ccf7a8013d928754266a0>::()::<lambda_af1dbf92bb67c9e911b61eb3b897934f>,
AsyncReadStream=boost::asio::ip::tcp::socket,
MutableBufferSequence=boost::asio::mutable_buffers_1,
ReadHandler=main::<lambda_3400466f101ccf7a8013d928754266a0>::()::<lambda_af1dbf92bb67c9e911b61eb3b897934f>
]

Funguje to dobre, ak používam socket_.async_read_some (), ale pretože chcem pevný počet bajtov čítať, nie je to tak dobré.

odpovede:

2 pre odpoveď č. 1

Kód chyby nemôžete prevziať podľa meniteľnej referencie:

    [](boost::system::error_code ec, std::size_t N) {}

alebo

    [](boost::system::error_code const& ec, std::size_t N) {}

Live On Coliru

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

int main(){
int port = 2222;
boost::asio::io_service io_service_;
boost::asio::ip::tcp::acceptor acceptor_(io_service_, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), port));
char packet_type[4];

boost::asio::ip::tcp::socket socket_(io_service_);
acceptor_.async_accept(socket_, [&](boost::system::error_code ec){

boost::asio::async_read(socket_, boost::asio::buffer(packet_type, 4),
[&](boost::system::error_code ec, std::size_t N)
{
std::cout << "Received: "";
std::cout.write(packet_type, sizeof(packet_type)) << ""n";
});
});

io_service_.run();
}

výtlačky

g++ -std=c++11 -O2 -Wall -pedantic -pthread main.cpp -lboost_system -lboost_thread
./a.out& sleep 1; nc 127.0.0.1 2222 <<< halp

Received: "halp"