Ver Mensaje Individual
  #5 (permalink)  
Antiguo 07/06/2016, 21:06
Ace_Slelt
 
Fecha de Ingreso: agosto-2010
Mensajes: 20
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: Protocol Buffers , Sockets

Cita:
Iniciado por eferion Ver Mensaje
Una corrección al respecto:

El buffer que recibe debería ser al menos tan grande como el mayor paquete que puedes recibir... al menos para empezar. Cuando la comunicación te funcione podrás intentar optimizar ese punto.

Pero entonces no funciona

Cuando tu recibes datos por un socket, un valor que recuperas es el número de bytes recibidos. Lo que has de hacer es usar dicho valor para recuperar únicamente la secuencia serializada y descartar lo que haya en el resto del buffer.

Un saludo.


SOLUCION :

La solucion ha sido crear un buffer como bien indica eferion lo suficientemente grande como para alojar un posible paquete recibido por el socket. Acto seguido creo un nuevo buffer con el tamaño de bytes recibidos por la funcion receive y deserializo el paquete. Importante que el tipo de mensaje de protocol buffers en los dos extremos sea igual, es decir. Si serializo un mensaje de tipo, me lo invento, receta....he de deserialziar un buffer de tipo receta, no cantidad de sal como estaba haciendo.

C#

Código:
        private AddressBook newdata;
        ....
        // Creo un array lo suficientemente grande para recibir los datos del socket.

        byte[] buffer = new byte[1024]; 
        int bytes = 0;
        bytes = handler.Receive(buffer);
        
        // Creo un segundo array exactamente igual de largo que el paquete recibido.

        byte[] buffer2 = new byte[bytes];
        Buffer.BlockCopy(buffer, 0, buffer2, 0, bytes);
        newdata = AddressBook.Parser.ParseFrom(buffer2);
C++
Código:
        // Aqui relleno mi mensaje que es exactamente igual que el ejemplo de la pagina oficial.

        tutorial::AddressBook address_book;
	tutorial::Person* person = address_book.add_person();
	person->set_email("abcdefgh");
	person->set_id(13);
	person->set_name("pepito");

	
	
        // Serializo el mensaje en un string y lo envio a traves del socket
        
        string buf;
        address_book.SerializeToString(&buf);
	send(newsockfd,buf.data(),buf.length(), 0);

Espero que a alguien le pueda servir de algo!!!