C++如何通过套接字发送对象

C++ How can I send an object via socket?

本文关键字:对象 套接字 何通过 C++      更新时间:2023-10-16

我有个问题要问你。

我有这个班:

`

#define DIMBLOCK 128
#ifndef _BLOCCO_
#define _BLOCCO_
class blocco
{
    public:
        int ID;
        char* data;

        blocco(int id);
};
#endif


blocco::blocco(int id)
{
    ID = id;
    data = new char[DIMBLOCK];
}

`

并且该应用程序具有客户端和服务器。在我的服务器主体中,我以这种方式实例化了一个此类对象:blocco a(1);

之后,我使用套接字打开客户端和服务器之间的连接。问题是:如何将此对象从服务器发送到客户端,反之亦然?你能帮我吗?

从字面意义上讲,通过TCP连接发送对象是不可能的。套接字只知道如何传输和接收字节流。因此,您可以通过TCP连接发送一系列字节,其格式使接收程序知道如何解释这些字节,并创建一个与发送程序想要发送的对象相同的对象。

这个过程被称为序列化(以及接收端的反序列化)。序列化不是C++语言本身内置的,所以你需要一些代码来完成它。它可以手动完成,也可以使用XML,也可以通过谷歌的协议缓冲区,也可以将对象转换为人类可读的文本并发送文本,或者其他任何方式。

查看此处了解更多信息。

您可以使用序列化来完成此操作。这意味着将对象拉成碎片,这样您就可以通过套接字发送这些元素。然后你需要在连接的另一端重构你的类。在Qt中,有QDataStream类可用于提供这样的功能。结合QByteArray,您可以创建一个可以发送的数据包。想法很简单:

发件人:

QByteArray buffer;
QDataStream out(&buffer);
out << someData << someMoreData;

接收器:

QByteArray buffer;
QDataStream in(&buffer);
in >> someData >> someMoreData;

现在,您可能需要提供额外的构造函数:

class blocco
{
    public:
        blocco(QDataStream& in){
            // construct from QDataStream
        }
        //or
        blocco(int id, char* data){
            //from data
        }
        int ID;
        char* data;

        blocco(int id);
};

扩展示例

我不知道我会为此受到多少抨击,但我试过了,尽管我应该分享它。我是套接字编程的初学者,所以不要生气。

我所做的是创建了一个类大小的字符数组(表示服务器端的内存块)。然后我recv在客户端创建了内存块,并将该内存块类型化为对象,瞧!!我设法将一个对象从客户端发送到服务器。

样本代码:

blocco *data;
char blockOfData[sizeof(*data)];
if(recv(serverSocket, blockOfData, sizeof(*data), 0) == -1) {
    cerr << "Error while receiving!!" << endl;
    return 1;
}
data = (blocco *)blockOfData;

现在,您可以使用此数据作为对象的指针,对该数据执行任何操作。请记住,不要试图删除/释放此指针,因为此内存已分配给堆栈上的数组blockOfData。

如果你想实现这样的东西,希望这能有所帮助。

附言:如果你认为我所做的是糟糕的编码方式,请告诉我为什么。我不知道为什么这是一个如此糟糕的主意(如果这真的是一个糟糕的主意)。谢谢