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

时间:2013-08-29 16:59:08

标签: c++ sockets tcp send recv

我有一个问题。

我有这堂课:

`

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

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

3 个答案:

答案 0 :(得分:6)

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

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

查看here了解更多信息。

答案 1 :(得分:2)

您可以使用serialization执行此操作。这意味着将对象拉成碎片,以便您可以通过套接字发送这些元素。然后你需要在连接的另一端重建你的类。在Qt中,有QDataStream class可用,提供此类功能。结合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);
};

extended example

答案 2 :(得分: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;

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

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

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