boost::asio系统的无休止循环:第一次连接后出现9个错误
boost::asio endless loop of system:9 error after first connection
我有一个服务器,使用带有以下代码的asio,100%复制自示例。当没有连接时,代码表现良好。然而,一旦第一个客户端连接,handle-accept就开始输出大量的系统:9个错误,我无法连接任何其他客户端。连接的单个客户端可以很好地执行异步读/写。我对自己做得不对感到不知所措。我在线程池中尝试过使用io_service和不使用io_server的代码,得到了相同的结果。
Server::Server(io_service& io_service,
const std::string address,
const std::string port)
: io_service_(io_service),
//zmq_strand_(io_service),
acceptor_(io_service) {
ip::tcp::resolver resolver(io_service_);
ip::tcp::resolver::query query(address, port);
ip::tcp::endpoint endpoint = *resolver.resolve(query);
acceptor_.open(endpoint.protocol());
acceptor_.set_option(ip::tcp::acceptor::reuse_address(true));
acceptor_.bind(endpoint);
acceptor_.listen();
start_accept();
}
void Server::start_accept() {
auto session = std::shared_ptr<Session>(new Session(io_service_,session_manager_));
acceptor_.async_accept(session->socket()
,std::bind(&Server::handle_accept,this,session,std::placeholders::_1));
}
void Server::handle_accept(std::shared_ptr<Session> session, const system::error_code& error) {
if (!error) {
std::cout << "handle_accept" << std::endl;
session->start();
} else {
std::cout << error << std::endl;
}
start_accept();
}
小更新:我没有使用http3示例,而是使用Denis提出的示例。它不那么复杂,并使服务器运行正常。我还没有找到一个合理的解释来解释为什么前一段代码不起作用。这样做:
Server::Server(
io_service &service,
const uint8_t num_threads,
const std::string address,
const uint16_t port)
:
num_threads_(num_threads),
//zmq_strand_(io_service),
acceptor_(service,ip::tcp::endpoint(ip::tcp::v4(),port)) {
//io_service::work work(io_service_);
start_accept();
}
void Server::start_accept() {
auto session = std::shared_ptr<Session>(new Session(acceptor_.get_io_service(),session_manager_));
acceptor_.async_accept(session->socket()
,std::bind(&Server::handle_accept,this,session,std::placeholders::_1));
}
void Server::handle_accept(std::shared_ptr<Session> session, const system::error_code& error) {
if (!error) {
std::cout << "handle_accept" << std::endl;
session->start();
}
start_accept();
}
void Server::start() {
std::set<std::unique_ptr<std::thread>> threads;
for( unsigned int i = 0; i < num_threads_; ++i ) {
threads.insert(std::unique_ptr<std::thread>(new std::thread( [&]() {
acceptor_.get_io_service().run();
})
));
}
std::cout << threads.size() << " threads started" << std::endl;
for(auto &t:threads) {
t->join();
}
std::cout << threads.size() << " threads joined" << std::endl;
}
仔细阅读本教程,并将您的代码与教程进行比较:Boost TCP异步服务器示例
相关文章:
- 键盘不起作用 - Arduino Uno - 与变量有关的多个错误
- 使用 g++ 编译时出现多个错误?
- 即使有 0 个错误,Getter 似乎也会使程序崩溃
- Xcode OSX上的C++构建失败,出现多个错误文件IO..不可用:在macOS 10.15中引入
- 向量循环抛出2个错误
- operator_surrogate_func:未找到匹配的重载和其他2个错误
- 代码在编译时生成三个错误
- 代码中存在多个错误
- 在Visual Studio 2019中构建简单的点云可视化代码时,来自PCL的第三方库的多个错误
- VS2017 中的头文件中有多个错误,opengl 项目C++
- 我必须将记录结构转换为一类,并且不断遇到多个错误
- 在 for 循环和变量值中获取此代码的多个错误;
- 我在C++文件中的简单代码块上有 2 个错误。错误 C2059:语法错误:"?"。第二智能感知:预期表达式。怎么了?
- 纠正C++学校图书馆管理程序中的两个错误
- 多个错误C1083,尽管路径和权限正确
- 仅iostream就给了我457个错误
- 使用 G++ 命令行和 #include "std_lib_facilities.h" 时出现多个错误
- 中止陷阱:C 中的6个错误
- 类错误导致几百个错误
- 在Visual Studio中重建我的项目时,我会在同一行错误C2371上遇到2个错误