Como usar buffers de protocolo?
-
11-09-2019 - |
Pergunta
Poderia alguém por favor me ajude e me diga como usar buffers de protocolo. Na verdade eu quero trocar dados através de sockets entre um programa em execução em unix e anoother em execução no Windows para executar estudos de simulação.
Os programas que usam soquetes para trocar dados, são escritos em C / C ++ e eu ficaria feliz se somneone poderia me ajudar a usar buffers de protocolo, a fim de trocar dados na forma de:
struct snd_data{
char *var="temp";
int var1=1;
float var2;
double var2;
}
Eu tentei várias maneiras, mas ainda assim os dados não são trocados corretamente. Qualquer ajuda seria muito apreciada
Obrigado por sua ajuda,
Solução
Você começar por definir a sua mensagem em um arquivo .proto:
package foo;
message snd_data {
required string var= 1;
required int32 var1 = 2;
optional float var2 = 3;
optional double var3 = 4;
}
(acho que o float e double são realmente diferentes variáveis ??...)
Depois de compilá-lo usando protoc
e então você tem código de implementação do seu buffer.
Para mais informações consulte: http://code.google.com/apis /protocolbuffers/docs/cpptutorial.html
Outras dicas
Como você está escrevendo suas mensagens à tomada? Protobufs não é em si endian-sensível, mas também não protobufs definir um mecanismo de transporte - protobuf define um mapeamento entre uma mensagem e sua forma serializada (que é uma sequência de (8-bit) bytes) e é o responsabilidade de transferir essa seqüência de bytes para o host remoto.
No nosso caso, nós definimos um protocolo de transporte muito simples; primeiro nós escrevemos o tamanho da mensagem como um inteiro de 32 bits (big endian), em seguida, vem a própria mensagem. (Lembre-se também que protobuf mensagens não são auto-identificação, o que significa que você precisa saber que a mensagem que você está enviando. Isso normalmente é gerida por ter um invólucro mensagem que contém campos opcionais para todas as mensagens que você deseja enviar. Ver os arquivos do site protobuf e da lista de discussão para mais informações sobre essa técnica.)
Tem ambas as máquinas x86? Caso contrário, você precisa prestar atenção para big endian e pequenas diferenças endian. Seu também vale a pena prestar atenção para a estrutura de embalagem. ponteiro passando pode ser problemático também devido ao fato de ponteiro diferentes tamanhos em diferentes plataformas. Tudo lá é muito pouca informação no seu post para dizer, ao certo, o que está errado ...
As mentiras resposta na endianess dos dados a serem transmitidos, isto é algo que você precisa considerar com muito cuidado e verificar. Olhar aqui para mostrar o que endianness pode fazer e causa dados para ficar confuso sobre o receptor e remetente. Não existe tal medida perfeita de transferência de dados sem problemas, só porque os dados enviados a partir de uma caixa de unix garante os dados sobre as janelas caixa será na mesma ordem em termos de estrutura de memória para os dados. Além disso, o preenchimento da estrutura na caixa de unix será diferente para o preenchimento nas janelas caixa, tudo se resume à forma como as opções de linha de comando são usadas, pense alinhamento estrutura.