首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用StringStream从谷物发送二进制数据的ENet

用StringStream从谷物发送二进制数据的ENet
EN

Stack Overflow用户
提问于 2014-04-02 00:46:13
回答 1查看 3.2K关注 0票数 3

几个星期以来,我一直致力于将ENet包装成一组易于使用的函数,似乎有点问题。

我有一个std::std流,并试图使用ENet将内容发送到远程计算机,然后在远程机器上重构std::std流。

我需要使用std::stream流的原因是,我使用需要流的序列化数据。

在Azoth的帮助下,他发现我需要使用std::ostringstream和std::ostringstream流。以前,我只使用std::causing流,这会导致异常。

但是,现在在portable_binary.hpp第156行的Cereal中抛出了一个异常:

代码语言:javascript
复制
throw Exception("Failed to read " + std::to_string(size) + " bytes from input stream! Read " + std::to_string(readSize));

我正在做的事情是:

代码语言:javascript
复制
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::off流发送到主机。

这部分似乎工作正常,我可以打印出信息前后,它似乎是相同的,虽然一些奇怪的符号,但他们打印出相同的两端。

现在,在主机上使用我们接收到的数据创建了一个std::istringstream。

代码语言:javascript
复制
NetPacket(enet_uint8 const* Data)
{
    std::istringstream SData(reinterpret_cast<char const*>(Data));
    {
        cereal::PortableBinaryInputArchive Archive(SData);
        Archive(PacketData);
    }
}

此时,我收到一行异常:

代码语言:javascript
复制
Archive(PacketData)

当数据通过ENet发送时,我有一种感觉,并且/或我没有正确地从std::putting流中提取数据和/或没有正确地将数据放回std::istringstream中。

非常感谢您的时间,我非常感谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-05 05:57:44

免责声明:我不熟悉enet。

您将收到此错误,因为您在收到数据包时没有正确地构造std::stringstream。发送/接收对应该类似于:

代码语言:javascript
复制
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
}

然后在接收端,像这样的:

代码语言:javascript
复制
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 );
  }
}

这里的基本思想是:使用谷物和一些字符串来生成一个字符串(实际上是一个字节数组),通过网络发送那些原始字节,将它们拖到一个string中,然后让谷物解析它。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22799551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档