【问题标题】:BOOST async_receive doesn't return when socket is closedBOOST async_receive 在套接字关闭时不返回
【发布时间】:2023-02-24 06:01:00
【问题描述】:

我正在尝试使用编写一个简单的客户端/服务器程序提升.asio. 我的问题是,当客户端关闭它的套接字并退出时,“stream.async_receive()”会阻塞服务器端并且不会返回。

这是我的代码:

#include <boost/asio/co_spawn.hpp>
#include <boost/asio/detached.hpp>
#include <boost/asio/io_service.hpp>
#include <boost/asio/ip/tcp.hpp>
#include <boost/asio/awaitable.hpp>
#include <boost/asio.hpp>
#include <string>
#include <iostream>

using namespace std;
namespace asio = boost::asio;
using namespace boost::asio::ip;

asio::awaitable<void> handle_connection(tcp::socket&& stream)
{
    std::cout << "new connection\n";
    std::string buffer;
    uint64_t buffer_size;

    while(stream.is_open())
    {
        co_await stream.async_receive(asio::buffer(&buffer_size, 8), asio::use_awaitable);
        buffer = std::string(buffer_size, '\0');
        std::cout << "message size: " << buffer_size << "\n";
        co_await stream.async_receive(asio::buffer(buffer, buffer_size), asio::use_awaitable);
        std::cout << "new message: " << buffer << "\n";
    }
    // The program never reached this point.
    cout << "socket closed\n";
    co_return;
}

asio::awaitable<void> accept_connection()
{
    auto ex = co_await asio::this_coro::executor;
    boost::asio::ip::tcp::acceptor acceptor(ex, {{}, 8000});

    tcp::socket sock = co_await acceptor.async_accept(asio::use_awaitable);
    while(true)
    {
        co_spawn(ex, handle_connection(std::move(sock)), asio::detached);
        sock = co_await acceptor.async_accept(asio::use_awaitable);
    }

    co_return;
}

int main()
{
    asio::io_context io_ctx(2);
    co_spawn(io_ctx, accept_connection(), asio::detached);
    io_ctx.run();
}

任何帮助将非常感激。

【问题讨论】:

    标签: c++ boost


    【解决方案1】:

    你的循环退出。例外。因为你不处理你看不到的异常。

    向您展示三种处理错误的方法(包括 Eof):

    asio::awaitable<void> handle_connection(tcp::socket stream) {
        std::cout << "new connection" << std::endl;
    
        for (std::string buffer; true;)
            try {
                boost::endian::big_uint64_t buffer_size[1];
                co_await stream.async_receive(asio::buffer(buffer_size), use_awaitable);
                buffer.assign(*buffer_size, '
    猜你喜欢
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    • 2019-02-27
    • 2016-10-27
    • 1970-01-01
    • 2018-08-31
    • 2016-01-28
    • 2011-01-15
    相关资源
    最近更新 更多