如何解决Boost 序列化多态对象和命名管道:客户端-服务器
我们需要使用 unix 命名管道:mkfifo 编写客户端-服务器架构。我们考虑编写一个名为 Packet 的抽象基类,所有的数据包都将从它继承。为了将这些数据包发送到服务器,我们想使用序列化,但是我们遇到了很多问题并且缺乏有关它的信息阻止了我们这样做。我有很多问题:如何通过管道发送对象?以及如何使用基类指针反序列化所有数据包? 这是数据包的代码:Packet.hpp
#ifndef _PACKET_H_
#define _PACKET_H_
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <iostream>
#include <string.h>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
class Packet
{
int pid = getpid();
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar,const unsigned int version)
{
ar & pid;
}
public:
virtual void execute() =0;
virtual ~Packet () noexcept = default;
};
class LoginPacket: public Packet
{
const std::string _username;
const std::string _password;
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar,const unsigned int version)
{
ar & boost::serialization::base_object<Packet>(*this);
ar & _username;
ar & _password;
}
public:
LoginPacket(std::string user,std::string pwd):_username(user),_password(pwd){};
void execute() override {std::cout << _username <<std::endl<<_password<<std::endl;};
};
BOOST_CLASS_EXPORT(LoginPacket);
#endif
这里是服务器和客户端的代码:
#ifndef _SERVER_H_
#define _SERVER_H_
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <fcntl.h>
#include <iostream>
#include <fstream>
#include <string.h>
#include "../Packet.hpp"
class Server
{
constexpr static const char* _client_to_server = "/tmp/client_to_server";
constexpr static const char* _server_to_client = "/tmp/server_to_client";
public:
constexpr Server() noexcept = default;
void launch();
}
;
void Server::launch()
{
int clientserver,serverclient;
char buffer[256];
mkfifo(_client_to_server,0666);
mkfifo(_server_to_client,0666);
while(1)
{
std::ifstream client_server(_client_to_server);
Packet* bonjour;
boost::archive::text_iarchive ia(client_server);
ia >>bonjour;
bonjour->execute();
}
close(clientserver);
close(serverclient);
}
#endif
#ifndef _CLIENT_H_
#define _CLIENT_H_
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <fcntl.h>
#include <iostream>
#include <string.h>
#include <fstream>
#include "../Packet.hpp"
class Client
{
constexpr static const char* _client_to_server = "/tmp/client_to_server";
constexpr static const char* _server_to_client = "/tmp/server_to_client";
public:
constexpr Client() noexcept = default;
void connect();
}
;
void Client::connect()
{
std::ofstream write(_client_to_server);
const LoginPacket objet= LoginPacket("user","salut");
boost::archive::text_oarchive oa(write);
oa<<objet;
}
如果代码很糟糕,我很抱歉,但这是我第一次使用 boost... 预先感谢您的好意
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。