Я использую 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;
}