【问题标题】:Sending Int32 equal to 4, received as equal to 67108864发送 Int32 等于 4,接收等于 67108864
【发布时间】:2021-07-12 19:32:17
【问题描述】:

怎么回事,我在服务器上做这个:

var msg = Server.Api.CreateMessage();           
msg.Write(2);
msg.Write(FreshChunks.Count());
Server.Api.SendMessage(msg, peer.Connection, NetDeliveryMethod.ReliableUnordered);

然后在客户端它成功读取字节 = 2,然后开关路由到读取 Int32 (FreshChunks.Count) 的函数,该函数等于 4,但收到时等于 67108864。我尝试过使用 Int16-64 和 UInt16 -64,它们都没有计算出正确的值。

【问题讨论】:

  • 那个数字是0x04'00'00'00 好旧的字节排序问题。
  • 您可能正在寻找IPAddress.HostToNetworkOrderIPAddress.NetworkToHostOrder

标签: c# networking lidgren


【解决方案1】:

鉴于:

  • 在您使用msg.Write(2) 时,编译器会将2 读取为int (Int32)
  • 您提到您“成功读取了 byte = 2”

似乎正在发生以下选项之一:

  1. msg.Write 仅写入其中至少设置了一位 (=1) 的字节。 (节省空间)
  2. msg.Write 总是将给定的参数转换为一个字节。

当请求 4 个字节(Int32)时, 你得到了: 0x04 00 00 00。第一个字节正是您传递的 4。
似乎从msg.Read 询问的字节数超过了它的字节数(您请求了 4 个字节,但由于msg.Write 逻辑,它只有 1 个字节) 它执行以下操作之一:

  1. 用零附加剩余字节
  2. 继续阅读,在您的情况下,返回给您的消息元数据中有 3 个 0 字节。

为了解决您的问题,您应该阅读WriteRead 方法的文档并了解它们的行为方式。

【讨论】:

  • 非常感谢,如此不幸的愚蠢错误,我没有检查它是否确实以 2 作为一个字节,因为它仍然可以工作
  • 很高兴,我的朋友。不要对自己太苛刻。这似乎是一个非常合理的错误。我希望 API 返回它收到的默认行为。 API 设计者显然选择了内存优化作为默认行为,这使得像 ReadInt32 这样的 API 调用会根据发送的数字大小而有所不同。
猜你喜欢
  • 1970-01-01
  • 2014-02-19
  • 1970-01-01
  • 1970-01-01
  • 2018-04-12
  • 2018-07-13
  • 2011-03-23
  • 2016-07-28
  • 1970-01-01
相关资源
最近更新 更多