J'ai des difficultés à trouver la bonne façon d'utiliser boost sérialisation/asio pour envoyer des objets sur le réseau. La classe message
est aussi simple que possible. Ce n'est pas C++ sympa ni adapté à mes besoins, je viens de rester simple temporairement pour tester ASIO/ser:Échec de la sérialisation des données binaires en boost avec l'erreur `signature invalide '
class message {
friend class boost::serialization::access;
public:
message(){}
int type;
int sender;
int assignment;
int nogood;
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
ar & type;
ar & sender;
ar & assignment;
ar & nogood;
}
};
Du côté client lorsque l'agent décide d'envoyer un message, envoie au serveur via sa connexion tcp:
message m;
// do something to generate message
boost::asio::streambuf bufx;
std::ostream os(&bufx);
boost::archive::binary_oarchive ar(os);
ar & m;
boost::asio::write(socket, bufx);
code côté serveur:
boost::asio::streambuf bufx;
std::istream is(&bufx);
boost::archive::binary_iarchive ia(is); // <--- Exception: invalid signature
size_t rcx = asio::read(socket,bufx);
message m;
ia >> m;
Tanks pour votre réponse. J'ai déplacé 'read()' immédiatement après la définition de 'streambuf'. Maintenant, read jette une exception avec ce message: 'End of file' –
Je crois que c'est prévu. 'read()' bloque jusqu'à ce que le tampon soit plein ou qu'une erreur survienne. Dans ce cas, "l'erreur" est que le socket s'est fermé. Vous pouvez utiliser la commande 'read()' [overload] (http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/reference/read/overload6.html) qui renvoie le statut via un argument de référence 'boost :: system :: error_code' au lieu de lancer une erreur. – rhashimoto