Boost :: Asio уведомляет сервер при поступлении сообщения в асинхронном режиме - PullRequest
0 голосов
/ 20 ноября 2018

Я использую Boost :: asio, я настроил сервер и клиент, когда сервер принимает сокет, клиент может отправить сообщение не сразу, я надеюсь, что сервер будет заблокирован, чтобы дождаться прибытия сообщения, я знаючто read может копировать информацию, но я просто хочу получать уведомления, и позже я скопирую в конкретный объект.Может ли кто-нибудь сказать мне, как получать уведомления, когда сообщение приходит от клиента, или в моем коде есть что-то необоснованное, пожалуйста, исправьте меня и покажите стандартную реализацию этого типа сервера, большое спасибо!

typedef boost::shared_ptr<tcp::socket> Ptr_socket;
void handle_accept(Ptr_socket sock, const boost::system::error_code &err);
boost::asio::io_context context;
tcp::endpoint ep(tcp::v4(), 2001); 
tcp::acceptor acceptor(context, ep);

void start_accept(Ptr_socket sock) {
    acceptor.async_accept(*sock, boost::bind(handle_accept, sock, _1));
}

char buffer_[1000];

void read(Ptr_socket sock)
{
    sock->async_read_some(boost::asio::buffer(buffer_),
        [sock](boost::system::error_code ec, std::size_t length)
    {
        if (!ec)
        {

            cout << buffer_[0] << "succeed receive \n";
            read(sock);
        }
        else
        {
            cout << ec;
        }

    });
}


void handle_accept(Ptr_socket sock, const boost::system::error_code &err) {
    if (err) return;
    printf("succeed connect\n");
    read(sock);

}

Ptr_socket wait()
{
    Ptr_socket  p_sock(new tcp::socket(context));
    start_accept(p_sock);
    context.run();  //a kind of thread.join();
    return p_sock;
}


int main() {
    auto p=wait();
    context.run();
    return 0;
}
...