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

时间:2016-04-17 02:34:59

标签: c# c++ network-programming marshalling

我在通过TCP套接字发送的C#struct的字节到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获取表示struct
  2. 的C#字节数组
  3. 将字节数组送入Socket.Send以发送到C ++客户端
  4. 客户端在收到字节后,会将收到的字节的memcpy发送到堆上的unsigned char数组,如果需要,可以在复制之前调整大小
    • 有一些检查,例如验证读取的字节数,但没有特别强大的地方。
  5. 要读取其内容,客户端将指向char数组的指针转换为TankBattleStateData *,并取消引用它以访问其字段。
  6. 我一致地发现,最后一个字段tacticalCount在C ++客户端上的值与在C#客户端上的值不同。例如,我将从服务器发送1并将81742424返回给客户端。

    环境

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

    我想知道什么

    1. 我做错了什么? ;)
      • 更具体地说,我在客户端做错了什么?我设置了一个C#客户端,与C ++客户端不同,它似乎没有问题接收数据。
    2. 现有的图书馆会让我的生活更轻松吗?
    3. 我遇到的一个打嗝是C#bool被编组为4 bytes,而不是1个字节,这是MSVC ++ 14中bool的大小。我想使用bool,但为了减少可能出现的问题,我现在正在使用int

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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