简体   繁体   中英

Operation canceled boost asio async_receive_from

I have an UDP Server set up with boost/asio (I copied the example and just changed a few things). Below is the code:

udp_server.hpp

using boost::asio::ip::udp;

class udp_server {
public:
    udp_server(boost::asio::io_service&, int);

private:
    boost::array<char, 256> recBuffer;

    udp::socket socket_;
    udp::endpoint remote_endpoint_;

    void start_receive();

    void handle_receive(const boost::system::error_code&, std::size_t);

    void handle_send(boost::shared_ptr<std::string> /*message*/,
        const boost::system::error_code& /*error*/,
        std::size_t /*bytes_transferred*/)
    {}
};

and udp_server.cpp

udp_server::udp_server( boost::asio::io_service& io_service,
                        int port)
    : socket_(io_service, udp::endpoint(udp::v4(), port)) {
    serverNotifications.push_back("UDP Server class initialized.");
    start_receive();
}

void udp_server::start_receive() {
    socket_.async_receive_from(
            boost::asio::buffer(recBuffer),
            remote_endpoint_,
            boost::bind(&udp_server::handle_receive,
                        this,
                        boost::asio::placeholders::error,
                        boost::asio::placeholders::bytes_transferred));
    serverNotifications.push_back("Starting to receive UDP Messages.");

}

void udp_server::handle_receive(const boost::system::error_code& error,
                                std::size_t size) {
    serverNotifications.push_back("RecFrom: " + remote_endpoint_.address().to_string());
    if (!error) {
        // I do data stuff here
    } else {
        errors.push_back("Handle Receive error: " + error.message());
    }
}

After initializing the Server with:

try {
    udp_server server(io_service, ApplData.PORT, (size_t)ApplData.BUFLEN);
} catch (std::exception& e) {
    // error handling
}

and running it with io_service.run() in a seperate try catch in another function I get some problems:

  • My Callback function handle_receive gets called without any UDP message getting send in the whole network (aka only my laptop without connection)
    • error.message() returns "Operation canceled"
    • remote_endpoint_.address().to_string() returns "acfc:4000:0:0:7800::%2885986016" which I can't identify as something useful
  • Also I recognized that my io_service is stopping all the time, but in my understanding it should run all the time, right?

I already thought about referencing this in the callback function bind with a shared_from_this ptr , but since I have a real instance of the udp_server class until I leave my program I can't think of a good reason to do that.

Can someone explain thy this failure occurs, what these errors tell me about my code or what I can do to avoid them?

Nevermind, Rubberduck debugging was enough. I just read the line

but since I have a real instance of the udp_server class until I leave my program I can't think of a good reason to do that.

and noticed, that I actually didn't have this and this was the error.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM