envío de dobles a través de TCP entre el servidor ASIO de Boost y el cliente de Java

Estoy intentando configurar un servidor Boost ASIO simple con un solo cliente Java.

Soy capaz de enviar y recibir con éxito cadenas entre los dos. Sin embargo, cuando bash enviar valores dobles, solo sale basura en el otro extremo.

A continuación se muestra el código independiente que muestra mi configuración básica (con un servidor C ++ Boost ASIO y un cliente Java). Cuando se ejecutan, realizan las siguientes cuatro tareas secuenciales:

  1. El cliente envía una cadena al servidor, que se recibe e imprime con éxito.
  2. El servidor envía una cadena al cliente, que se recibe e imprime con éxito.
  3. El cliente envía un valor doble al servidor, que se recibe pero NO se imprime correctamente.
  4. El servidor envía un valor doble al cliente, que se recibe pero NO se imprime correctamente.

¿Alguien sabe lo que estoy haciendo mal? Soy ciertamente muy nuevo en redes (y Java). He examinado la documentación y los ejemplos de Boost ASIO, pero he de saberlo.

Código del servidor ASIO de C ++ Boost:

#include  #include  #include  #include  using boost::asio::ip::tcp; int main() { unsigned short const PORT = 19876; try { boost::asio::io_service ioService; tcp::acceptor acceptor(ioService, tcp::endpoint(tcp::v4(), PORT)); while (true) { // Listen for clients std::cout << "Listening for client..." << std::endl; tcp::socket socket(ioService); acceptor.accept(socket); std::cout << "Client heard..." << std::endl; size_t len; // Receive string from client and print it out boost::array cBuf; len = socket.read_some(boost::asio::buffer(cBuf, sizeof(cBuf))); std::cout.write(cBuf.data(), len); // Send string to client std::string message = "Server string to send to client\n"; boost::asio::write(socket, boost::asio::buffer(message)); // Receive double from client and print it out double dVal1 = -1.0; char * p_dVal1 = reinterpret_cast(&dVal1); len = socket.read_some(boost::asio::buffer(p_dVal1, sizeof(double))); std::cout << dVal1<< std::endl; // prints out garbage // Send double to client double dVal2 = 6.28; char const * p_dVal2 = reinterpret_cast(&dVal2); boost::asio::write(socket, boost::asio::buffer(p_dVal2, sizeof(double))); } } catch (std::exception & e) { std::cerr << e.what() << std::endl; } return 0; } 

Código de cliente Java:

 import java.io.*; import java.net.*; public class Client { final static String HOST = "localhost"; final static int PORT = 19876; public static void main(String[] args) throws IOException { Socket socket = new Socket(HOST, PORT); // Send string to server PrintWriter pos = new PrintWriter(socket.getOutputStream(), true); pos.println("Client string to send to server"); // Receive string from server BufferedReader bis = new BufferedReader(new InputStreamReader(socket.getInputStream())); System.out.println(bis.readLine()); // Send double value to server DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); dos.writeDouble(3.14); // Receive double from server DataInputStream dis = new DataInputStream(socket.getInputStream()); System.out.println(dis.readDouble()); // prints out garbage socket.close(); pos.close(); bis.close(); dos.close(); dis.close(); } } 

¡¡¡Muchas gracias por adelantado!!!

Aaron

Necesitas usar un lexical_cast , no un reinterpret_cast .

Con reinterpret_cast , le está diciendo al comstackdor que interprete literalmente el patrón de bit double* como un patrón de bit const char* . En su lugar, su reparto debe crear una nueva estructura con caracteres ascii que representan el número en un patrón de bits ascii.

Además, debe asegurarse de que está gestionando endianess. Debería convertir correctamente desde y hacia el endianess de la red tanto en el cliente como en el servidor. Vea esta respuesta para información adicional.