Библиотека ASIO — обработчики не называются

У меня проблемы с ASIO Boost Library. Проблема в асинхронных функциях.

Это простой код сервера.

void handle_accept( const boost::system::error_code& error )
{
std::cout << "Someone connected" << std::endl;
}

void handle_read( const boost::system::error_code& error )
{
printf( "Message: %s \n", somedata);
}

int main()
{

std::cout << "Starting server ....\n" << std::endl;

try
{
boost::asio::io_service io_service;
tcp::socket  mysocket(io_service);
tcp::acceptor myacceptor(io_service, tcp::endpoint(tcp::v4(), 5000));

myacceptor.async_accept( mysocket, boost::bind( &handle_accept, boost::asio::placeholders::error));
mysocket.async_receive(  boost::asio::buffer(somedata, 1024)  , boost::bind( &handle_read, boost::asio::placeholders::error) );
io_service.run();

std::cout << "END. \n" << std::endl;
sleep(5);

}  catch (std::exception& e)
{
std::cerr << "Exception: " << e.what() << "\n";
}
return 0;

}

и код клиента здесь

int main()
{
std::cout << "Starting client ....\n" << std::endl;

try
{
boost::asio::io_service io_service;

tcp::resolver resolver(io_service);
tcp::resolver::query query(tcp::v4(), "localhost", "5000");
tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
tcp::socket mysocket(io_service);

boost::asio::connect(mysocket, endpoint_iterator);

sleep(5);
sprintf( somedata, "This is a message i sent.");
mysocket.send( boost::asio::buffer(somedata, 1024)  );

}  catch (std::exception& e)
{
std::cerr << "Exception: " << e.what() << "\n";
}
return 0;
}

Итак, как это должно работать. Сервер должен ждать подключения от клиента, когда клиент подключен, он должен вызвать handle_accept. Когда клиент подключен, действительно вызывается handle_accept, но он также вызывает handle_read, даже если данные не получены !!! Зачем ? Клиент отправляет данные через 5 секунд после установления соединения.

большое спасибо вам.

0

Решение

Прием завершается немедленно, потому что он не может ждать, потому что ему нечего ждать. Никакие данные никогда не будут получены на сокете прослушивания TCP. Вызов async_receive только на ваших подключенных розетках.

4

Другие решения

Других решений пока нет …