代码之家  ›  专栏  ›  技术社区  ›  J.Doe

boost.asio async\u接收从不解析

  •  0
  • J.Doe  · 技术社区  · 6 年前

    这是我的密码( 请忽略资源泄漏 ):

    #include<boost/asio.hpp>
    #include<cstdio>
    
    boost::asio::io_service ioService;
    
    void echo(boost::asio::ip::tcp::socket* socket) {
        char* buf = new char[1024];
        socket->async_receive(boost::asio::buffer(buf, 1023), [buf, socket](auto ec, auto s) {
            if (ec) {
                std::printf("read failed: %s!\n", ec.message().data());
            }
            else
            {
                buf[s] = '\0';
                std::printf("read:%s!\n", buf);
                socket->async_send(boost::asio::buffer(buf, s), [socket](auto ec, auto s) {
                    if (ec) {
                        std::printf("write failed: %s!\n", ec.message().data());
                    }
                    else {
                        echo(socket);
                    }
                });
            }
        });
    }
    
    void accept(boost::asio::ip::tcp::acceptor& acceptor) {
        auto socket = new boost::asio::ip::tcp::socket{ ioService };
        acceptor.async_accept(*socket, [socket](auto ec) {
            if (ec) {
                std::printf("accept failed:%s!\n", ec.message().data());
            }
            else {
                std::printf("accept %s!", socket->remote_endpoint().address().to_string().data());
                echo(socket);
            }
        });
    }
    
    int main() {
        try {
            boost::asio::ip::tcp::acceptor acceptor{ ioService, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), 8000) };
            accept(acceptor);
            while (true)
            {
                ioService.poll();
            }
        }
        catch (std::exception&e) {
            std::printf("error: %s\n", e.what());
        }
    }
    

    我正在使用一个javatcp客户机(我已经用javatcp echo服务器测试过了)来连接并向这个服务器发送消息。唯一有效的是accept函数。我哪里会出错?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Shane Powell    6 年前

    问题是:

        while (true)
        {
            ioService.poll();
        }
    

    您需要删除while循环并使用“run”方法:

         ioService.run();
    

    实际的问题是你必须打电话给 restart reset 方法,然后才能再次调用poll。循环的另一个问题是,当没有什么要做的时候,它运行的CPU将是100%,因为它在一个硬循环中什么也不做。。。如果您使用“run”方法,CPU将在无事可做时使用0%。

    例如

    while (true)
    {
        ioService.poll();
        ioService.reset();
    }
    

    引用ASIO文件:

    此函数必须在任何第二个或以后的 run()、run\u one()、poll()或poll\u one()函数的调用 io d U上下文正在停止或正在运行。打电话给 假的。

    推荐文章