【问题标题】:boost::asio accepting socket error already openboost::asio 接受套接字错误已经打开
【发布时间】:2013-09-12 18:29:33
【问题描述】:

我不确定是什么导致了这个错误Already Open

#include "AsyncServer.h"


AsyncServer::AsyncServer(boost::asio::io_service& io_service, std::string ip, unsigned short port)
    : acceptor(io_service, tcp::endpoint(boost::asio::ip::address_v4::from_string(ip), port))
{

    BeginAccept();
}


AsyncServer::~AsyncServer()
{
}


void AsyncServer::BeginAccept(){
    tcp::socket temp = tcp::socket(acceptor.get_io_service());
    acceptor.async_accept(temp, boost::bind(&AsyncServer::EndAccept, this, boost::asio::placeholders::error));
}

void AsyncServer::EndAccept(const boost::system::error_code& error){

    if (!error)
    {
        //continue with connection
        std::cout << "connected" << std::endl;
    }
    else
    {
        std::cout << error.message() <<std::endl;
    }

    BeginAccept();
}

我想要做的是将套接字和错误传递给EndAccept,但它会中断并且错误是Already Open,我不知道这里出了什么问题!

【问题讨论】:

    标签: c++ sockets boost asynchronous boost-asio


    【解决方案1】:

    temp 是一个本地对象,它在BeginAccept 退出时立即被销毁。这意味着 async_accept 与一个危险的引用一起工作,这是未定义的行为。

    temp 设为成员(给它起更有意义的名称也是个好主意)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-15
      • 2011-12-05
      • 1970-01-01
      • 2011-10-03
      • 2021-07-29
      相关资源
      最近更新 更多