簡體   English   中英

為什么 boost 服務器 class 拋出運行時錯誤

[英]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_acceptacceptor的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM