我一直在努力将ENet包装成一套易于使用的功能,现在已经有几个星期了,而且似乎有点问题。
我有一个std :: stringstream,我正在尝试使用ENet将内容发送到远程计算机,然后在远程计算机上重建std :: stringstream。
我需要使用std :: stringstream的原因是因为我使用需要流的Cereal Serialization Library将数据序列化。
在Azoth的帮助下,他发现我需要使用std :: istringstream和std :: ostringstream。以前我只使用导致异常的std :: stringstream。
但是现在在palm_binary.hpp第156行的谷歌中抛出异常:
throw Exception("Failed to read " + std::to_string(size) + " bytes from input stream! Read " + std::to_string(readSize));
这就是我正在做的事情:
void Send(ENetHost* Host)
{
std::ostringstream SData;
{
cereal::PortableBinaryOutputArchive Archive(SData);
Archive(PacketData);
}
std::string Out = SData.str();
ENetPacket* Packet = enet_packet_create(Out.c_str(), Out.size(), ENET_PACKET_FLAG_RELIABLE);
enet_host_broadcast(Host, 0, Packet);
}
构建谷物便携式二进制数据档案以保存单个矢量。 使用ENet将std :: ostringstream发送到主机。
这部分似乎工作正常,我可以在之前和之后打印信息,它看起来是相同的,虽然有一些奇怪的符号,但它们在两端都打印出来。
现在在主机上使用我们收到的数据创建了一个std :: istringstream。
NetPacket(enet_uint8 const* Data)
{
std::istringstream SData(reinterpret_cast<char const*>(Data));
{
cereal::PortableBinaryInputArchive Archive(SData);
Archive(PacketData);
}
}
此时我收到了行中的异常:
Archive(PacketData)
我感觉数据在通过ENet发送时以某种方式被更改和/或我没有正确地从std :: ostringstream中提取数据和/或没有将数据恢复正确地进入std :: istringstream。
非常感谢您的时间,我非常感谢。
答案 0 :(得分:3)
免责声明:我不熟悉enet。
您收到此错误是因为您在收到数据包后未正确构建std::stringstream
。发送/接收对应该类似于:
my_send_function()
{
std::ostringstream os;
{
cereal::PortableBinaryOutputArchive ar(os);
ar( whatever_needs_to_be_serialized );
} // the binary archives will flush their output
// immediately, but it's better to
// use cereal archives in an RAII matter all the time
std::string data = os.str();
create_packet(data.c_str(), data.size());
// send out
}
然后在接收端,这样的事情:
my_receive_function( uint8_t const * data ) // data came from some packet
{
MyDataType d;
std::istringstream is(reinterpet_cast<char const *>(data));
// this is safe to do since we generated the data using c_str(), which added
// a null terminator to the data
{
cereal::PortableBinaryInputArchive ar(is);
ar( d );
}
}
这里的基本思想是:使用cereal和一些ostringstream来生成一个字符串(实际上只是一个字节数组),通过网络发送这些原始字节,将它们拉入istringstream,然后对其进行解析。< / p>