微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Boost 序列化多态对象和命名管道:客户端-服务器

如何解决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 举报,一经查实,本站将立刻删除。