ребята, мне действительно нужна ваша помощь. Я изучаю boost :: asio и у меня есть 2 проблемы, которые я не могу делать за день ...
ЗДЕСЬ ЯВЛЯЕТСЯ ПРИМЕР ПРОСТОГО СЕРВЕРА, КОТОРЫЙ СДЕЛАЛ САМ
int main(
{
// crate a server, binding it and listening connections
// acceptor server;
//socket client
server.async_accept(client, boost::bind(accept_handle, _1, &server, &client));
io_service.run();
return 0;
}
void accept_handle(const boost::system::error_code& eCode, boost::asio::ip::tcp::acceptor* server, boost::asio::ip::tcp::socket* client)
{
char data[43];
client->async_read_some(boost::asio::buffer(data, 20), boost::bind(read_handle, _1, _2, server, client));
}
void read_handle(const boost::system::error_code& eCode, size_t bytes)
{
char data_buf[20] = "hello";
client->async_write_some(boost::buufer(data, 5), boost::bind(write_handle, _1, _2, server, client));
}
void write_accept(const boost::system::error_code& eCode, size_t bytes)
{
boost::asio::ip::tcp::socket newConnection(server->get_ioservice)); // taking he io_service of the server
server->async_accept(newConnection, boost::bind(accept_handle, _1, server, client));
}
ПРОБЛЕМА Сервер принимает одного клиента и не принимает другого ожидающего клиента .. где я делаю неправильно здесь ПРИМЕЧАНИЕ ... Я написал этот код в блокноте, так что извините за ошибки sintax, если есть некоторые заранее спасибо за помощь!!!
accept_handle должен создавать новый сокет и запускать на нём async_accept после того, как запустит асинхронное чтение на старом сокете. Если у вас с++11, сокеты можно перемещать, если c++98 - проще всего использовать boost::shared_ptr для управления временем жизни сокета.
В accept_handle и read_handler у вас потенциальная проблема: вы создаёте буфер на стеке, запускаете асинхронную операцию, после чего выходите из функции не дожидаясь завершения асинхронной операции. Можно считать, что буфер будет удалён и асинхронная функция при работе с ним будет работать неверно. Для борьбы с этом буфер нужно либо напрямую создавать в динамической памяти, либо как поле класса.
P.S. Чем вам примеры из документации не нравятся? Они вполне нормально работают и позволяют добавлять нужный вам функционал.
P.P.S. Если вы хотите получить пакет именно нужного вам размера, используйте asio::async_read(socket, buffer, handler)
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости