boost :: asio server с простыми функциями

310
02 октября 2017, 02:08

ребята, мне действительно нужна ваша помощь. Я изучаю 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, если есть некоторые заранее спасибо за помощь!!!

Answer 1

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)

READ ALSO
отлов всплывающих подсказок WinAPI

отлов всплывающих подсказок WinAPI

Обычно, всплывающие подсказки реализуются посредством заполнения структуры NOTIFYICONDATA + передачей это структуры в функцию Shell_NotifyIconAЕсли у экземпляра...

270
Поиск в глубину, вопрос из решенной задачи

Поиск в глубину, вопрос из решенной задачи

Разбираю задачу из мазурока:

358
Плагин для Jquery

Плагин для Jquery

Помогите пожалуйста с плагином для JqueryЗадание следующее: Необходимо написать плагин для jQuery, который каждые 30 мс собирает данные о положении...

233
Border-radius в подвал блока

Border-radius в подвал блока

Каким образом можно подрезать подвал? border-bottom-left/right-radius не даёт никакого результатаНужно сделать примерно так, как на картинке:

207