0

我在服务器上有这段代码

    void SocketTransportSession::DoRead() {
    auto self(shared_from_this());
    socket.async_read_some(ba::buffer(data),
        [this, self](boost::system::error_code ec, std::size_t length) {
            if (!ec) {
                //TODO: process request
                socket.async_write_some(boost::asio::buffer(res, maxLen),
                    [this, self](boost::system::error_code ec, std::size_t length) {
                        assert(!ec);
                        assert(length == maxLen);
                        //read some more
                    DoRead();
                });
            }
        });
}

我想要的基本上是读取客户端请求(处理它,现在是一个假人)并回复它,然后重复循环,即从客户端/进程/...读取更多内容

在呈现的代码中,断言没有被触发(我们确认 !ec 和所有重播都已发送)但在我的客户端代码中我没有看到响应(即客户端在此时进行阻塞读取并且没有收到任何内容) .

编辑 刚刚发现像这样编写服务器具有预期的行为。原因似乎不是很明显

void SocketTransportSession::DoRead() {
    auto self(shared_from_this());
    socket.async_read_some(ba::buffer(data),
        [this, self](boost::system::error_code ec, std::size_t length) {
            if (!ec) {
                DoWrite(length);
            }
        });
}

void SocketTransportSession::DoWrite(std::size_t length) {
    auto self(shared_from_this());
    ba::async_write(socket, ba::buffer(data),
        [this, self](boost::system::error_code ec, std::size_t length) {
            if (!ec) {
                DoRead();
            }
    });
}

这里会发生什么?

4

0 回答 0