【问题标题】:Sending a structure trough send通过发送发送结构
【发布时间】:2018-04-22 13:12:09
【问题描述】:

首先,我想说标题不是问题。

我的问题是你为什么不能只发送结构的所有字节然后将其转换为该结构(假设你在两边都定义了结构,这是有道理的)。

谢谢!

编辑:这是我目前的结构:

    struct COMPUTER_INFO
    {
        const char* Name;
        int Brightness;
        int Volume;
    }

我在想你可以很容易地计算出所有这些的大小,然后将其发送到send()

【问题讨论】:

  • 这取决于:(a) 你的结构中有什么; (b) 如果接收计算机具有不同的架构(32 位/64 位、大端与小端等),接收计算机将如何理解发送的字节。请发布一个示例结构,以便我们有具体的答案。另请阅读如何发布minimal reproducible example
  • @RichardCritten 我已经编辑过了。 #KillzoneKid 好吧,我会删除第一个

标签: c++ server client winsock


【解决方案1】:

Name 是一个指针(包含一个地址),它只对您计算机上的程序有意义。如果您将此结构作为字节发送,则接收程序将只接收地址而不是构成名称的字符。接收到的地址也不会指向接收计算机内存中的有效位置。

BrightnessVolumeints - ints 没有固定大小,它们是计算机的“自然”字长(标准确实施加了一些限制)。所以发送和接收计算机上的sizeof(int) 可能不同。也可能存在编码差异,例如大端与小端。见:https://en.wikipedia.org/wiki/Endianness

【讨论】:

  • 我明白了。我使用 __int32 作为 int。此外,我可以获取 Name 的第一个元素的地址,然后只计算我将使用 strlen 得到的字符。那不行吗?
【解决方案2】:

一般来说你是对的。当然,您可以发送原始字节流。但是你希望接收者如何识别你的结构成员在这个字节流中的位置?特别是,您示例中的 char* 大小可变,因此这是不可能的。 我推荐使用Boost serialization 包。你可以找到详细的教程here。该包将负责“序列化”(将您的对象打包成字节流)和“反序列化”(从字节流构造您的对象)。它对于几乎所有 STL 容器都非常方便,并且可以轻松扩展为自定义类型。

【讨论】:

  • 好吧,比方说,在你的程序中填充 PEB 结构怎么样?你得到第一个元素的地址,然后用 PEB 结构进行转换。一切都到位,因为它们的大小相同。对吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-22
  • 2011-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多