通过套接字发送带有vector的c++对象

Sending a c++ object with vector over socket

本文关键字:vector c++ 对象 套接字      更新时间:2023-10-16

我已经有相当长的一段时间,现在试图找到一个好方法序列化或发送状态对象通过tcp套接字。我的问题是我不会使用任何3。像boost.

我的状态对象包含多个对象。最重要的是,它有一些对象和对象的向量,但没有指针(例如。可能不需要深度复制,如果vector不需要的话)。

我的问题:因为我不能使用boost或任何其他库,什么是最好的方式来发送对象与对象通过套接字?我一直在想,我可能可以创建一个复制构造函数并将其发送到流,但我不太确定这样做的后果

为您的数据类型定义(反)序列化函数。

例如,如果你有这样的内容:

class MyClass
{
public: 
    int field_a;
    int field_b;
    std::string string;
    ...
};
typedef std::vector<MyClass> MyVector;

可以定义以下内容:

void write(int fd, const MyClass &arg)
{
    // either convert arg to byte array and write it, or write field by field
    // here we write it field by field
    write_int(fd, arg.field_a);
    write_int(fd, arg.field_b);
    write_string(fd, arg.string);
}
void write(int fd const MyVector &arg)
{
    size_t size = arg.size();
    ::write(fd, &size, sizeof(size)); // beware: machine-dependent code
    for (MyVector::const_iterator it = arg.begin(); it != arg.end(); it++)
    {
        write(*it);
    }
}

辅助功能:

void write_int(int fd, int arg)
{
    write(fd, &arg, sizeof(int));
}
void write_string(int fd, const std::string &str)
{
    size_t len = str.length();
    write(fd, &len, sizeof(len)); // string length go first
    write(fd, str.data(), len); // write string data
}

和阅读:

MyClass readMC(int fd)
{
    // read MyClass data from stream, parse it
    int f1, f2;
    std::string str;
    read_int(fd, f1);
    read_int(fd, f2);
    read_string(fd, str)
    return MyClass(f1, f2, str);
}
void read(int fd, MyVector &arg)
{
    size_t size;
    size_t i;
    read(fd, &size, sizeof(size)); // read number of elements;
    arg.reserve(size);
    for (i = 0; i < size; i++)
    {
        arg.push_back(readMC(fd));
    }
}

辅助功能:

void read_int(int fd, int &res);
{
    read(fd, &res, sizeof(res));
}
void read_string(int fd, std::string &string)
{
    size_t len;
    char *buf;
    read(fd, &len, sizeof(len));
    buf = new char[len];
    read(fd, buf, len);
    string.asssign(buf, len);
    delete []buf;
}