Vous essayez de lire à partir du tampon de réception immédiatement après le démarrage de l'opération asynchrone, sans attendre qu'il se termine, c'est pourquoi il fonctionne lorsque vous définissez un point d'arrêt.
Le code après votre async_read appartient à Connection::handler
, puisqu'il s'agit du rappel que vous avez demandé à async_read
d'invoquer après avoir reçu des données.
Qu'est-ce que vous voulez habituellement est un start_read
et une fonction handle_read_some
:
void connection::start_read()
{
socket_->async_read_some(boost::asio::buffer(read_buffer_),
boost::bind(&connection::handle_read_some, shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
void connection::handle_read_some(const boost::system::error_code& error, size_t bytes_transferred)
{
if (!error)
{
// Use the data here!
start_read();
}
}
Notez les shared_from_this, il est important si vous voulez que la durée de vie de votre connexion à prendre automatiquement en charge par le nombre de I en circulation/O demandes. Assurez-vous de dériver votre classe de boost::enable_shared_from_this<connection>
et de la créer uniquement avec make_shared<connection>
.
Pour appliquer cela, votre constructeur devrait être privé et vous pouvez ajouter une déclaration d'ami (version C++ 0x, si votre compilateur ne supporte pas cela, vous devrez insérer le nombre correct d'arguments vous-même):
template<typename T, typename... Arg> friend boost::shared_ptr<T> boost::make_shared(const Arg&...);
Assurez-vous également que votre tampon de réception est toujours actif au moment où le rappel est appelé, de préférence en utilisant une variable de membre de mémoire tampon de taille statique de votre classe de connexion.
Je ne comprends pas votre question. Essayez d'utiliser ',' ou '.' par exemple ... – nabulke
@nabulke vérifier maintenant – Abanoub
Veuillez ne pas utiliser d'argot. "si bizarre" n'est pas une question, et "w8ting" n'est pas un mot réel. Ce n'est pas un forum. – Soviut