异步读取服务器BoostAsio没有调用处理程序

时间:2015-10-18 13:55:54

标签: c++ boost server boost-asio

我目前正在使用Boost :: Asio来做一个基本的读/写服务器,在使用库的async_read函数方面我遇到了一些问题。

这是我的代码段:

main.cpp

#include <ctime>
#include <iostream>
#include <string>
#include <boost/asio.hpp>
#include "TCPServer.hpp"
#include "TCPConnection.hpp"

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

int main()
{
  try
    {
      boost::asio::io_service io_service;
      TCPServer server(io_service);
      io_service.run();
    }
  catch (std::exception& e)
    {
      std::cerr << e.what() << std::endl;
    }

  return 0;
}

TCPServer.hpp:

#ifndef TCPSERVER_HPP_
#define TCPSERVER_HPP_

#include <ctime>
#include <iostream>
#include <string>
#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>
#include <boost/asio.hpp>
#include "TCPConnection.hpp"

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

class TCPServer
{
private:
  tcp::acceptor _acceptor;

public:
  TCPServer(boost::asio::io_service& ioService)
    : _acceptor(ioService, tcp::endpoint(tcp::v4(), 4040))
  {
    startAccept();
  }

private:
  void startAccept()
  {
    TCPConnection::pointer newConnection =
      TCPConnection::create(_acceptor.get_io_service());
    _acceptor.async_accept(newConnection->getSocket(),
                           boost::bind(&TCPServer::handleAccept, this, newConnection,
                                       boost::asio::placeholders::error));
  }

  void handleAccept(TCPConnection::pointer newConnection, const boost::system::error_code& error)
  {
    if (!error)
      {
        newConnection->asyncWrite("JIOLE");
        startAccept();
      }
  }
};

#endif

TCPConnection.hpp:

#ifndef TCPCONNECTION_HPP_
#define TCPCONNECTION_HPP_

#include <ctime>
#include <iostream>
#include <string>
#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>
#include <boost/asio.hpp>

class TCPConnection : public boost::enable_shared_from_this<TCPConnection>
{
private:
  boost::asio::ip::tcp::socket _socket;
  std::string _readMessage;
  boost::asio::streambuf _response;

public:
  typedef boost::shared_ptr<TCPConnection> pointer;

  static pointer create(boost::asio::io_service& ios)
  {
    return pointer(new TCPConnection(ios));
  }

  boost::asio::ip::tcp::socket& getSocket()
  {
    return _socket;
  }

  void  asyncWrite(const std::string &message)
  {
    boost::asio::async_write(_socket,
                             boost::asio::buffer(message),
                             boost::bind(&TCPConnection::handleWrite, shared_from_this(),


    boost::asio::placeholders::error));
        std::cout << "AsyncWrite" << std::endl;
      }

  void asyncRead()
  {
    std::cout << "1st \"asyncRead\"" << std::endl;
    boost::asio::async_read(_socket,
                            _response,
                            boost::bind(&TCPConnection::handleRead, shared_from_this(),
                                        boost::asio::placeholders::error));
    std::cout << "2nd \"asyncRead\"" << std::endl;
  }

  void close()
  {
    _socket.close();
  }

private:

  TCPConnection(boost::asio::io_service &ioS) : _socket(ioS) {}

  void  handleWrite(const boost::system::error_code& error)
  {
    std::cout << "Write Handler" << std::endl;
    if (!error)
      {
        asyncRead();
      }
    //SEE WHAT TO DO IN CASE OF ERROR                                                                                                                                                                                
  }

  void handleRead(const boost::system::error_code& error)
  {
    std::cout << "Read Handler" << std::endl;
    if (!error)
      {
        std::cout << &_response << std::endl;
        asyncRead();
      }
    else
      {
        std::cout << &error << std::endl;
        _socket.close();
      }
    //CREATE SENDER(RSEPONSE::ERROR)                                                                                                                                                                                 
  }

};

#endif

问题是我的async_read没有调用处理程序。这是输出:

输出

AsyncWrite
Write Handler
1st "asyncRead"
2nd "asyncRead"

当我在NetCat客户端上写东西时,没有收到任何内容。

当我按ctrl + C:

时会发生什么
Read Handler
0x7fff645f3be0

我不明白为什么没有收到任何东西。

1 个答案:

答案 0 :(得分:1)

问题是你没有告诉async_read 何时应该调用处理程序函数。有两种方法可以指定:指定调用处理程序之后的输入大小,或通过async_read_until指定分隔符。

在您的情况下,您可以使用以下内容:

boost::asio::async_read_until(_socket,
                              _response,
                               "\n",
                               boost::bind(&TCPConnection::handleRead, 
                                           shared_from_this(),
                                           boost::asio::placeholders::error)
                             );

当从客户端发送换行符时,这将调用处理程序。