2009-06-09 6 views
6

J'ai essayé d'atteindre cet objectif pendant la plus grande partie de la journée, sincèrement j'apprécie toute aide. Mes deux applications, le client et le serveur ont commencé à lancer des exceptions "indice de vecteur hors de portée". Comment faire une chose correctement?Comment envoyer un fichier std :: vector <char> en utilisant Boost :: Asio?


Vous essayez toujours de comprendre cela?

Pour autant que j'undestand je suis censé créer un

boost::asio::basic_stream_socket stream; Et puis appelez:

stream.send(boost::asio::buffer(data));?

Je suppose qu'il est parfaitement possible de le faire de manière asynchrone? Quelles sont les différences entre: basic_stream_socket::send() par rapport à basic_stream_socket::write_some() par rapport à basic_stream_socket::async_write_some()?

basic_stream_socket::receive() par rapport à baic_stream_socket::read_some() par rapport à basic_stream_socket::async_read_some()?

Je suppose que send() & sont des méthodes que je peux appeler quand je veux vous assurer que 100% des données sont envoyées/reçues - au détriment de bloquer la prise?

Je suppose que write_some() & read_some() sont des méthodes que je peux appeler quand je ne suis pas sûr à 100% des données sont envoyées/reçues - tout en bloquant la prise?

Je suppose que async_read_some() & async_write_some() sont des méthodes qui ne bloquent pas le socket et ils lisent/écrivent tout ce qu'ils peuvent?

+3

pouvez-vous montrer du code? – Naveen

+0

Vous devez ajouter des informations supplémentaires au corps de la question ou sous la forme de commentaires au lieu de répondre à votre question avec des questions. Si vous devez tout configurer à partir de zéro, veuillez fournir un contexte (par exemple, une prise TCP, un port série RS-232, etc.). –

+0

Supprimé q "Non, je n'ai pas - comment je fais ça?" - Je ne sais pas à quoi cela s'applique, mais il est préférable de mettre à jour la question (ou laisser des commentaires lorsque vous avez assez de rep). –

Répondre

5

En supposant que vous avez créé un flux et tentent d'envoyer les données vector<char>:

stream.send(boost::asio::buffer(data)); 

Affichez boost:asio::buffer.

0

Je suis assez nouveau pour stimuler asio aussi, mais voici mes réponses:

Les fonctions avec les noms de fonctions commençant par async_ prend, entre autres, une fonction de rappel comme argument qui sera appelé lorsque l'opération se termine. C'est-à-dire que la fonction async_write_some() ne bloque pas mais retourne immédiatement et lorsque l'opération est terminée, la fonction de rappel est invoquée.

Vos hypothèses sont correctes, autant que j'ai compris. Cependant, avec les fonctions async_write_some etc., vous avez une fonction de rappel qui prend le nombre d'octets transférés en argument.

Par exemple, ici, j'ai une fonction qui se lit d'une prise:

boost::asio::async_read(
    *socket_, 
    boost::asio::buffer(read_msg_.body(), read_msg_.body_length()), 
    boost::bind(
     &sender::handle_read_content, 
     this, 
     boost::asio::placeholders::error, 
     boost::asio::placeholders::bytes_transferred 
    ) 
); 

La fonction de rappel y est handle_read_content, et il ressemble à ceci:

void sender::handle_read_content(
    const boost::system::error_code& err, 
    std::size_t bytes_transferred 
) 

Au début, je lire ce tutoriel qui était très bon: Boost Asio

Questions connexes