【发布时间】:2023-04-08 17:45:01
【问题描述】:
我在获取通过 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;
};
传输过程如下...
- 使用
System.Runtime.InteropServices.Marshal获取表示结构的C# 字节数组 - 将字节数组输入 Socket.Send 以发送到 C++ 客户端
- 客户端在收到字节后,将对收到的字节进行 memcpy 到堆上的
unsigned char数组,如果需要,在复制之前调整大小- 有一些检查,例如验证读取的字节数,但没有什么特别强大的地方。
- 为了读取其内容,客户端将指向 char 数组的指针转换为
TankBattleStateData *并取消引用以访问其字段。
我始终发现,最后一个字段tacticalCount 在 C++ 客户端上的值与在 C# 客户端上的值不同。例如,我将从服务器发送1,然后在客户端返回81742424。
环境
操作系统:Windows 10 x64
服务器:带有 .NET Framework 2.0 的 C# (Unity3D 5.3.2f1)
客户端:带 MSVC++14 的 C++
我想知道的
- 我做错了什么? ;)
- 更具体地说,我在客户端上做错了什么?我设置了一个 C# 客户端,它接收数据似乎没有问题,不像 C++ 客户端。
- 是否有现有的库可以让我的生活更轻松?
我遇到的一个问题是 C# bool 被编组为 4 bytes,而不是 1 字节,这是 MSVC++14 中布尔值的大小。我想使用bool,但为了减少可能出现的问题,我现在使用int。
【问题讨论】:
-
你的 C++
ints 有多大?你确定它们不是 16 位的吗? -
关于 (2),您可以查看像 Google Protocol Buffers 或 MessagePack 这样的二进制序列化库,以独立于平台的方式为您执行此操作。
-
@SLaks 虽然我的问题已经解决,但根据
sizeof(int),我的 C++ints 是 4 字节,所以这让我相信它们是 32 位的。 (再次感谢!)
标签: c# c++ network-programming marshalling