1

これは、サーバーの現在のコードです。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_readI を使用する代わりにasync_read_some、telnet から送信された最初のメッセージを取得できます。

私が間違っていることについて何か提案はありますか?
ありがとう。

4

1 に答える 1

3

async_readlength パラメータで指定されたバイト数を読み取ります。はまだバイトasync_readの読み取りを待機しているため、最初のメッセージは表示されません。max_lengthこの質問では、同様の動作について説明します

于 2013-07-30T13:40:27.873 に答える