9

我有一个问题问你。

我有这堂课:

`

#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);

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

4

3 回答 3

16

从字面意义上讲,不可能通过 TCP 连接发送对象。套接字只知道如何传输和接收字节流。所以你可以做的是通过 TCP 连接发送一系列字节,以这样一种方式格式化,即接收程序知道如何解释它们并创建一个与发送程序想要发送的对象相同的对象。

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

这里查看更多信息。

于 2013-08-29T17:11:03.783 回答
3

您可以使用序列化来做到这一点。这意味着将对象拉成碎片,以便您可以通过套接字发送这些元素。然后你需要在连接的另一端重建你的类。在 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);
};

扩展示例

于 2013-08-29T17:13:07.050 回答
0

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

我所做的是创建了一个具有类大小的字符数组(代表服务器端的内存块)。然后我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;

现在,您可以使用 this 作为指向对象的指针来对这些数据做任何您想做的事情。请记住不要尝试删除/释放此指针,因为此内存已分配给堆栈上的数组 blockOfData。

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

PS:如果您认为我所做的编码方式不佳,请告诉我原因。我不知道为什么这是一个坏主意(如果这样做实际上是个坏主意)。谢谢!!

于 2017-02-12T20:22:18.987 回答