Boost ASIO async_read_some

Je vais avoir des difficultés dans la mise en œuvre d'un simple serveur TCP. Le code suivant est tiré de boost::asio exemples, "Http Server 1" pour être précis.

void connection::start() {
    socket_.async_read_some(
            boost::asio::buffer(buffer_),
            boost::bind(
                &connection::handle_read, shared_from_this(),
                boost::asio::placeholders::error,
                boost::asio::placeholders::bytes_transferred
            )
        );
}
void connection::handle_read(const boost::system::error_code& e, std::size_t bytes_transferred) {
        if (!e && bytes_transferred)    {
                std::cout << " " << bytes_transferred <<"b" << std::endl;
                data_.append(buffer_.data(), buffer_.data()+bytes_transferred);

                //(1) what here?                
                socket_.async_read_some(
                    boost::asio::buffer(buffer_), 
                    boost::bind(
                        &connection::handle_read, shared_from_this(),
                        boost::asio::placeholders::error,
                        boost::asio::placeholders::bytes_transferred
                    )
                ); 

            }
            else//if (e != boost::asio::error::operation_aborted)
            {
                std::cout << data_ << std::endl;
                connection_manager_.stop(shared_from_this());
            }
        }

Dans le code d'origine de la buffer_ est assez grand pour garder la totalité de la demande. Ce n'est pas ce dont j'ai besoin. J'ai changé la taille de 32bytes.

Le serveur compile et écoute sur le port 80 de localhost, donc j'essaie de me connecter via mon navigateur web.

Maintenant, si l'énoncé (1) est commenté, seule la première 32bytes de la demande sont lus et la connexion se bloque. Web navigateur conserve l'attente de la réponse, le serveur n'.. je ne sais pas quoi.

Si (1) est retirée, puis l'ensemble de la demande est de lire (et appeded à data_), mais il ne s'arrête jamais - je annuler la demande dans mon navigateur, et ce n'est qu'à la else { } le cadre de l'exécution je vois ma demande sur stdout.

Question 1: Comment dois-je gérer une grande demande?
Question 2: Comment dois-je le cache de la demande (actuellement je ajouter de la mémoire tampon à une chaîne de caractères)?
Question 3: Comment puis-je dire que la demande est de plus? En HTTP, il y a toujours une réponse, donc mon navigateur web continue d'attendre pour elle et de ne pas fermer la connexion, mais comment mon serveur savons que la demande est plus (et peut-être de le fermer ou de répondre à certains "200 OK")?

OriginalL'auteur Queequeg | 2012-09-16