Я обнаружил, что могу заставить это работать на моем компьютере с Windows, если я заменил endpoint
и acceptor
на общие указатели, и вместо того, чтобы создавать их, передавая их в качестве аргументов в конструкторе, я специально создал общийуказатели внутри конструктора.Я не совсем уверен, почему это работает.Я могу только предположить, что, возможно, нет никаких гарантий, что аргументы конструктора будут переданы или созданы в порядке их появления, и, таким образом, вы можете попытаться создать acceptor
с endpoint
, который еще не правильно инициализирован?Это действительно мое единственное предположение.Дайте мне знать, если это работает для вас.Я мог успешно подключиться через localhost
через порт 5000
.
Без этих изменений клиент, с которым я пытался подключиться через localhost
, сказал мне, что соединение было активно отклонено.Однако это соглашение было успешным и, по-видимому, как можно меньше отклоняется от вашего исходного кода.Надеюсь, это поможет.
#include <boost/asio.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/bind.hpp>
#include <list>
#include <iostream>
using namespace boost::asio;
using namespace boost::asio::ip;
class ClientConnection
{
public:
ClientConnection(io_service & io_s)
: m_socket(io_s) {}
tcp::socket & socket() { return m_socket; }
private:
tcp::socket m_socket;
};
typedef boost::shared_ptr<ClientConnection> client_connection_ptr;
class ClientConnectionAcceptor
{
public:
ClientConnectionAcceptor(unsigned short port)
: m_io_service(),
m_port(port)
{
// now initializing endpoint and acceptor as shared pointers inside the constructor
m_endpoint = boost::shared_ptr<tcp::endpoint>(new tcp::endpoint(tcp::v4(), m_port));
m_acceptor = boost::shared_ptr<tcp::acceptor>(new tcp::acceptor(m_io_service, *m_endpoint));
std::cout << "acceptor is open : " << m_acceptor->is_open() << std::endl;
client_connection_ptr ccp(new ClientConnection(m_io_service));
m_acceptor->async_accept(
ccp->socket(),
boost::bind(&ClientConnectionAcceptor::handle_accept,this,
ccp, placeholders::error));
}
void handle_accept(client_connection_ptr ccp, const boost::system::error_code & error)
{
std::cout << "in handle_accept" << std::endl;
if(!error)
{
// m_rpc_oracle.AddNewClient(ccp);
client_connection_ptr new_ccp(new ClientConnection(m_io_service));
m_acceptor->async_accept(
new_ccp->socket(),
boost::bind(&ClientConnectionAcceptor::handle_accept,this,
ccp, placeholders::error));
}
}
io_service & io_service() { return m_io_service; }
private:
boost::asio::io_service m_io_service;
boost::shared_ptr<tcp::endpoint> m_endpoint;
boost::shared_ptr<tcp::acceptor> m_acceptor;
unsigned short m_port;
};
int main()
{
ClientConnectionAcceptor acceptor(5000);
acceptor.io_service().run();
}
РЕДАКТИРОВАТЬ
После некоторых дальнейших исследований было обнаружено, что проблема на самом деле связана со списком инициализаторов для класса ClientConnectionAcceptor
,В определении класса член m_port
был объявлен после m_endpoint
и m_acceptor
.В результате, несмотря на то, что в списке инициализаторов появился номер порта до , endpoint
и acceptor
были созданы, на самом деле значение порта было недействительным или инициализировано до после endpoint
и acceptor
уже созданы.Изменение определения класса таким образом, чтобы член m_port
был объявлен до endpoint
и acceptor
, устраняет проблему.