boost handleAccept() 没有被调用

问题描述 投票:0回答:1

我正在尝试在端口 1234 上创建 TCP 服务器。下面的代码能够在端口 1234 上创建侦听器(通过 netstat -tln 确认)并且还从远程计算机建立连接(通过 netstat -an | grep 'ESTABLISHED' 确认) 但问题是handleAccept()没有被调用

使用 boost-1-68-0/

控制器.h 文件

    class Controller
    {
    public:
            void initConnectionListener();
            void setupAccept();
            void handleAccept(const boost::system::error_code& e);
    private:
            boost::asio::io_service *mIoService;
            tcp::acceptor *mAcceptor;
            boost::asio::ip::tcp::socket *mSocket;

控制器.cpp文件

void Controller::initConnectionListener() {
    mIoService = new  boost::asio::io_service();
    mAcceptor = new tcp::acceptor(*mIoService);
    mSocket = new tcp::socket(*mIoService);

    tcp::endpoint endpoint(tcp::v4(), 5555);
    mAcceptor->open(endpoint.protocol());

    mAcceptor->set_option(boost::asio::ip::tcp::acceptor::reuse_address(true));
    mAcceptor->bind(endpoint);
    mAcceptor->listen();

    setupAccept();
    mIoService->run();

}

void Controller::setupAccept(void)
{
printf("Start listening\n");

mAcceptor->async_accept(*mSocket,
    boost::bind(&TestPlugController::handleAccept, this,
    boost::asio::placeholders::error));
}

void Controller::handleAccept(const boost::system::error_code& e)
{
  if (!e)
  {
    printf("Incoming TCP connection accepted\n");
  }
    else if (e != boost::asio::error::operation_aborted)
  {
    printf("handleAccept failed with error code of %d which is not equal to operation_aborted\n", e.value());
  }
  else
  {
    printf("handleAccept failed with error code of operation_aborted\n");
  }

}

c++ boost
1个回答
0
投票

尚不完全清楚问题所在,但代码审查发现了一些问题。最大的问题:过度使用

new
。此外,您似乎使用了一些过时的示例代码(
io_service
早已被弃用,并且不再需要
mSocket
)。

这是简化和有效的:

住在Coliru

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

using namespace std::placeholders;
namespace asio = boost::asio;
using asio::ip::tcp;

struct Controller {
    void runConnectionListener() {
        mAcceptor.set_option(tcp::acceptor::reuse_address(true));
        acceptLoop();
        mIoc.run();
    }

    void acceptLoop(void) {
        std::cout << "Start listening" << std::endl;
        mAcceptor.async_accept(bind(&Controller::handleAccept, this, _1, _2));
    }

  private:
    void handleAccept(boost::system::error_code const& ec, tcp::socket s) {
        if (!ec) {
            std::cout << "connection accepted: " << s.remote_endpoint() << std::endl;
            acceptLoop();
        } else if (ec != asio::error::operation_aborted) {
            std::cerr << "accept failed with error " << ec.message() << std::endl;
        } else {
            std::cerr << "accept aborted" << std::endl;
        }
    }

    asio::io_context mIoc;
    tcp::acceptor    mAcceptor{mIoc, {tcp::v4(), 5555}};
};

int main() {
    Controller c;
    c.runConnectionListener();
}

还有本地演示:

© www.soinside.com 2019 - 2024. All rights reserved.