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