处理async_accept时不接受

Not accepting when handling async_accept?

本文关键字:不接受 accept async 处理      更新时间:2023-10-16

我正在尝试学习ASIO boost,但我很难理解它。我想为服务器制定一个可扩展和高性能的基本布局。

在以下URL中,有一个设置小型TCP服务器的示例:http://www.boost.org/doc/libs/1_42_0/doc/html/boost_asio/tutorial/tutdaytime3/src.html

我不明白的是以下部分:

void start_accept()
{
tcp_connection::pointer new_connection =
  tcp_connection::create(acceptor_.io_service());
acceptor_.async_accept(new_connection->socket(),
    boost::bind(&tcp_server::handle_accept, this, new_connection,
      boost::asio::placeholders::error));
}
void handle_accept(tcp_connection::pointer new_connection,
  const boost::system::error_code& error)
{
   if (!error)
   {
     new_connection->start();
     start_accept();
   }
}

start_accept()最终调用async_accept(),后者在接收数据时调用其处理程序。处理程序在完成时调用start_accept()。

但是,如果客户端在处理程序仍在运行时尝试连接,会发生什么?因为async_accept()不再侦听,所以无法处理请求,这不是真的吗?

如果我从错误的角度看待事情,我希望你能给我指一个正确的方向。

我想您注意到处理程序在处理accept(new_connection->start()):之后立即发布了一个新的async_accept操作

void handle_accept(tcp_connection::pointer new_connection,
  const boost::system::error_code& error)
{
   if (!error)
   {
     new_connection->start();   // this posts connection specific asynch operations
     start_accept();            // THIS POSTS THE ASYNC OPERATION AGAIN
   }
}

您询问是否存在竞争条件(在内核接收到连接的确切时刻,新的异步接受没有挂起)。

没有这样的竞争,因为内核在TCP/IP堆栈实现中对事件进行排队。


事实上,看看传统的select/poll/epoll方法,类似地,当套接字改变状态时,您不会得到异步信号。相反,你可以在自己空闲的时候投票。

内核对挂起事件的时间、缓冲区大小和数量有一些限制,因此如果您在一定时间内未能处理这些事件,它们可能会消失。

只要userland代码不能直接控制原始硬件,就永远不会有竞争条件,因为操作系统堆栈必须抽象出底层中断请求(否则您会将该操作系统称为ExoKernel)。