2010-05-03 9 views
2

Je passais en revue les exemples de boost.asio et je me demande pourquoi il n'y a pas d'exemple d'exemple de serveur/client simple qui imprime une chaîne sur le serveur et renvoie ensuite une réponse au client.
J'ai essayé de modifier le serveur d'écho mais je n'arrive pas vraiment à comprendre ce que je fais du tout.
Quelqu'un peut-il me trouver un modèle de client et un modèle de serveur?
Je voudrais éventuellement créer une application serveur/client qui reçoit des données binaires et renvoie juste un accusé de réception au client que les données sont reçues.
EDIT:Comment créer une application serveur/client simple en utilisant boost.asio?

void handle_read(const boost::system::error_code& error, 
    size_t bytes_transferred) // from the server 
{ 
    if (!error) 
    { 
     boost::asio::async_write(socket_, 
      boost::asio::buffer("ACK", bytes_transferred), 
      boost::bind(&session::handle_write, this, 
      boost::asio::placeholders::error)); 
    } 
    else 
    { 
     delete this; 
    } 
} 

Cela renvoie au client que 'A'.
Toujours dans data_, je reçois beaucoup de symboles bizarres après la réponse elle-même.
Ce sont mes problèmes.
EDIT 2:
Ok, donc le problème principal est avec le client.

size_t reply_length = boost::asio::read(s, 
     boost::asio::buffer(reply, request_length)); 

Puisqu'il s'agit d'un serveur d'écho, le 'ACK' n'apparaîtra que si la longueur de la requête est supérieure à 3 caractères.
Comment puis-je surmonter cela?
J'ai essayé de changer request_length à 4 mais cela fait seulement attendre le client et ne rien faire du tout.

Répondre

2

Finalement, je trouve que le problème réside dans ce bout de code dans le serveur:

void handle_read(const boost::system::error_code& error, 
size_t bytes_transferred) // from the server 
{ 
    if (!error) 
    { 
     boost::asio::async_write(socket_, 
      boost::asio::buffer("ACK", 4), // replaced bytes_transferred with the length of my message 
      boost::bind(&session::handle_write, this, 
      boost::asio::placeholders::error)); 
    } 
    else 
    { 
     delete this; 
    } 
} 

Et dans le client:

size_t reply_length = boost::asio::read(s, 
      boost::asio::buffer(reply, 4)); // replaced request_length with the length of the custom message. 
1

Le client/serveur echo est un exemple simple. Dans quels domaines avez-vous des problèmes? Le client devrait être assez simple puisqu'il utilise les API de blocage. Le serveur est légèrement plus complexe car il utilise les API asynchrones avec des rappels. Quand on se résume aux concepts de base (session, serveur, io_service), c'est assez facile à comprendre.

+0

Je voudrais imprimer la chaîne envoyée par le client sur le serveur, puis renvoyez un accusé de réception qui sera imprimé sur le client. Pouvez-vous me montrer comment c'est fait? –

Questions connexes