2009-12-02 11 views
5

Podría alguien ayudarme y decirme cómo usar los búferes de protocolo. En realidad, quiero intercambiar datos a través de sockets entre un programa que se ejecuta en Unix y otro que se ejecuta en Windows para ejecutar estudios de simulación.¿Cómo usar los búferes de protocolo?

Los programas que utilizan sockets para el intercambio de datos, están escritas en C/C++ y yo estaría contento si somneone me podría ayudar el uso de búferes de protocolo con el fin de intercambiar datos en forma de:

struct snd_data{ 
    char *var="temp"; 
    int var1=1; 
    float var2; 
    double var2; 
} 

Intenté varias formas, pero aún así los datos no se intercambian correctamente. Cualquier ayuda sería muy apreciada

Gracias por su ayuda,

+6

algún motivo esto es un wiki de la comunidad? – Goz

Respuesta

11

Se empieza por definir el mensaje en un archivo .proto:

package foo; 

message snd_data { 
    required string var= 1; 
    required int32 var1 = 2; 
    optional float var2 = 3; 
    optional double var3 = 4; 
} 

(supongo que el flotador y el doble en realidad son variables diferentes ...)

Luego se compila utilizando protoc y luego tienes código implementando tu buffer

Para más información ver: http://code.google.com/apis/protocolbuffers/docs/cpptutorial.html

+0

Gracias por su respuesta. ¿hay algún tutorial simple donde se muestre un ejemplo? gracias de nuevo, – make

+2

Sigue el enlace que incluí - es un tutorial que cubre el uso de búferes de protocolo de C++. –

1

son ambas máquinas x86? De lo contrario, debe observar las diferencias entre los grandes endianitas y los pequeños endian. También vale la pena prestar atención al embalaje estructural. Pasar puntero puede ser problemático también debido a que los punteros son de diferentes tamaños en diferentes plataformas. Todo allí es muy poca información en su publicación para decir, con certeza, qué está pasando mal ...

+0

las máquinas son diferentes. Unix está instalado en sun-blade y windows en x86. Pero, leí que los búferes de protocolo tratan con máquinas diferentes y es por eso que decidí usarlo ... – make

0

La respuesta radica en la endiabilidad de los datos que se transmiten, esto es algo que debe considerar con mucho cuidado y comprobar. Mire here para mostrar lo que endianness puede hacer y causar que los datos se dañen tanto en el receptor como en el remitente. No existe una medida tan perfecta de transferencia de datos sin problemas, solo porque los datos enviados desde un cuadro Unix garantizan que los datos en el cuadro de Windows estarán en el mismo orden en términos de estructura de memoria para los datos. Además, el relleno de la estructura en el cuadro Unix será diferente al relleno en el cuadro de Windows, se reduce a cómo se usan los conmutadores de línea de comando, piense en la alineación de la estructura.

+2

@ tommieb75: ¿Es esto correcto? Google para buffers de protocolo y endian muestra una conversación de Grupos de Google que indica que el software maneja esto correctamente: http://groups.google.com/group/protobuf/browse_thread/thread/5dbcc1c028f8c8bf – quamrana

+0

@quamrana: No puedo responder eso como lo hago no conozco los búferes de protocolo de Google, lo siento por eso. Compruebe el relleno de su estructura, el compilador podría rellenarlo para que sea uniforme. Puede verificarlo haciendo un tamaño de (struct snd_data) en ambos extremos para ver qué es. Si obtienes diferentes tamaños que eso, de alguna manera podrías explicar tu situación. – t0mm13b

3

Cómo estás escribiendo sus mensajes a la toma? Protobufs no es sensible a endian, pero tampoco los protobufs definen un mecanismo de transporte: protobuf define una asignación entre un mensaje y su forma serializada (que es una secuencia de bytes de (8 bits)) y es su responsabilidad transfiere esta secuencia de bytes al host remoto.

En nuestro caso, definimos un protocolo de transporte muy simple; primero escribimos el tamaño del mensaje como un entero de 32 bits (big endian), luego viene el mensaje en sí. (Recuerde también que los mensajes de protobuf no se identifican a sí mismos, lo que significa que necesita saber qué mensaje está enviando. Esto normalmente se gestiona al tener un mensaje de contendor que contiene campos opcionales para todos los mensajes que desea enviar. Consulte el protobuf sitio web y archivos de la lista de correo para obtener más información sobre esta técnica.)

+0

Sí. Para obtener más detalles, consulte [https://developers.google.com/protocol-buffers/docs/techniques#streaming](https://developers.google.com/protocol-buffers/docs/techniques#streaming). Protobuf "no se auto delimita". –

Cuestiones relacionadas