У меня проблемы с 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 секунд после установления соединения.
большое спасибо вам.
Прием завершается немедленно, потому что он не может ждать, потому что ему нечего ждать. Никакие данные никогда не будут получены на сокете прослушивания TCP. Вызов async_receive
только на ваших подключенных розетках.
Других решений пока нет …