[英]Why is the boost server class throwing runtime error
我在以下代碼中收到編譯錯誤:
boost::asio::io_context io_context;
server server1(io_context, 1980);
boost::thread t(boost::bind(&boost::asio::io_context::run, &io_context));
其中server
class 的定義為:
using boost::asio::ip::tcp;
class server
{
public:
server(boost::asio::io_context& io_context, short port)
: acceptor_(io_context, tcp::endpoint(tcp::v4(), port))
{
do_accept();
}
private:
void do_accept()
{
acceptor_.async_accept(
[this](boost::system::error_code ec, tcp::socket socket)
{
if (!ec)
{
std::make_shared<session>(std::move(socket))->start();
}
do_accept();
});
}
tcp::acceptor acceptor_;
};
錯誤在於:
server(boost::asio::io_context& io_context, short port)
: acceptor_(io_context, tcp::endpoint(tcp::v4(), port))
在 Everest.exe 中的 0x00007FFE9D804F69 處引發異常:Microsoft C++ 異常:boost::wrapexceptboost::system::system_error 在 memory 位置 0x0000003AA613BDB0。
看來您的代碼缺少聆聽。 在我的 Linux 盒子上,這根本不做任何事情,但也許在 Win32 上,由於在執行async_accept
時acceptor
的 state 無效,它會引發錯誤?
這是一個簡單的測試器,可以在 linux 上執行預期的操作:
#include <boost/asio.hpp>
#include <iostream>
using boost::asio::ip::tcp;
struct session : std::enable_shared_from_this<session> {
tcp::socket _socket;
session(tcp::socket&& s) : _socket(std::move(s)) {
std::cerr << "new session " << _socket.remote_endpoint() << std::endl;
}
void start() {}
};
class server {
public:
server(boost::asio::io_context& io_context, short port)
: acceptor_(io_context, tcp::endpoint(tcp::v4(), port))
{
acceptor_.listen();
do_accept();
}
private:
void do_accept()
{
acceptor_.async_accept(
[this](boost::system::error_code ec, tcp::socket socket) {
std::cerr << "accept " << ec.message() << std::endl;
if (!ec) {
std::make_shared<session>(std::move(socket))->start();
do_accept();
}
});
}
tcp::acceptor acceptor_;
};
int main()
{
boost::asio::io_context io_context;
server server1(io_context, 1980);
io_context.run();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.