2012-04-08 3 views
-1

Dans le cadre de notre projet de fin de semestre, nous sommes tenus de mettre en œuvre un système de chat distribué. Le système doit être évolutif et robuste. Garder ces critères à l'esprit, je suis confus quant à la façon dont nous envoyons un objet vectoriel sur le socket.Sérialiser le vecteur en C++ pour envoyer via UDP Socket?

Étant donné que le vecteur est alloué dynamiquement, envoyer son objet en tant que tel ne fonctionnerait pas car la mémoire vers laquelle il pointe n'est pas copiée. Afin d'accomplir cette sérialisation serait la meilleure option. Mais, comme requis par notre projet, nous ne sommes pas supposés utiliser des bibliothèques tierces telles que Boost et Google Protocol Buffers.

Par conséquent pour sérialiser l'objet vectoriel et l'envoyer sur le réseau, je n'arrive pas à trouver un guide de démarrage expliquant comment procéder. Aussi existe-t-il d'autres alternatives que nous pouvons utiliser pour cela?

Le vecteur contient des chaînes (adresse IP: port) de chaque membre du groupe de discussion.

Toute aide serait géniale. Je vous remercie.

REMARQUE: Nous sommes tenus de faire fonctionner le client de discussion sur un cluster et je crois que pour rendre le système robuste et évolutif, nous devons également prendre en compte l'endianess.

+0

Rien de mal à stocker des données dans un vecteur, la copie du contenu devrait être rapide que le contenu doit être aligné dans la mémoire – EdChum

+1

Quel type contient le vecteur? Si c'est un type POD, et vous pouvez garantir que les machines des deux côtés utilisent la même endianness, l'emballage et l'alignement, alors vous pouvez vous contenter d'envoyer le contenu binaire brut. Si non, alors vous aurez besoin de quelque chose de plus sophistiqué. –

+0

Le vecteur contient des chaînes (adresse IP: port). Ceci est une table de membres indiquant quels sont les participants actifs dans le chat. Il doit donc être multidiffusé pour le groupe. –

Répondre

0

Si vous voulez une sérialisation binaire dans ce cas, vous devez implémenter la sérialisation pour 2 types - entier et chaîne. Entier peut être facilement écrit octet par octet, par coulée à carboniser puis déplacer:

// assuming 32 bit ints and 8 bit bytes 
int integer = 1337; 
unsigned char data[4]; 
for(int i = 0; i < 4; ++i) 
    data[i] = (unsigned char) (integer >> 8*i); 

Deserialize par somme et changement:

int integer = 0; 
for(int i = 3; i >= 0; ++i) 
{ 
    integer += data[i]; 
    integer <<= 8; 
} 

(je n'ai pas testé le code, donc trace par dans un débogueur et assurez-vous qu'il fait ce que je pense qu'il fait :))

Serialized chaîne serait sérialisée taille, puis les caractères sur le flux. Le vecteur serait alors une combinaison de ces deux dimensions du vecteur, puis des chaînes une par une.

Vous pouvez ajouter un mot magique et une somme de contrôle pour vous assurer que le client sait à quoi s'attendre et comment vérifier les données. Si vous voulez avoir vraiment envie, mettez en place votre propre support pour ASN.1 ou quelque chose comme ça. :)

+0

Merci, je pense qu'il n'y a que cette option avec moi. Je devrais penser à une sorte de format pour cela et ensuite envoyer les messages sur le réseau en utilisant UDP. –