J'essaie d'envoyer un objet via un canal nommé, entre deux processus, en C++ avec ifstream et ofstream. J'ai lu et essayé tant de choses mais ma recherche n'a abouti à rien.C++: Envoyer un objet via un canal nommé
Je bloque pendant la sérialisation de mon objet. Lorsque j'essaie de lancer et d'envoyer à mon tube nommé, je ne peux pas récupérer mon objet dans son état normal.
J'essaie quelque chose avec ce code, mais l'objet est pas plein après son passage dans le tube nommé:
#include <string.h>
#include <iostream>
#include <unistd.h>
#include <fstream>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
class Obj {
public:
std::string text1;
std::string text2;
};
int main() {
mkfifo("fifo", 0666);
if (fork() == 0) //Receiving Side
{
std::ifstream fifo("fifo", std::ofstream::binary);
//Re-make the object
Obj *tmp = new Obj();
char *b = new char[sizeof(*tmp)];
//Receive from named pipe
fifo >> b;
//Recover the object
memcpy(&*tmp, b, sizeof(*tmp));
//Display object content
std::cout << tmp->text1 << std::endl << tmp->text2 << std::endl;
//!\ Output = "Some \n" /!\\
fifo.close();
delete tmp;
delete[] b;
}
else //Sending Side
{
std::ofstream fifo("fifo", std::ofstream::binary);
//Create the object
Obj *struct_data = new Obj();
struct_data->text1 = "Some text";
struct_data->text2 = "Some text";
char *b = new char[sizeof(*struct_data)];
//Serialize the object
memcpy((void *)b, &*struct_data, sizeof(*struct_data));
//Send to named pipe
fifo << b;
fifo.close();
wait(NULL);
delete[] b;
}
//delete struct_data;
return (0);
}
Est-ce que quelqu'un pourrait me donner un pourboire ou en exemple?
Merci! :)
Montrez-nous le code de sérialisation. Le format d'octet est-il documenté? Si oui, veuillez nous montrer la documentation. Si non, documentez-le. Croyez-moi, cela vaut la peine de documenter n'importe quel protocole - idéalement avant de le coder. –
Quand vous dites "lancer et envoyer" ... êtes-vous en train de sérialiser, ou simplement d'essayer d'envoyer les octets bruts? Et à quoi ressemble ton objet? – Useless
Votre problème n'a probablement rien à voir avec les tuyaux (nommés ou non). Vous pouvez essayer d'écrire l'expéditeur sur stdout pendant que le lecteur reçoit l'objet de stdin et les connecter avec '|'. Économise beaucoup d'efforts pour installer les tuyaux et quoi d'autre. –