处理async_accept时不接受
Not accepting when handling async_accept?
我正在尝试学习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)。
相关文章:
- 为什么线程不接受此输入?
- 函数不接受 X 参数,函数使用默认参数
- C++ boost::asio::ip::tcp::acceptor 有时不接受连接器?
- B不接受8作为输入的是什么?C++
- C++数组输入不接受一定数量的整数
- C++概念assignable_from不接受 const&-return 运算符=
- 斯堪夫不接受输入
- C++字符数组不接受超过 4 个字符的输入
- CIN不接受C++中带有空格的输入?
- 为什么C++ STL 哈希表 (unordered_map) 不接受向量作为键
- 为什么不接受具有默认分配参数的函数作为 0-arg 生成器?
- 模板接受常量,但不接受文字
- 如何在构造函数中传递 const 引用时强制编译器不接受右值
- 为什么 strtok_r() 只接受字符数组而不接受字符指针
- C++ cout 不接受字符串或带 + 的字符串
- std::cin不接受输入
- 带有openSSL的libwebsocket服务器不接受连接
- 函数不接受 C++ 参数
- 将任意数据传递给不接受"void* userarg"的C++回调
- C++ 套接字侦听器 accept() 在发布时不接受连接请求