См. Код. : P Я могу получать новые соединения до вызова async_accept(). Моя функция делегата также никогда не вызывается, поэтому я не могу управлять любыми соединениями, которые я получаю, что делает новые соединения бесполезными. ;)Приёмник и проблемы с Async_Accept
Итак, вот мой вопрос. Есть ли способ предотвратить использование акселератором Boost ASIO для получения новых соединений самостоятельно и только получение соединений от async_accept()?
Спасибо!
AlexSocket::AlexSocket(boost::asio::io_service& s): myService(s)
{
//none at the moment
connected = false;
listening = false;
using boost::asio::ip::tcp;
mySocket = new tcp::socket(myService);
}
AlexSocket::~AlexSocket()
{
delete mySocket;
}
bool AlexSocket::StartListening(int port)
{
bool didStart = false;
if (!this->listening)
{
//try to listen
acceptor = new tcp::acceptor(this->myService);
boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::tcp::v4(), port);
acceptor->open(endpoint.protocol());
acceptor->set_option(boost::asio::ip::tcp::acceptor::reuse_address(true));
acceptor->bind(endpoint);
//CAN GET NEW CONNECTIONS HERE (before async_accept is called)
acceptor->listen();
didStart = true; //probably change?
tcp::socket* tempNewSocket = new tcp::socket(this->myService);
//acceptor->async_accept(*tempNewSocket, boost::bind(&AlexSocket::NewConnection, this, tempNewSocket, boost::asio::placeholders::error));
}
else //already started!
return false;
this->listening = didStart;
return didStart;
}
//this function is never called :(
void AlexSocket::NewConnection(tcp::socket* s, const boost::system::error_code& error)
{
cout << "New Connection Made" << endl;
//Start new accept async
tcp::socket* tempNewSocket = new tcp::socket(this->myService);
acceptor->async_accept(*tempNewSocket, boost::bind(&AlexSocket::NewConnection, this, tempNewSocket, boost::asio::placeholders::error));
}
bool AlexSocket::ConnectToServer(std::string toConnectTo, string port)
{
if (connected)
return false;
this->serverConnectedTo = toConnectTo;
this->serverPort = port;
ip::tcp::resolver resolver(myService);
ip::tcp::resolver::query newQuery(toConnectTo, port);
ip::tcp::resolver::iterator myIter = resolver.resolve(newQuery);
ip::tcp::resolver::iterator end;
//error
boost::system::error_code error = boost::asio::error::host_not_found;
//try each endpoint
bool connected = false;
while (error && myIter != end)
{
ip::tcp::endpoint endpoint = *myIter++;
std::cout << endpoint << std::endl;
mySocket->close();
mySocket->connect(*myIter, error);
if (error)
{
//try to connect, if it didn't work return false
cout << "Did not Connect" << endl << error << endl;
}
else
{
//was able to connect
cout << "Connected!" << endl;
connected = true;
}
myIter++;
}
this->connected = connected;
return connected;
}
EDIT: Я изменил код, чтобы отразить то, что ответы до сих пор говорили. Я перехожу в io_service в ctor моего класса. Как вы можете видеть ниже, main не вызывает запуск службы, поэтому я предполагаю, что ничто не должно быть в состоянии правильно подключиться?
Я положил свой отладчик на строку listen() и перешел на «canyouseeme.org». Набрал 57422 и нажал Connect. Не удалось. Отпустите строку listen(). Был способен подключиться. Это должно быть невозможно? Как никогда? :(
Не знаю, что делать больше. Основной() ниже.
int main()
{
boost::asio::io_service s;
AlexSocket test(s);
test.StartListening(57422);
test.ConnectToServer("localhost", "57422");
cout << "Enter something to quit" << endl;
int a2;
cin >> a2;
return 0;
}
Почему вы считаете, что соединение должно быть невозможно после прослушивания? Как вы думаете, что слушает? В документации по asio очень четко указано, что basic_socket_acceptor :: listen() помещает акцептор в состояние, в котором он будет слушать новые соединения. –