async_read不读取从telnet发送的数据

时间:2013-07-30 13:30:48

标签: c++ boost boost-asio

这是我目前的服务器代码。我使用telnet连接到服务器。

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

using boost::asio::ip::tcp;

class Connection
{
public:
    Connection(boost::asio::io_service& io_service) : socket_(io_service)
    {

    }

    void start()
    {
        AsyncRead();
    }

    tcp::socket& socket()
    {
        return socket_;
    }
private:
    void AsyncRead()
    {
        boost::asio::async_read(socket_, boost::asio::buffer(data_, max_length),
                                [this](boost::system::error_code ec, std::size_t length)
                                {
                                    if (!ec)
                                    {
                                        std::cout << data_ << std::endl;
                                    }
                                });
    }

    tcp::socket socket_;
    enum { max_length = 1024 };
    char data_[max_length];
};


class server
{
public:
    server(boost::asio::io_service& io_service, short port)
    : io_service_(io_service),
        acceptor_(io_service, tcp::endpoint(tcp::v4(), port))
    {
        start_accept();
    }

private:
    void start_accept()
    {
        Connection* connection = new Connection(io_service_);
        acceptor_.async_accept(connection->socket(), [this, connection](boost::system::error_code ec)
                               {
                                   //std::cout << ec.message() << std::endl;
                                   if(!ec)
                                   {
                                       std::cout << "Connected." << std::endl;
                                       connection->start();
                                   }
                                   else
                                   {
                                       delete connection;
                                   }

                                   start_accept();
                               });
    }

    boost::asio::io_service& io_service_;
    tcp::acceptor acceptor_;
};

int main(int argc, char* argv[])
{
    try
    {
        boost::asio::io_service io_service;

        server s(io_service, 7899);

        io_service.run();
    }
    catch (std::exception& e)
    {
        std::cerr << "Exception: " << e.what() << "\n";
    }

    return 0;
}

而不是async_read我使用async_read_some我可以从telnet发送第一条消息,就是这样。

对我做错了什么建议?
感谢。

1 个答案:

答案 0 :(得分:3)

async_read将读取length参数中指定的字节数。您没有看到第一条消息,因为async_read仍在等待读取max_length个字节。这个question讨论了类似的行为