C++如何通过套接字发送对象
C++ How can I send an object via socket?
我有个问题要问你。
我有这个班:
`
#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。
如果你想实现这样的东西,希望这能有所帮助。
附言:如果你认为我所做的是糟糕的编码方式,请告诉我为什么。我不知道为什么这是一个如此糟糕的主意(如果这真的是一个糟糕的主意)。谢谢
- 在C ++ ASIO中,如何为HTTP或HTTPS创建相同的套接字对象(接口/抽象问题?
- 通过 c++ 中的 udp 套接字将派生类对象从一个进程发送到另一个进程
- 为什么信号连接会使套接字客户端对象失效?
- 同一提升 TCP 套接字对象上的多个连接
- 无法解析在 0MQ 套接字中收到的 Jsoncpp 对象
- 通过套接字将 Mat 对象从 c++ 发送到 Java
- 无法将套接字对象移动到std::vector中
- 提升同一对象上的异步套接字和线程池io_service
- 从文件描述符实例化套接字对象的非侵入性方法
- 包含互斥对象C++时出现套接字问题
- C++面向对象的客户端套接字应用程序设计
- C++如何通过套接字发送对象
- 从套接字对象获取fd或句柄
- 套接字上的流对象
- 通过套接字将对象(XML输出或任何c++对象类型)从服务器传递到客户机,反之亦然
- 通过套接字发送带有vector的c++对象
- 向给定remote_endpoint对象和套接字的客户端发送数据包
- 序列化c++对象,通过套接字发送给Python -最好的方法
- 带超时的多线程面向对象套接字代码
- 通过ZeroMQ以字符串形式接收对象,然后通过另一个套接字以零拷贝发送对象的正确方法是什么