C# 如何通过网络将C结构发送到C++;客户 我遇到了一些麻烦,将通过TCP套接字发送的C++结构的字节传递给C++客户端,以便正确读取。这是结构图
C#中的结构 C++中的StructC# 如何通过网络将C结构发送到C++;客户 我遇到了一些麻烦,将通过TCP套接字发送的C++结构的字节传递给C++客户端,以便正确读取。这是结构图,c#,c++,network-programming,marshalling,C#,C++,Network Programming,Marshalling,C#中的结构 C++中的Struct struct TankBattleStateData { int playerID; float currentHealth; float position[3]; float forward[3]; float cannonForward[3]; int canFire; int tacticalCount; }; 传输过程如下 使用System.Runtime.InteropServices
struct TankBattleStateData
{
int playerID;
float currentHealth;
float position[3];
float forward[3];
float cannonForward[3];
int canFire;
int tacticalCount;
};
传输过程如下
System.Runtime.InteropServices.Marshal
获取表示结构的C#字节数组无符号字符
数组中,如果需要,在复制之前会调整数组的大小
- 有一些检查,比如验证读取的字节数,但没有特别可靠的检查
TankBattleStateData*
,并取消对它的引用以访问其字段1
,然后在客户端返回81742424
环境
操作系统:Windows 10 x64服务器:C#w/.NET Framework 2.0(Unity3D 5.3.2f1)
客户端:C++ W/MSVC++ 14版/P> 我想知道的
- 更具体地说,我在客户身上做错了什么?我建立了一个C客户端,它看起来没有问题接收数据,不像C++客户端。
我遇到的一个问题是,C#
bool
被封送为,而不是1字节,这是MSVC++14中bool的大小。我想使用bool
,但为了减少可能出现的问题,我现在使用int
。将[StructLayout(LayoutKind.Sequential)]
添加到结构中,然后使用[FieldOffset]< /代码>以布局字段与C++版本完全匹配。 您应该了解的是数据结构的序列化和反序列化。有多种可用的协议、库和方法。将数据发送到内存中可能会对Endiad、文本字段和数组有奇怪的含义。您的C++ >代码> int <代码> s是什么大小?你确定它们不是16位吗?(关于2),你可以查看像谷歌协议缓冲区或MessagePack这样的二进制序列化库,这样做是为了独立于平台C++。这让我相信它们是32位的。(再次感谢!)似乎我只能使用。使用这两个属性都会导致一个错误,即,FieldOffset属性只能放置在使用StructLayout(LayoutKind.Explicit)标记的类型的成员上。
编辑:抱歉,没有意识到按ENTER键会提交我的评论。我还没写完或者测试完这两个。给我一秒钟…@terrehbyte:你说得对;我的意思是明确的。(除非Sequential
匹配,在这种情况下,您可以使用该选项)
struct TankBattleStateData
{
int playerID;
float currentHealth;
float position[3];
float forward[3];
float cannonForward[3];
int canFire;
int tacticalCount;
};