2009-06-09 12 views
6

He estado tratando de lograr eso durante la mayor parte del día, sinceramente agradecería cualquier ayuda. Mis aplicaciones, el cliente y el servidor comenzaron a lanzar excepciones de "subíndice vectorial fuera de rango".¿Cómo envío un std :: vector <char> usando Boost :: Asio?

¿Cómo se hace esto correctamente?


¿Sigues tratando de resolver esto, alguien?

Por lo que undestand supone que tengo que crear un

boost::asio::basic_stream_socket stream; y luego llamar a:

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

Supongo que es perfectamente posible hacerlo de forma asíncrona? ¿Cuáles son las diferencias entre: basic_stream_socket::send() contra basic_stream_socket::write_some() contra basic_stream_socket::async_write_some()?

basic_stream_socket::receive() contra baic_stream_socket::read_some() contra basic_stream_socket::async_read_some()?

Estoy asumiendo que send() & son métodos que puedo llamar cuando quiero para asegurarse de que el 100% de los datos se envía/recibe - a expensas de bloquear la toma?

Estoy asumiendo que write_some() & read_some() son métodos que puedo llamar cuando no estoy seguro de si el 100% de los datos se enviados/recibidos -, mientras que bloquee la toma?

Supongo que async_read_some() & async_write_some() son métodos que no bloquean el socket y que leen/escriben todo lo que pueden?

+3

¿Puede mostrar algún código? – Naveen

+0

Debe agregar más información al cuerpo de la pregunta en sí o en forma de comentarios en lugar de responder su propia pregunta con preguntas. Si necesita configurar todo desde cero, proporcione un contexto (por ejemplo, este es un socket TCP, un puerto serie RS-232, etc.). –

+0

Deleted q "No, no lo he hecho, ¿cómo hago eso?" - No estoy seguro de a qué se aplica esto, pero es mejor actualizar la pregunta (o dejar comentarios cuando obtenga suficientes representantes). –

Respuesta

5

Suponiendo que crea una corrientey está intentando enviar los datos vector<char>:

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

Ver boost:asio::buffer.

0

Soy bastante nuevo para impulsar asio también, pero aquí están mis respuestas:

Las funciones con nombres de función que comienzan con async_ tiene, entre otras, una llamada de retorno como argumento que se llamará cuando finalice la operación. Es decir, la función async_write_some() no se bloquea, sino que se devuelve inmediatamente y, cuando la operación finaliza, se invoca la función de devolución de llamada.

Tus suposiciones son correctas, por lo que he entendido. Sin embargo, con las funciones async_write_some, etc., tiene una función de devolución de llamada que toma el número de bytes transferidos como argumento.

Por ejemplo, aquí tienen una función que lee desde un socket:

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 función de devolución de llamada en la que hay handle_read_content, y se ve así:

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

Al principio lea este tutorial que fue muy bueno: Boost Asio

Cuestiones relacionadas