如何使用lambda创建一个ReadHandler

时间:2015-10-12 18:44:20

标签: c++ boost tcp lambda boost-asio

我正在尝试使用boost :: asio从TCP连接读取已定义的字节数,但是asio不接受我给它的句柄。

#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
        {

        });
    });
}

我得到的错误是:

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>
        ]

如果我使用socket_.async_read_some(),它可以正常工作,但是因为我想要读取固定数量的字节,所以它不是很好。

1 个答案:

答案 0 :(得分:3)

您不能通过可变引用获取错误代码:

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

    [](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();
}

打印

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'