2009-12-02 6 views
5

Quelqu'un pourrait m'aider s'il vous plaît et me dire comment utiliser les tampons de protocole. En fait, je veux échanger des données via des sockets entre un programme fonctionnant sous Unix et un autre fonctionnant sur Windows afin de lancer des études de simulation.Comment utiliser les tampons de protocole?

Les programmes qui utilisent des prises pour échanger des données, sont écrites en C/C++ et je serais heureux si somneone pourrait me aider à utiliser des tampons de protocole afin d'échanger des données sous forme de:

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

J'ai essayé plusieurs façons, mais les données ne sont pas encore échangées correctement. Toute aide serait très apprécié

Merci pour votre aide,

+6

Toute raison pour laquelle c'est un wiki communautaire? – Goz

Répondre

11

Vous commencez par définir votre message dans un fichier .proto:

package foo; 

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

(Je suppose que le flotteur et le double sont en fait différentes variables ...)

Ensuite, vous compilez à l'aide protoc puis vous avez du code implémentant votre tampon.

Pour plus d'informations, voir: http://code.google.com/apis/protocolbuffers/docs/cpptutorial.html

+0

Merci pour votre réponse. Y at-il un tutoriel simple où un exemple est montré? merci encore, – make

+2

Suivez le lien que j'ai inclus - c'est un tutoriel qui couvre l'utilisation de tampons de protocole de C++. –

1

Est-ce les deux machines x86? Sinon, vous devez regarder pour les grandes différences endian et little endian. Il vaut également la peine de faire attention à l'emballage structuré. Passer le pointeur peut être problématique aussi parce que le pointeur est de différentes tailles sur différentes plates-formes. Tout est là trop peu d'informations dans votre message pour dire, pour certain, ce qui ne va pas ...

+0

les machines sont différentes. Unix est installé sur sun-blade et windows sur x86. Mais, j'ai lu que les tampons de protocole traitent des machines différentes et c'est pourquoi j'ai décidé de l'utiliser ... – make

0

La réponse réside dans l'endianess des données transmises, c'est quelque chose que vous devez considérer très attentivement et vérifier. Regardez here pour montrer ce que l'endianness peut faire et causer des erreurs dans le récepteur et l'expéditeur. Il n'y a pas une telle mesure parfaite de transfert de données en douceur, juste parce que les données envoyées à partir d'une boîte Unix garantit que les données sur la boîte de Windows seront dans le même ordre en termes de structure de mémoire pour les données. De plus, le rembourrage de la structure sur la boîte unix sera différent du rembourrage sur la boîte de fenêtre, cela se résume à la façon dont les commutateurs de ligne de commande sont utilisés, pensez à l'alignement de la structure.

+2

@ tommieb75: Est-ce correct? La recherche de tampons de protocole et d'endian montre une conversation Google Groupes qui indique que le logiciel gère correctement cette opération: http://groups.google.com/group/protobuf/browse_thread/thread/5dbcc1c028f8c8bf – quamrana

+0

@quamrana: Je ne peux pas répondre comme je le fais ne sait pas les tampons de protocole de google, désolé là-dessus. Vérifiez votre rembourrage de structure, le compilateur pourrait être rembourrage pour le rendre une taille égale. Vous pouvez vérifier cela en faisant un sizeof (struct snd_data) sur les deux extrémités pour voir ce que c'est? Si vous obtenez des tailles différentes, cela pourrait expliquer votre situation. – t0mm13b

3

Comment écrivez-vous vos messages à la prise? Protobufs n'est pas sensible à l'endian lui-même, mais protobufs ne définit pas non plus un mécanisme de transport - protobuf définit un mappage entre un message et sa forme sérialisée (qui est une séquence d'octets (8 bits)) et est transférer cette séquence d'octets à l'hôte distant.

Dans notre cas, nous définissons un protocole de transport très simple; nous écrivons d'abord la taille du message sous la forme d'un entier de 32 bits (big endian), puis le message lui-même. (Souvenez-vous également que les messages protobuf ne s'auto-identifient pas, ce qui signifie que vous devez savoir quel message vous envoyez.) Habituellement, un message d'emballage contient des champs facultatifs pour tous les messages que vous voulez envoyer. site Web et archives de liste de diffusion pour plus d'informations sur cette technique.)

+0

Oui. Pour plus de détails, voir [https://developers.google.com/protocol-buffers/docs/techniques#streaming](https://developers.google.com/protocol-buffers/docs/techniques#streaming]. Protobuf "n'est pas auto-délimitant." –

Questions connexes