繁体   English   中英

C# 结构应该如何通过网络发送到 C++ 客户端?

[英]How should a C# struct be sent over the network to a C++ client?

我在获取通过 TCP 套接字发送到 C++ 客户端的 C# 结构字节以正确读取时遇到了一些麻烦。 这里是结构...

C#中的结构体

public struct TankBattleStateData
{
    public int playerID;
    public float currentHealth;

    public Vector3 position;
    public Vector3 forward;

    public Vector3 cannonForward;

    public int canFire;
    public int tacticalCount; 
}

C++ 结构体

struct TankBattleStateData
{
    int playerID;
    float currentHealth;

    float position[3];
    float forward[3];

    float cannonForward[3];

    int canFire;
    int tacticalCount;
};

传输过程如下...

  1. 使用System.Runtime.InteropServices.Marshal获取表示结构的 C# 字节数组
  2. 将字节数组送入 Socket.Send 以发送到 C++ 客户端
  3. 客户端在收到字节后,将收到的字节的 memcpy 存储到堆上的unsigned char数组中,如果需要,在复制之前调整大小
    • 有一些检查,例如验证读取的字节数,但没有特别强大的地方。
  4. 为了读取其内容,客户端将指向 char 数组的指针转换为TankBattleStateData *并将其取消引用以访问其字段。

我始终发现,最后一个字段tacticalCount在 C++ 客户端上与在 C# 客户端上的值不同。 例如,我将从服务器发送1并在客户端返回81742424

环境

操作系统:Windows 10 x64
服务器:C# w/.NET Framework 2.0 (Unity3D 5.3.2f1)
客户端:C++ 带 MSVC++14

我想知道什么

  1. 我究竟做错了什么? ;)
    • 更具体地说,我在客户端做错了什么? 我设置了一个C#客户端,它接收数据似乎没有问题,不像C++客户端。
  2. 是否有现有的图书馆可以让我的生活更轻松?

我遇到的一个小问题是 C# bool被编组为4 bytes而不是 1 byte,这是 MSVC++14 中 bool 的大小。 我想使用bool ,但为了减少可能出现的问题的数量,我现在使用int

[StructLayout(LayoutKind.Sequential)]添加到结构中,然后使用[FieldOffset]来布置字段以与 C++ 版本完全匹配。

您应该阅读的是数据结构的序列化和反序列化。 有多种协议、库和方法可用。 将原始数据发送到/从内存中发送可能会对字节序、文本字段和数组产生奇怪的影响。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM