gpt4 book ai didi

c++ - 如何在 C++ 中通过套接字从客户端向服务器发送结构体列表(序列化问题)?

转载 作者:行者123 更新时间:2023-11-30 17:32:33 25 4
gpt4 key购买 nike

我有两个结构,第一个被定义为第二个结构中的列表:

struct SType{
int Num;
char Word[20];
char sugg[20];
};


struct DataPktType
{
list<SType> MyList;
char filename[MAX_SIZE];
int numslaves;
};

我知道有 boost 和 google 库用于序列化,但我想通过一个特殊的服务器发送这些数据,该服务器不允许安装 boost 等。
所以我必须手动完成。我在这个网站上看到并测试了一个简单的答案来手动序列化和反序列化https://stackoverflow.com/a/20838004/1679519 。正如我测试的那样,它以其自身的结构运行良好。然而,它是一个简单的结构,正如您所看到的,我在第二个结构中有一个列表。列表有时会有不同的大小。
如果有人可以展示一些示例或提示,我将不胜感激。目前我以这种方式通过套接字发送结构,这导致了段错误!

// Write and read a message to/from the server 
write(Sockfd, (char*)&DataPkt, sizeof(DataPktType));
read(Sockfd, (char*)&recDataPkt, sizeof(DataPktType));

最佳答案

我已经“手动”完成了类似于我怀疑您想要做的事情。

对于非简单类型 (DataPktType),您可以考虑以下粗略轮廓(如果只是为了帮助您入门)。

首先,我向所有需要参与的类添加了 2 个虚拟方法 - 在我的例子中,我们将它们称为存储和恢复。这些方法只处理它们自己类的数据属性。

从某种意义上说,restore() 是 store() 的逆函数。

struct SType{
int Num;
char Word[20];
char sugg[20];

virtual void store(ostream& os);
virtual void restore(istream& is);
};


struct DataPktType
{
list<SType> MyList;
char filename[MAX_SIZE];
int numslaves;

virtual void store(ostream& os);
virtual void restore(istream& is);
};

因此,DataPktType.store() 可能会将每个 POD 数据属性传输到 ostream 中:

DataPktType::store(ostream& os)
{
os << MyList.size(); // gotta know how many to extract later

for (auto it = myList.begin(); myList.end(); it++)
{
it->store(os); // tell the SType to store itself at this point in the stream
}

os << filename;
os << numslaves;
}

那么,“逆”可能类似于

DataPktType::restore(istream& is)
{
size_t listSize = 0;
is >> listSize;
// input error checks

for(size_t i=0; i<listSize; ++i)
{
SType listItem;

listItem.restore(is); // assumes the list item contents are 'next' in the file

MyList.push_back(listItem); // I don't use std::list often,
// there seems to be several choices for adding to a list
}

is >> filename;
is >> numslaves;
}

这些是我认为你需要做的事情。

注意没有指针进入流。

请注意,对称性并不完美,但您必须弄清楚如何处理每个 Action 。

在我的努力中,我相信我一路上添加了一些简单的检查......

此外,我的团队在第一次实现中使用了文本。作为人类,这将更容易调试,并且您可以使用编辑器来调试“对称”问题。

此外,您可能会发现文本 I/O 性能足够,因此将其保留为文本。

我们的截止日期很紧,最终选择了二进制 I/O。但我们保留文本 i/o 只是为了测试。

祝你好运。

PS - 我们最终为存储/恢复的内容添加了一个“版本”号,以支持项目代码演变过程中的结构更改。

关于c++ - 如何在 C++ 中通过套接字从客户端向服务器发送结构体列表(序列化问题)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24088767/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com