2010-10-15 7 views
0

Je faisais des fichiers IO dans un projet sur lequel je travaillais actuellement et jusqu'ici j'ai lu dans un bloc entier de données en utilisant le rapide et le suivant méthode pratique:C/C++ fiabilité de memcpy sizeof (typname) application croisée sur TCP

struct Header { ... }; 
class Data { ... }; 
// note that I have not used compiler directives to pack/align/order bytes 
// partly because I don't know how to. 

Header _header; 
Data _data; 
std::ifstream fin(filename); 
fin.read((char*)&_header, sizeof(Header)); 
fin.read((char*)&_data, sizeof(Data)); 
fin.close(); 

Ma question est de savoir s'il est autorisé à prendre les octets sont alignés et de l'ordre de la même manière pour chaque compilateur et tout autre ordinateur? Par exemple, si je prends la structure d'en-tête et compile un programme client, sur Linux, et un programme serveur sur Windows. Les octets sont-ils dans le même ordre de sorte qu'il n'y aura pas de problèmes de réception et d'envoi dans les deux sens?

Répondre

6

Non, ce n'est pas du tout garanti. Il existe un ordre d'octets réseau spécifique et autant que je sache, WinAPI et POSIX fournissent des fonctions de traduction locale vers réseau. En outre, l'alignement que vous pouvez contrôler avec les directives du compilateur. Mais vous devez explicitement prendre soin de ces deux choses.

2

Eh bien, dans le cas général, bien sûr, il ne l'est pas. Certaines plates-formes ont des ordres d'octets différents (endianness) que d'autres. En outre, sur les plates-formes 64 bits, certains types d'entiers communs (tels que size_t) peuvent avoir des tailles différentes de celles attendues. Toutes les garanties de C sont sizeof (long)> = sizeof (short)> = sizeof (char), donc il pourrait même y avoir une plate-forme perverse là où long, short et char sont tous de la même taille.

De manière réaliste, si vos deux plates-formes sont Intel et que vos deux OS sont en 32 bits (ou les deux sont en 64 bits), vous êtes probablement OK. Cependant, il serait préférable de se pencher sur les directives de votre compilateur pour l'alignement des clous et la commande un peu mieux. Malheureusement, C et C++ ne sont pas (encore) presque aussi bons qu'Ada. Vous pouvez utiliser un codage standard comme ASN.1 pour résoudre ce problème, mais ASN.1 est un remède qui est presque toujours pire que la maladie.

-3

Vous utilisez l'opérateur sizeof. Donc, il devrait être sûr, au moins au niveau de la source compatible.

4

Ceci est un problème résolu, évitez de réinventer cette roue. XML est la lingua franca des machines qui se parlent sur Internet. C'est bavard, si la bande passante est un problème, alors cherchez le protobuf de Google. Il a beaucoup de liaisons de langage, C++ est bien supporté.

+1

Il est également intéressant de mentionner JSON. –

+0

Bien que ma plate-forme de test soit un autre PC, ma plate-forme cible est un microprocesseur. Je ne sais pas si ça va marcher ... probablement pas? – Jake